From eecebe7ef5890dcb6fa83d62740d7dbcb43ff737 Mon Sep 17 00:00:00 2001 From: Mortdecai Date: Sat, 18 Apr 2026 12:24:48 -0400 Subject: [PATCH] docs: add canonical tooling corpus (147 files) from Google/HF/frameworks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five-lane parallel research pass. Each subdir under tooling/ has its own README indexing downloaded files with verified upstream sources. - google-official/: deepmind-gemma JAX examples, gemma_pytorch scripts, gemma.cpp API server docs, google-gemma/cookbook notebooks, ai.google.dev HTML snapshots, Gemma 3 tech report - huggingface/: 8 gemma-4-* model cards, chat-template .jinja files, tokenizer_config.json, transformers gemma4/ source, launch blog posts, official HF Spaces app.py - inference-frameworks/: vLLM/llama.cpp/MLX/Keras-hub/TGI/Gemini API/Vertex AI comparison, run_commands.sh with 8 working launches, 9 code snippets - gemma-family/: 12 per-variant briefs (ShieldGemma 2, CodeGemma, PaliGemma 2, Recurrent/Data/Med/TxGemma, Embedding/Translate/Function/Dolphin/SignGemma) - fine-tuning/: Unsloth Gemma 4 notebooks, Axolotl YAMLs (incl 26B-A4B MoE), TRL scripts, Google cookbook fine-tune notebooks, recipe-recommendation.md Findings that update earlier CORPUS_* docs are flagged in tooling/README.md (not applied) — notably the new <|turn>/ prompt format, gemma_pytorch abandonment, gemma.cpp Gemini-API server, transformers AutoModelForMultimodalLM, FA2 head_dim=512 break, 26B-A4B MoE quantization rules, no Gemma 4 tech report PDF yet, no Gemma-4-generation specialized siblings yet. Pre-commit secrets hook bypassed per user authorization — flagged "secrets" are base64 notebook cell outputs and example Ed25519 keys in the HDP agentic-security demo, not real credentials. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 1 + tooling/README.md | 50 + tooling/fine-tuning/README.md | 281 + .../axolotl/26b-a4b-moe-qlora.yaml | 93 + .../fine-tuning/axolotl/31b-qlora-flex.yaml | 71 + tooling/fine-tuning/axolotl/31b-qlora.yaml | 69 + tooling/fine-tuning/axolotl/README.md | 60 + .../fine-tuning/axolotl/e2b-vision-lora.yaml | 62 + .../Gemma_4_HDP_Agentic_Security.ipynb | 526 + .../google-cookbook/Gemma_4_HDP_README.md | 75 + .../function-calling-gemma4.ipynb | 1001 ++ .../huggingface_text_finetune_qlora.ipynb | 1119 ++ .../huggingface_text_full_finetune.ipynb | 937 ++ .../huggingface_vision_finetune_qlora.ipynb | 980 ++ .../google-cookbook/lora_tuning.ipynb | 789 + .../Gemma4_(E2B)-Multimodal.ipynb | 595 + .../fine-tuning/huggingface-recipes/README.md | 195 + .../huggingface-recipes/carla_vlm_gemma.py | 302 + .../huggingface-recipes/hf-blog-gemma4.md | 764 + .../ollama-llamacpp/ollama-import-lora.md | 53 + tooling/fine-tuning/recipe-recommendation.md | 190 + tooling/fine-tuning/trl/dpo.py | 17 + tooling/fine-tuning/trl/grpo_agent.py | 320 + tooling/fine-tuning/trl/grpo_vlm.py | 157 + tooling/fine-tuning/trl/sft.py | 17 + tooling/fine-tuning/trl/sft_gemma3.py | 69 + .../trl/sft_tiny_aya_tool_calling.py | 164 + tooling/fine-tuning/trl/sft_vlm.py | 117 + tooling/fine-tuning/trl/sft_vlm_gemma3.py | 189 + tooling/fine-tuning/trl/trl_scripts_sft.py | 156 + .../unsloth/docs/unsloth-README.md | 250 + .../unsloth/kaggle/Gemma4_(31B)-Text.ipynb | 8781 ++++++++++++ .../unsloth/kaggle/Gemma4_(E4B)-Text.ipynb | 8241 +++++++++++ .../notebooks/Gemma4_(26B_A4B)-Text.ipynb | 7723 ++++++++++ .../notebooks/Gemma4_(26B_A4B)-Vision.ipynb | 6426 +++++++++ .../unsloth/notebooks/Gemma4_(31B)-Text.ipynb | 7707 ++++++++++ .../notebooks/Gemma4_(31B)-Vision.ipynb | 6404 +++++++++ .../notebooks/Gemma4_(E2B)-Audio.ipynb | 5745 ++++++++ .../unsloth/notebooks/Gemma4_(E2B)-Text.ipynb | 7119 +++++++++ .../notebooks/Gemma4_(E2B)-Vision.ipynb | 5673 ++++++++ .../unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb | 5531 +++++++ ...2B)_Reinforcement_Learning_2048_Game.ipynb | 11898 ++++++++++++++++ ...)_Reinforcement_Learning_Sudoku_Game.ipynb | 10738 ++++++++++++++ .../notebooks/Gemma4_(E4B)-Audio.ipynb | 5742 ++++++++ .../unsloth/notebooks/Gemma4_(E4B)-Text.ipynb | 7100 +++++++++ .../notebooks/Gemma4_(E4B)-Vision.ipynb | 5679 ++++++++ .../python_scripts/Gemma4_(26B_A4B)-Text.py | 512 + .../python_scripts/Gemma4_(26B_A4B)-Vision.py | 448 + .../python_scripts/Gemma4_(31B)-Text.py | 513 + .../python_scripts/Gemma4_(31B)-Vision.py | 448 + .../python_scripts/Gemma4_(E2B)-Audio.py | 478 + .../python_scripts/Gemma4_(E2B)-Text.py | 556 + .../python_scripts/Gemma4_(E2B)-Vision.py | 448 + .../python_scripts/Gemma4_(E2B)_GRPO.py | 911 ++ ..._(E2B)_Reinforcement_Learning_2048_Game.py | 913 ++ ...E2B)_Reinforcement_Learning_Sudoku_Game.py | 897 ++ .../python_scripts/Gemma4_(E4B)-Audio.py | 478 + .../python_scripts/Gemma4_(E4B)-Text.py | 557 + .../python_scripts/Gemma4_(E4B)-Vision.py | 448 + tooling/gemma-family/codegemma.md | 88 + tooling/gemma-family/datagemma.md | 76 + tooling/gemma-family/dolphingemma.md | 44 + tooling/gemma-family/embeddinggemma.md | 93 + tooling/gemma-family/index.md | 55 + tooling/gemma-family/medgemma.md | 72 + tooling/gemma-family/other-variants.md | 74 + tooling/gemma-family/paligemma.md | 80 + tooling/gemma-family/recurrentgemma.md | 67 + tooling/gemma-family/shieldgemma.md | 89 + tooling/gemma-family/signgemma.md | 43 + tooling/gemma-family/translategemma.md | 105 + tooling/gemma-family/txgemma.md | 63 + tooling/google-official/README.md | 226 + tooling/google-official/cookbook/README.md | 80 + .../apps_Gemma4_HDP_AgenticSecurity.ipynb | 526 + .../apps_Gemma4_HDP_AgenticSecurity_README.md | 75 + .../apps_Gemma4_HDP_hdp_middleware.py | 390 + .../cookbook/docs_gemma_chat.ipynb | 1008 ++ .../tutorials_RAG_EmbeddingGemma.ipynb | 925 ++ .../google-official/deepmind-gemma/README.md | 99 + .../deepmind-gemma/colab_sampling.ipynb | 547 + .../deepmind-gemma/colab_tool_use.ipynb | 568 + .../deepmind-gemma/example_classification.py | 130 + .../deepmind-gemma/example_dpo.py | 122 + .../deepmind-gemma/example_lora.py | 154 + .../deepmind-gemma/example_multimodal.py | 164 + .../deepmind-gemma/example_sharding.py | 133 + .../docs/ai-google-dev_core.html | 4739 ++++++ .../docs/ai-google-dev_formatting.html | 4632 ++++++ ...ai-google-dev_function_calling_gemma4.html | 5193 +++++++ .../docs/ai-google-dev_model_card_4.html | 5283 +++++++ ...i-google-dev_prompt_formatting_gemma4.html | 4873 +++++++ .../docs/blog_announcement.html | 7466 ++++++++++ .../gemma-cpp/API_SERVER_README.md | 250 + tooling/google-official/gemma-cpp/README.md | 532 + .../gemma-cpp/examples_README.md | 7 + .../google-official/gemma-pytorch/README.md | 186 + tooling/google-official/gemma-pytorch/run.py | 107 + .../gemma-pytorch/run_multimodal.py | 197 + .../google-official/gemma-pytorch/run_xla.py | 267 + .../tech-report/Gemma3Report.pdf | Bin 0 -> 3699196 bytes tooling/huggingface/README.md | 161 + tooling/huggingface/blog/gemma-peft-blog.md | 207 + tooling/huggingface/blog/gemma4-blog.md | 764 + .../model-cards/gemma-4-26B-A4B-README.md | 514 + .../model-cards/gemma-4-26B-A4B-it-README.md | 513 + .../model-cards/gemma-4-31B-README.md | 513 + .../model-cards/gemma-4-31B-it-README.md | 513 + .../gemma-4-31B-it-chat_template.jinja | 347 + .../gemma-4-31B-it-tokenizer_config.json | 74 + .../model-cards/gemma-4-E2B-README.md | 516 + .../model-cards/gemma-4-E2B-it-README.md | 513 + .../model-cards/gemma-4-E4B-README.md | 513 + .../model-cards/gemma-4-E4B-it-README.md | 515 + .../gemma-4-E4B-it-chat_template.jinja | 344 + .../gemma-4-E4B-it-tokenizer_config.json | 74 + .../Gemma4_E2B-Multimodal-extracted.py | 389 + .../notebooks/Gemma4_E2B-Multimodal.ipynb | 595 + .../recipes/scripts/carla_vlm_gemma.py | 302 + .../recipes/scripts/ft_gemma3n_audio_vt.py | 184 + .../recipes/scripts/ft_gemma3n_image_trl.py | 352 + .../recipes/scripts/ft_gemma3n_image_vt.py | 186 + .../gemma3n_fine_tuning_on_all_modalities.py | 425 + ...gingface-projects_gemma-4-31b-it-README.md | 13 + ...huggingface-projects_gemma-4-31b-it-app.py | 303 + ...e-projects_gemma-4-31b-it-requirements.txt | 362 + ...gingface-projects_gemma-4-e4b-it-README.md | 13 + ...huggingface-projects_gemma-4-e4b-it-app.py | 322 + ...e-projects_gemma-4-e4b-it-requirements.txt | 362 + tooling/huggingface/transformers/__init__.py | 33 + .../transformers/configuration_gemma4.py | 352 + .../transformers/feature_extraction_gemma4.py | 298 + .../transformers/image_processing_gemma4.py | 220 + .../image_processing_pil_gemma4.py | 278 + .../transformers/modeling_gemma4-OUTLINE.py | 723 + .../transformers/modular_gemma4-OUTLINE.py | 563 + .../transformers/processing_gemma4.py | 366 + .../transformers/video_processing_gemma4.py | 237 + tooling/inference-frameworks/README.md | 71 + tooling/inference-frameworks/run_commands.sh | 70 + .../snippets/gemini_api_gemma4.py | 26 + .../snippets/gemini_api_gemma4.sh | 17 + .../snippets/keras_hub_gemma4.py | 30 + .../llamacpp_convert_gemma4_excerpt.py | 175 + .../snippets/mlx_gemma4_head_100.py | 92 + .../snippets/mlx_vlm_gemma4_head_60.py | 60 + .../snippets/vllm_gemma4_head_80.py | 90 + .../snippets/vllm_gemma4_mm_head_80.py | 80 + .../snippets/vllm_registry_excerpt.txt | 16 + 149 files changed, 181297 insertions(+) create mode 100644 tooling/README.md create mode 100644 tooling/fine-tuning/README.md create mode 100644 tooling/fine-tuning/axolotl/26b-a4b-moe-qlora.yaml create mode 100644 tooling/fine-tuning/axolotl/31b-qlora-flex.yaml create mode 100644 tooling/fine-tuning/axolotl/31b-qlora.yaml create mode 100644 tooling/fine-tuning/axolotl/README.md create mode 100644 tooling/fine-tuning/axolotl/e2b-vision-lora.yaml create mode 100644 tooling/fine-tuning/google-cookbook/Gemma_4_HDP_Agentic_Security.ipynb create mode 100644 tooling/fine-tuning/google-cookbook/Gemma_4_HDP_README.md create mode 100644 tooling/fine-tuning/google-cookbook/function-calling-gemma4.ipynb create mode 100644 tooling/fine-tuning/google-cookbook/huggingface_text_finetune_qlora.ipynb create mode 100644 tooling/fine-tuning/google-cookbook/huggingface_text_full_finetune.ipynb create mode 100644 tooling/fine-tuning/google-cookbook/huggingface_vision_finetune_qlora.ipynb create mode 100644 tooling/fine-tuning/google-cookbook/lora_tuning.ipynb create mode 100644 tooling/fine-tuning/huggingface-recipes/Gemma4_(E2B)-Multimodal.ipynb create mode 100644 tooling/fine-tuning/huggingface-recipes/README.md create mode 100644 tooling/fine-tuning/huggingface-recipes/carla_vlm_gemma.py create mode 100644 tooling/fine-tuning/huggingface-recipes/hf-blog-gemma4.md create mode 100644 tooling/fine-tuning/ollama-llamacpp/ollama-import-lora.md create mode 100644 tooling/fine-tuning/recipe-recommendation.md create mode 100644 tooling/fine-tuning/trl/dpo.py create mode 100644 tooling/fine-tuning/trl/grpo_agent.py create mode 100644 tooling/fine-tuning/trl/grpo_vlm.py create mode 100644 tooling/fine-tuning/trl/sft.py create mode 100644 tooling/fine-tuning/trl/sft_gemma3.py create mode 100644 tooling/fine-tuning/trl/sft_tiny_aya_tool_calling.py create mode 100644 tooling/fine-tuning/trl/sft_vlm.py create mode 100644 tooling/fine-tuning/trl/sft_vlm_gemma3.py create mode 100644 tooling/fine-tuning/trl/trl_scripts_sft.py create mode 100644 tooling/fine-tuning/unsloth/docs/unsloth-README.md create mode 100644 tooling/fine-tuning/unsloth/kaggle/Gemma4_(31B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/kaggle/Gemma4_(E4B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Vision.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Vision.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Audio.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Vision.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Audio.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Text.ipynb create mode 100644 tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Vision.ipynb create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Text.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Vision.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Text.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Vision.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Audio.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Text.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Vision.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_GRPO.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Audio.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Text.py create mode 100644 tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Vision.py create mode 100644 tooling/gemma-family/codegemma.md create mode 100644 tooling/gemma-family/datagemma.md create mode 100644 tooling/gemma-family/dolphingemma.md create mode 100644 tooling/gemma-family/embeddinggemma.md create mode 100644 tooling/gemma-family/index.md create mode 100644 tooling/gemma-family/medgemma.md create mode 100644 tooling/gemma-family/other-variants.md create mode 100644 tooling/gemma-family/paligemma.md create mode 100644 tooling/gemma-family/recurrentgemma.md create mode 100644 tooling/gemma-family/shieldgemma.md create mode 100644 tooling/gemma-family/signgemma.md create mode 100644 tooling/gemma-family/translategemma.md create mode 100644 tooling/gemma-family/txgemma.md create mode 100644 tooling/google-official/README.md create mode 100644 tooling/google-official/cookbook/README.md create mode 100644 tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity.ipynb create mode 100644 tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity_README.md create mode 100644 tooling/google-official/cookbook/apps_Gemma4_HDP_hdp_middleware.py create mode 100644 tooling/google-official/cookbook/docs_gemma_chat.ipynb create mode 100644 tooling/google-official/cookbook/tutorials_RAG_EmbeddingGemma.ipynb create mode 100644 tooling/google-official/deepmind-gemma/README.md create mode 100644 tooling/google-official/deepmind-gemma/colab_sampling.ipynb create mode 100644 tooling/google-official/deepmind-gemma/colab_tool_use.ipynb create mode 100644 tooling/google-official/deepmind-gemma/example_classification.py create mode 100644 tooling/google-official/deepmind-gemma/example_dpo.py create mode 100644 tooling/google-official/deepmind-gemma/example_lora.py create mode 100644 tooling/google-official/deepmind-gemma/example_multimodal.py create mode 100644 tooling/google-official/deepmind-gemma/example_sharding.py create mode 100644 tooling/google-official/docs/ai-google-dev_core.html create mode 100644 tooling/google-official/docs/ai-google-dev_formatting.html create mode 100644 tooling/google-official/docs/ai-google-dev_function_calling_gemma4.html create mode 100644 tooling/google-official/docs/ai-google-dev_model_card_4.html create mode 100644 tooling/google-official/docs/ai-google-dev_prompt_formatting_gemma4.html create mode 100644 tooling/google-official/docs/blog_announcement.html create mode 100644 tooling/google-official/gemma-cpp/API_SERVER_README.md create mode 100644 tooling/google-official/gemma-cpp/README.md create mode 100644 tooling/google-official/gemma-cpp/examples_README.md create mode 100644 tooling/google-official/gemma-pytorch/README.md create mode 100644 tooling/google-official/gemma-pytorch/run.py create mode 100644 tooling/google-official/gemma-pytorch/run_multimodal.py create mode 100644 tooling/google-official/gemma-pytorch/run_xla.py create mode 100644 tooling/google-official/tech-report/Gemma3Report.pdf create mode 100644 tooling/huggingface/README.md create mode 100644 tooling/huggingface/blog/gemma-peft-blog.md create mode 100644 tooling/huggingface/blog/gemma4-blog.md create mode 100644 tooling/huggingface/model-cards/gemma-4-26B-A4B-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-26B-A4B-it-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-31B-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-31B-it-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-31B-it-chat_template.jinja create mode 100644 tooling/huggingface/model-cards/gemma-4-31B-it-tokenizer_config.json create mode 100644 tooling/huggingface/model-cards/gemma-4-E2B-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-E2B-it-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-E4B-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-E4B-it-README.md create mode 100644 tooling/huggingface/model-cards/gemma-4-E4B-it-chat_template.jinja create mode 100644 tooling/huggingface/model-cards/gemma-4-E4B-it-tokenizer_config.json create mode 100644 tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal-extracted.py create mode 100644 tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal.ipynb create mode 100644 tooling/huggingface/recipes/scripts/carla_vlm_gemma.py create mode 100644 tooling/huggingface/recipes/scripts/ft_gemma3n_audio_vt.py create mode 100644 tooling/huggingface/recipes/scripts/ft_gemma3n_image_trl.py create mode 100644 tooling/huggingface/recipes/scripts/ft_gemma3n_image_vt.py create mode 100644 tooling/huggingface/recipes/scripts/gemma3n_fine_tuning_on_all_modalities.py create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-README.md create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-app.py create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-requirements.txt create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-README.md create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-app.py create mode 100644 tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-requirements.txt create mode 100644 tooling/huggingface/transformers/__init__.py create mode 100644 tooling/huggingface/transformers/configuration_gemma4.py create mode 100644 tooling/huggingface/transformers/feature_extraction_gemma4.py create mode 100644 tooling/huggingface/transformers/image_processing_gemma4.py create mode 100644 tooling/huggingface/transformers/image_processing_pil_gemma4.py create mode 100644 tooling/huggingface/transformers/modeling_gemma4-OUTLINE.py create mode 100644 tooling/huggingface/transformers/modular_gemma4-OUTLINE.py create mode 100644 tooling/huggingface/transformers/processing_gemma4.py create mode 100644 tooling/huggingface/transformers/video_processing_gemma4.py create mode 100644 tooling/inference-frameworks/README.md create mode 100644 tooling/inference-frameworks/run_commands.sh create mode 100644 tooling/inference-frameworks/snippets/gemini_api_gemma4.py create mode 100644 tooling/inference-frameworks/snippets/gemini_api_gemma4.sh create mode 100644 tooling/inference-frameworks/snippets/keras_hub_gemma4.py create mode 100644 tooling/inference-frameworks/snippets/llamacpp_convert_gemma4_excerpt.py create mode 100644 tooling/inference-frameworks/snippets/mlx_gemma4_head_100.py create mode 100644 tooling/inference-frameworks/snippets/mlx_vlm_gemma4_head_60.py create mode 100644 tooling/inference-frameworks/snippets/vllm_gemma4_head_80.py create mode 100644 tooling/inference-frameworks/snippets/vllm_gemma4_mm_head_80.py create mode 100644 tooling/inference-frameworks/snippets/vllm_registry_excerpt.txt diff --git a/README.md b/README.md index d4bf567..76d9953 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Research corpus and implementation guidance for Google Gemma 4, based on product | `CORPUS_capabilities.md` | Modalities (vision, audio, video, tools), what it can/can't do | When scoping what Gemma 4 can handle | | `CORPUS_benchmarks.md` | Full benchmark table vs Gemma 3, arena scores, agentic scores | When comparing Gemma 4 to alternatives | | `CORPUS_tool_calling_format.md` | Native token format + JSON API format for function calling | When implementing tool calling | +| `tooling/` | **Canonical upstream tooling** — real scripts, notebooks, model cards, and configs pulled from Google / HF / framework maintainers (147 files). Subdirs: `google-official/`, `huggingface/`, `inference-frameworks/`, `gemma-family/`, `fine-tuning/`. See `tooling/README.md` for index and findings that update the older `CORPUS_*` docs | When you need authoritative source material — model cards, chat templates, fine-tuning recipes, serving commands for vLLM / llama.cpp / MLX, or to scope a specialized sibling (ShieldGemma, EmbeddingGemma, etc.) | ## Source Projects diff --git a/tooling/README.md b/tooling/README.md new file mode 100644 index 0000000..54bb296 --- /dev/null +++ b/tooling/README.md @@ -0,0 +1,50 @@ +# Gemma 4 — Canonical Tooling Corpus + +Actual scripts, notebooks, model cards, and configs downloaded from Google, Hugging Face, and the canonical framework maintainers. Populated 2026-04-18 by parallel research across five lanes. 147 files, ~14 MB. + +**Triage: read the subdirectory README that matches your task, not this one.** This file is an index. + +## Directory map + +| Dir | What's there | When to open it | +|-----|--------------|-----------------| +| `google-official/` | `google-deepmind/gemma` JAX/Flax examples, `google/gemma_pytorch` scripts, `gemma.cpp` README + `gemma_api_server` docs, `google-gemma/cookbook` notebooks, official ai.google.dev HTML snapshots, Gemma 3 tech report PDF | Before trusting any non-Google source; when you need the authoritative prompt format or function-calling spec | +| `huggingface/` | All 8 `google/gemma-4-*` model cards, chat-template `.jinja` files, `tokenizer_config.json` (with response-schema regex), transformers `gemma4/` source, official Gemma 4 Spaces `app.py`, HF launch blog posts | Before writing any transformers / `processor` integration; for the canonical chat-template handling | +| `inference-frameworks/` | Comparison table across vLLM / llama.cpp / MLX / Keras-hub / TGI / Gemini API / Vertex AI. Real launch commands in `run_commands.sh`, 9 code snippets under `snippets/` | When picking a non-Ollama runtime; when you need audio/video input (Ollama doesn't expose it) | +| `gemma-family/` | 12 per-variant briefs: ShieldGemma 2, CodeGemma, PaliGemma 2, RecurrentGemma, DataGemma, MedGemma, TxGemma, EmbeddingGemma, TranslateGemma, FunctionGemma, DolphinGemma, SignGemma + `index.md` | When scoping a project that needs a specialized sister model (embeddings, safety, vision-grounded, translation, tool routing) | +| `fine-tuning/` | Unsloth Gemma 4 notebooks (text/vision/audio/GRPO), Axolotl Gemma 4 YAMLs (including 26B-A4B MoE), TRL reference scripts, Google cookbook fine-tune notebooks, `recipe-recommendation.md` with Seth's homelab-specific path | Before spending a dollar on cloud GPU or starting any Gemma 4 fine-tune | + +## Findings that update / contradict the existing corpus + +These are real gaps worth patching into `SYNTHESIS.md`, `GOTCHAS.md`, or `CORPUS_tool_calling_format.md`. Flagged here, not applied — the user asked for research, not a rewrite. + +1. **Prompt-token format changed in Gemma 4.** Gemma 1/2/3 used `user ... `. Gemma 4 uses asymmetric pipe-brackets: `<|turn>user\n ... `. Also new: `<|think|>`, `<|channel>thought...`, `<|tool>`, `<|tool_call>`, `<|tool_response>` (+ inverses), `<|image>`, `<|audio>`, and string delimiter `<|"|>`. The existing `CORPUS_tool_calling_format.md` documents the tool tokens but doesn't reflect the turn-token change or the thinking/channel tokens. Canonical source: `huggingface/model-cards/gemma-4-31B-it-chat_template.jinja` and `google-official/docs/ai-google-dev_prompt_formatting_gemma4.html`. + +2. **`google/gemma_pytorch` is abandoned for Gemma 4.** Last push 2025-05-30; the variants validator rejects Gemma 4 IDs. Anyone pointing at it as the PyTorch reference is wrong — use HF `transformers` or `google-deepmind/gemma` (JAX/Flax) instead. + +3. **`gemma.cpp` ships a Gemini-API-compatible local HTTP server** (`gemma_api_server`, endpoint `POST /v1beta/models/:generateContent`, SSE streaming). This is a Google-authored alternative to Ollama that speaks the real Gemini REST API — possibly the single most interesting discovery in this research pass. See `google-official/gemma-cpp/API_SERVER_README.md`. + +4. **Transformers exposes `AutoModelForMultimodalLM` (new AutoClass)** — not `AutoModelForCausalLM`. It also exposes `processor.parse_response(..., response_schema=...)` driven from `tokenizer_config.json`, which replaces the hand-rolled regex in the current `CORPUS_tool_calling_format.md`. Pin: `transformers>=5.5.4`. + +5. **Gemma 4 breaks Flash Attention.** FA2's max head_dim is 256, FA4's is 128, and Gemma 4's global head_dim is 512. Use SDP or Flex Attention. Axolotl hard-codes `sdp_attention: true` for Gemma 4. This belongs in `GOTCHAS.md`. + +6. **The 26B variant is a MoE** — `gemma-4-26B-A4B` (A4B = 4B active per token). Quantization rules differ: Unsloth says use 16-bit LoRA, not 4-bit QLoRA, for acceptable quality. Axolotl's ScatterMoE + expert-LoRA config is the only tool validated for 4-bit MoE training. Worth a line in `CORPUS_ollama_variants.md`. + +7. **No Gemma 4 technical report PDF exists yet** as of 2026-04-18. DeepMind repo says "Gemma 4 (Coming soon)". Gemma 3 report (downloaded at `google-official/tech-report/Gemma3Report.pdf`) remains the closest authoritative family citation. + +8. **No `google/gemma-4-*` specialized siblings yet** — ShieldGemma, CodeGemma, PaliGemma, MedGemma, DataGemma are all still on Gemma 2 or 3 base. Historical lag is 3–6 months; expect siblings-on-4 mid-to-late 2026. + +9. **No Gemma-4-specific TRL script in `huggingface/trl` yet.** HF blog says "fully supported," but the SFT/DPO/GRPO examples are still on Gemma 3 model IDs. Drop-in with `model_id` swap works. Only Gemma-4-dedicated TRL example today is `huggingface-gemma-recipes/carla_vlm_gemma.py` (VLM GRPO). + +10. **HF Spaces `app.py` files are the shortest Gemma 4 inference examples** — Google and HF both use them as ref. See `huggingface/spaces/huggingface-projects_gemma-4-{31b,e4b}-it-app.py`. + +## Immediate homelab plug-ins (from the gemma-family research) + +- **EmbeddingGemma (308M)** — 100+ languages, Matryoshka to 128d. Drop-in upgrade from `nomic-embed-text` on both hosts. +- **FunctionGemma (270M)** — cheap tool-router in front of `mortdecai:*` (latency win on hot path). +- **PaliGemma 2 3B-448** — vision grounding with bbox output for AI_Visualizer / AI visualizer CT 167 alongside SDXL. +- **TranslateGemma 4B** — useful for the family history agent (German/Polish sources). + +## Source-url discipline + +Every URL in the subdirectory READMEs was fetched and verified, not reconstructed from training. If a downloaded file is wrong, `git log` will show when it was pulled; the agent transcripts are the record of the source commit. Upstream repos can and do rename paths (see: `google-gemini/gemma-cookbook` → `google-gemma/cookbook`). Re-verify before citing externally. diff --git a/tooling/fine-tuning/README.md b/tooling/fine-tuning/README.md new file mode 100644 index 0000000..287562a --- /dev/null +++ b/tooling/fine-tuning/README.md @@ -0,0 +1,281 @@ +# Gemma 4 Fine-Tuning Tooling — Index + +Research captured 2026-04-18. All downloads verified against upstream repos. + +## TL;DR + +| Tool | Gemma 4 coverage | GPU floor (LoRA) | GPU floor (full FT) | Best at | +|------|------------------|------------------|---------------------|---------| +| **Unsloth** | Full parity — all 4 sizes, text/vision/audio/GRPO/RL | E2B: 8 GB, E4B: 17 GB, 26B A4B: ~40 GB, 31B QLoRA: 22 GB | Not recommended locally | **Fastest path**, Google-blessed, free Colab | +| **TRL** | Partial — no `sft_gemma4.py` yet; `sft_gemma3.py` + `AutoModelForImageTextToText` works | Same as Unsloth w/ `load_in_4bit` | 2x H100 min for 31B | Research-grade control, DPO/GRPO/online RL, VLM GRPO on Gemma 4 (CARLA) | +| **Axolotl** | **Native Gemma 4 configs shipped** (`examples/gemma4/`) | Single 5090 (32 GB) for 26B A4B QLoRA validated | >80 GB, "not tested" per README | Declarative YAML, multi-GPU FSDP, MoE expert LoRA | +| **Google cookbook** | `docs/core/*` notebooks default to `google/gemma-4-E2B` | Depends on Colab tier | L4 (22 GB) for E4B QLoRA | Canonical baseline, paired with ai.google.dev docs | +| **HF gemma-recipes** | Inference + one GRPO VLM script (CARLA) | E2B on T4 | — | VLM GRPO with tool-calling environment | +| **Ollama** | Serves fine-tuned Gemma 4 via Modelfile `ADAPTER` | — | — | Final serving step | + +**Recommendation for Seth: Unsloth.** See `recipe-recommendation.md`. + +--- + +## 1. Unsloth (`unsloth/`) + +**Upstream:** `unslothai/notebooks`, `unslothai/unsloth` +**License:** LGPL-3.0 (notebooks), Apache-2.0 (library) +**Published Gemma 4 Dynamic quants:** +- `unsloth/gemma-4-{E2B,E4B,31B,26B-A4B}-{,it}-unsloth-bnb-4bit` (dynamic 4-bit) +- `unsloth/gemma-4-{E2B,E4B,31B,26B-A4B}-it-GGUF` (GGUF for inference) +- Collection: https://huggingface.co/collections/unsloth/gemma-4 + +**Downloaded files (local paths under this directory):** +- `unsloth/notebooks/Gemma4_(E2B)-Text.ipynb` — **canonical SFT notebook, T4-compatible** +- `unsloth/notebooks/Gemma4_(E4B)-Text.ipynb` — 10 GB VRAM, higher accuracy +- `unsloth/notebooks/Gemma4_(26B_A4B)-Text.ipynb` — MoE SFT (needs A100+) +- `unsloth/notebooks/Gemma4_(31B)-Text.ipynb` — dense 31B SFT +- `unsloth/notebooks/Gemma4_(E2B|E4B|26B_A4B|31B)-Vision.ipynb` — vision SFT w/ `UnslothVisionDataCollator` +- `unsloth/notebooks/Gemma4_(E2B|E4B)-Audio.ipynb` — audio SFT (E2B/E4B only — 31B/26B have no audio encoder) +- `unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb` — GRPO RL w/ Python reward funcs +- `unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_{2048,Sudoku}_Game.ipynb` — game-playing RL +- `unsloth/python_scripts/*.py` — same content as `.py` scripts (easier to grep/modify) +- `unsloth/kaggle/Gemma4_(31B)-Text.ipynb`, `unsloth/kaggle/Gemma4_(E4B)-Text.ipynb` — Kaggle-flavored variants +- `unsloth/docs/unsloth-README.md` — top-level Unsloth README + +**Upstream URLs (useful to share):** +- SFT E4B Colab: https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma4_(E4B)-Text.ipynb +- GRPO Colab: https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma4_(E2B)_GRPO.ipynb +- Unsloth Gemma 4 docs: https://unsloth.ai/docs/models/gemma-4/train + +### Unsloth chat-template & masking detail (CRITICAL for Gemma 4) + +Gemma 4 does **not** use Gemma 3's `` / ``. The new format is: + +``` +<|turn>user +Hello +<|turn>model +Hey there! +``` + +Unsloth's helper: +```python +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template(tokenizer, chat_template = "gemma-4") # literal "gemma-4", not "gemma4" +``` + +Response-only masking (matches Unsloth's convention; everything *before* `response_part` is loss-masked): +```python +from unsloth.chat_templates import train_on_responses_only +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) +``` + +`` gotcha: `apply_chat_template` prepends ``; Unsloth's `formatting_prompts_func` strips it with `.removeprefix('')` because the SFTTrainer's data collator adds its own — double `` silently degrades training. + +**Tool tokens (`<|tool>`, `<|tool_call>`, `<|tool_response>`, `<|"|>`) are *not* masked** in Unsloth's default setup — they flow through as plain text inside user/assistant turns. If you're fine-tuning on tool-call data, include full `<|tool_call>...` markup in the assistant `content` field; the template doesn't need a special `role=tool` branch. + +### Unsloth MoE note + +For 26B A4B (128 experts): Unsloth explicitly recommends **bf16/16-bit LoRA, NOT 4-bit QLoRA** ("MoE QLoRA not recommended, dense 31B is fine"). Their notebook uses `load_in_4bit = True` at >40 GB but the docs flag this as suboptimal. + +--- + +## 2. TRL (`trl/`) + +**Upstream:** `huggingface/trl` +**License:** Apache-2.0 + +**Gemma 4-specific scripts:** NONE in `examples/scripts/` as of 2026-04-18. The canonical Gemma 4 TRL example lives in `huggingface-gemma-recipes/scripts/carla_vlm_gemma.py` (see next section). + +**Closest-match Gemma 3 scripts downloaded (drop-in for Gemma 4 — change `model_id` to `google/gemma-4-*-it`, keep `AutoModelForImageTextToText`):** +- `trl/sft_gemma3.py` — **use this as the Gemma 4 SFT template**. Pure text SFT (Codeforces-COTS). +- `trl/sft_vlm_gemma3.py` — vision SFT template (uses `AutoModelForImageTextToText`, `all-linear` LoRA). +- `trl/sft.py`, `trl/trl_scripts_sft.py` — the generic SFTTrainer wrappers. +- `trl/sft_vlm.py` — model-agnostic VLM SFT. +- `trl/dpo.py` — DPO (1-liner using TrlParser). +- `trl/grpo_agent.py`, `trl/grpo_vlm.py` — GRPO with tool-calling environments. +- `trl/sft_tiny_aya_tool_calling.py` — tool-calling SFT pattern. + +**Chat template / masking detail:** TRL's `SFTTrainer` uses `tokenizer.apply_chat_template` end-to-end and delegates to the tokenizer's built-in Jinja template. For `google/gemma-4-*-it`, that template already produces `<|turn>user…`. TRL supports `completion_only_loss` via the `SFTConfig(assistant_only_loss=True)` flag (TRL ≥ 0.22), which masks anything before the assistant turn — no manual `instruction_part` plumbing needed. + +### Official HF blog says (verbatim): +> "Gemma 4 is fully supported for fine-tuning with TRL. … we have prepared an example on how to fine-tune Gemma 4 with TRL on Vertex AI using SFT, to showcase how to extend the function calling capabilities, **whilst freezing both the vision and audio towers**." +(see `huggingface-recipes/hf-blog-gemma4.md` §634-687) + +--- + +## 3. Axolotl (`axolotl/`) + +**Upstream:** `axolotl-ai-cloud/axolotl`, `examples/gemma4/` +**License:** Apache-2.0 +**Gemma 4 status:** **Native support shipped**, day-one-class parity. + +**Downloaded files:** +- `axolotl/README.md` — official Axolotl Gemma 4 guide +- `axolotl/31b-qlora.yaml` — 31B dense QLoRA, 1x80GB @ ~44 GB VRAM +- `axolotl/31b-qlora-flex.yaml` — 31B dense QLoRA + Flex Attention, 1x80GB @ ~26 GB (40% less VRAM, 50% throughput cost) +- `axolotl/26b-a4b-moe-qlora.yaml` — 26B MoE QLoRA + ScatterMoE expert-quantized + Expert-LoRA. Validated: 50 steps FineTome, loss 8.8→1.8, single RTX 5090 (32 GB), 21 GiB peak +- `axolotl/e2b-vision-lora.yaml` — E2B vision LoRA with `freeze_mm_modules: true` + +**Run command (from Axolotl README):** +```bash +axolotl train examples/gemma4/26b-a4b-moe-qlora.yaml +axolotl train examples/gemma4/31b-qlora.yaml +axolotl train examples/gemma4/31b-qlora-flex.yaml +``` + +### Axolotl chat template & masking detail + +```yaml +chat_template: gemma4 +datasets: + - path: mlabonne/FineTome-100k + type: chat_template + field_messages: conversations + message_property_mappings: + role: from + content: value +``` +`chat_template: gemma4` (no dash — Axolotl's key is different from Unsloth's `"gemma-4"`). The template applies Gemma 4 turn tokens (`<|turn>user … `). Masking is handled automatically by `type: chat_template` — only the assistant turn counts toward loss. + +### Axolotl hard limitations for Gemma 4 (from their README) + +- **Flash Attention OFF.** FA2 caps head_dim at 256; FA4 at 128; Gemma 4's `global_head_dim=512` exceeds both. **Use SDP or Flex Attention.** (`sdp_attention: true` in every yaml.) +- **LoRA kernels OFF.** Due to Gemma 4's shared-KV layers (last N layers reuse K/V tensors): `lora_mlp_kernel: false`, `lora_qkv_kernel: false`, `lora_o_kernel: false`. +- **`lora_target_linear` is incompatible** for multimodal. You MUST use `lora_target_modules` with the regex (see below) to restrict LoRA to the text decoder and NOT the vision/audio encoders. + +Axolotl's canonical regex restricts LoRA to text layers only: +```regex +model.language_model.layers.[\d]+.(_checkpoint_wrapped_module.)?(mlp|self_attn).(up|down|gate|q|k|v|o)_proj +``` + +For 26B A4B MoE, additionally target expert 3D tensors: +```yaml +lora_target_parameters: + - experts.gate_up_proj + - experts.down_proj +``` + +--- + +## 4. Google Cookbook (`google-cookbook/`) + +**Upstream:** `google-gemma/cookbook`, `docs/core/` +**License:** Apache-2.0 +**Gemma 4 status:** The `docs/core/*.ipynb` fine-tuning notebooks default to `google/gemma-4-E2B` as `model_id` — they ARE the Gemma 4 path, despite generic filenames. + +**Downloaded files:** +- `google-cookbook/huggingface_text_finetune_qlora.ipynb` — **text-to-SQL QLoRA tutorial** (gretel-synthetic-text-to-sql dataset, `philschmid/gretel-synthetic-text-to-sql`). This is the one ai.google.dev links to as the "official" fine-tune path. +- `google-cookbook/huggingface_text_full_finetune.ipynb` — full-weights fine-tune variant +- `google-cookbook/huggingface_vision_finetune_qlora.ipynb` — vision QLoRA on product descriptions +- `google-cookbook/lora_tuning.ipynb` — LoRA concepts tutorial +- `google-cookbook/function-calling-gemma4.ipynb` — official Google function-calling notebook (not a fine-tune, but the authoritative reference for tool-call tokens) +- `google-cookbook/Gemma_4_HDP_Agentic_Security.ipynb` + `Gemma_4_HDP_README.md` — full-app fine-tune example (agentic security) + +**Upstream URLs:** +- https://ai.google.dev/gemma/docs/core/huggingface_text_finetune_qlora +- https://ai.google.dev/gemma/docs/core/huggingface_vision_finetune_qlora +- https://ai.google.dev/gemma/docs/capabilities/text/function-calling-gemma4 + +### Google cookbook chat template & masking detail (VERY IMPORTANT) + +The cookbook notebooks use TRL's `SFTTrainer` with standard `messages` list (`role`/`content`) — chat-template is applied automatically by the tokenizer's built-in Jinja. No manual `instruction_part`/`response_part`. + +**The non-obvious detail** is the `LoraConfig`: +```python +peft_config = LoraConfig( + lora_alpha=16, lora_dropout=0.05, r=16, bias="none", + target_modules="all-linear", + task_type="CAUSAL_LM", + modules_to_save=["lm_head", "embed_tokens"], # NOTE + ensure_weight_tying=True, # NOTE +) +``` +`modules_to_save=["lm_head","embed_tokens"]` + `ensure_weight_tying=True` is required because **Gemma 4 introduced new special tokens (`<|turn>`, `<|tool>`, `<|tool_call>`, `<|tool_response>`, `<|"|>`) that need their embeddings to be trainable in a fine-tune.** PEFT 0.15+ added `ensure_weight_tying` specifically for this case. Skipping it causes the adapter to see frozen random embeddings for the new tokens and training silently underperforms. + +For vision, Google's cookbook uses plain `target_modules="all-linear"` (NO `exclude_modules`) — meaning it *does* train LoRA adapters on the vision tower. This is a different tradeoff from Axolotl (`freeze_mm_modules: true`) and from TRL's CARLA recipe (`exclude_modules=["vision_tower", "multi_modal_projector"]`). Pick based on whether your task needs the vision encoder to adapt (e.g., new image domain) or just the text decoder (most cases). + +--- + +## 5. HuggingFace gemma-recipes (`huggingface-recipes/`) + +**Upstream:** `huggingface/huggingface-gemma-recipes` +**License:** Apache-2.0 + +**Downloaded files:** +- `huggingface-recipes/carla_vlm_gemma.py` — **The canonical TRL + Gemma 4 example.** GRPO VLM training in a CARLA driving environment with tool calls. Shows `exclude_modules=["vision_tower", "multi_modal_projector"]`, `chat_template_kwargs={"enable_thinking": False}`, `max_tool_calling_iterations=10`. +- `huggingface-recipes/Gemma4_(E2B)-Multimodal.ipynb` — **inference-only** multimodal demo (vision, video, audio, function calling, object detection). Not a fine-tune but necessary reference for the input format the training data must match. +- `huggingface-recipes/README.md` — HF's top-level recipes index +- `huggingface-recipes/hf-blog-gemma4.md` — the HF blog post's raw markdown (§630-707 is the fine-tuning section) + +**Run command for the CARLA VLM RL example:** +```bash +pip install git+https://github.com/huggingface/trl.git +python examples/scripts/openenv/carla_vlm_gemma.py \ + --env-urls https://sergiopaniego-carla-env.hf.space https://sergiopaniego-carla-env-2.hf.space \ + --model google/gemma-4-E2B-it +``` + +**Known gap:** HF's gemma-recipes repo has *fine-tuning* notebooks for Gemma 3 and Gemma 3n (free T4 Colab) but **no pure-SFT Gemma 4 fine-tuning notebook yet** — the Gemma 4 Colab is inference only. Their blog points users to Unsloth Studio for the easy path. + +--- + +## 6. Ollama / llama.cpp LoRA serving (`ollama-llamacpp/`) + +**Downloaded:** `ollama-llamacpp/ollama-import-lora.md` — distilled from https://docs.ollama.com/import (2026-04-18 fetch). + +**Short answer:** Yes, you can serve a Gemma 4 LoRA via Ollama. Two paths: + +1. **Merge then serve (simpler, recommended):** `model.save_pretrained_merged("out", tokenizer, save_method="merged_16bit")` → `llama.cpp/convert_hf_to_gguf.py` → `llama.cpp/quantize` to Q4_K_M → `ollama create mymodel -f Modelfile` with `FROM ./gemma4-mortdecai.gguf`. +2. **Adapter-only serve:** `llama.cpp/convert_lora_to_gguf.py` on the PEFT directory → Modelfile with `FROM gemma4:e4b-it-q8_0` + `ADAPTER ./adapter.gguf`. + +Ollama's docs list supported architectures as Llama/Mistral/Gemma 1-2 — Gemma 4 isn't *explicitly* listed, but llama.cpp has day-one Gemma 4 support and in practice the path works. (Vision-adapter serving via Ollama is still a grey area.) + +--- + +## 7. Datasets the canonical tutorials pair with Gemma 4 + +| Tutorial | Dataset | Format | Notes | +|----------|---------|--------|-------| +| Unsloth Gemma4 E4B Text | `mlabonne/FineTome-100k` | ShareGPT-style `conversations` field | Also the Axolotl default | +| Unsloth Gemma4 GRPO | Synthetic kernel-optimization prompts in-notebook | Python reward funcs | RL w/ `function_works` / `check_only_stdlib_imports` | +| Unsloth Gemma4 Vision | `unsloth/LaTeX_OCR` | HF image-text pairs | Demonstrates `UnslothVisionDataCollator` | +| Google cookbook text QLoRA | `philschmid/gretel-synthetic-text-to-sql` | chat `messages` list | Google's "official" demo dataset for Gemma 4 | +| Google cookbook vision QLoRA | `philschmid/amazon-product-descriptions-vlm` | image + text pairs | Product-description generation | +| Axolotl Gemma 4 (all sizes) | `mlabonne/FineTome-100k` | `type: chat_template` | Validated in axolotl README | +| Axolotl E2B vision LoRA | `HuggingFaceH4/llava-instruct-mix-vsft` | vision-language SFT | Same as HF's VLM template | +| TRL sft_gemma3 (transfers) | `open-r1/codeforces-cots` | `messages` list | Chain-of-thought coding | +| TRL carla_vlm_gemma (Gemma 4 VLM GRPO) | CARLA simulator (live) | environment rollouts | Multimodal tool responses | + +No one uses Alpaca or UltraChat as the canonical Gemma 4 pair. **FineTome-100k is the unofficial standard** — both Unsloth and Axolotl default to it. + +--- + +## 8. Chat-template-and-masking matrix (the debugging cheat sheet) + +| Framework | chat_template key | Turn tokens | Response masking API | BOS handling | +|-----------|-------------------|-------------|----------------------|--------------| +| Unsloth | `"gemma-4"` | `<|turn>role\n...` | `train_on_responses_only(instruction_part="<|turn>user\n", response_part="<|turn>model\n")` | Strip `` manually with `.removeprefix('')` before passing to trainer | +| TRL | tokenizer's built-in Jinja (no key needed) | same | `SFTConfig(assistant_only_loss=True)` | Tokenizer handles automatically | +| Axolotl | `chat_template: gemma4` (no dash) | same | automatic via `type: chat_template` | Automatic | +| Google cookbook | tokenizer built-in Jinja | same | automatic via `SFTTrainer` + `messages` | Automatic | + +Tool tokens (`<|tool>`, `<|tool_call>`, `<|tool_response>`, `<|"|>`) ride inside message content — none of the frameworks mask them specially, and none provide a `role="tool"` branch in the default template. If you're training tool-call data, put the complete `<|tool_call>call:{...}` block in the assistant message `content`. + +Also: **all Gemma 4 fine-tunes should `modules_to_save=["lm_head","embed_tokens"]` + `ensure_weight_tying=True`** in LoraConfig if you're using PEFT directly, because the new special-token embeddings need to be trainable. Unsloth and Axolotl handle this for you; naïve TRL + PEFT scripts do NOT by default. + +--- + +## What's NOT here (and why) + +- **Kaggle/Colab free-tier notebooks as a separate category** — the Unsloth notebooks *are* the free-tier notebooks. E2B Text runs on a free T4; 31B/26B-A4B need A100 Colab Pro. I pulled 2 Kaggle-flavored variants to `unsloth/kaggle/` for completeness. +- **Google's DeepMind JAX/Flax Gemma 4 fine-tune script** — Google's DeepMind-gemma repo ships inference/reference code, not a SFT script. Google's *canonical* fine-tune path is the HF+TRL notebook in `google-gemma/cookbook` (above), NOT JAX. If you want JAX, see the archived `.archive/Gemma/[Gemma_1]Finetune_distributed.ipynb` pattern — not ported to Gemma 4. +- **Full-weights 31B fine-tuning commands** — Axolotl's README says "heavy and has not been tested." Skip unless Seth rents an 8×H100 pod. +- **Prompt engineering / inference-only notebooks** — per scope. + +## See also + +- `recipe-recommendation.md` — which tool Seth should actually use for his homelab, with the exact command. +- `../../GOTCHAS.md` §"Fine-Tuning Ecosystem Issues" — day-one issues (required `mm_token_type_ids` field, Gemma4ClippableLinear PEFT issue, E2B/E4B training loss 13-15 being normal). +- `../../CORPUS_tool_calling_format.md` — the 6 tool-calling special tokens. diff --git a/tooling/fine-tuning/axolotl/26b-a4b-moe-qlora.yaml b/tooling/fine-tuning/axolotl/26b-a4b-moe-qlora.yaml new file mode 100644 index 0000000..e7bdb6f --- /dev/null +++ b/tooling/fine-tuning/axolotl/26b-a4b-moe-qlora.yaml @@ -0,0 +1,93 @@ +# Gemma 4 26B-A4B MoE QLoRA with ScatterMoE kernels +# +# Validated: 50 steps on FineTome-100k, loss 8.8 -> 1.8, single RTX 5090 (32GB) +# torch_compile=true: 21 GiB peak VRAM, ~230 tok/s, 336s total +# +# Key notes: +# - Max sequence length on 32GB GPU: 2048 (micro_batch_size=1, SDP attention). +# 4096 seq_len OOMs due to head_dim=512 math SDP materializing full score matrix. +# Use 48GB+ GPUs for longer sequences or multi-GPU with FSDP. + +base_model: google/gemma-4-26B-A4B + +plugins: + - axolotl.integrations.cut_cross_entropy.CutCrossEntropyPlugin + - axolotl.integrations.kernels.KernelsPlugin + - axolotl.integrations.liger.LigerPlugin +use_kernels: true +use_scattermoe: true +experts_implementation: scattermoe +torch_compile: true +liger_layer_norm: true +liger_rope: true +liger_rms_norm: true +liger_glu_activation: true +liger_rms_norm_gated: true +strict: false + +chat_template: gemma4 +datasets: + - path: mlabonne/FineTome-100k + type: chat_template + split: train[:10%] + field_messages: conversations + message_property_mappings: + role: from + content: value +val_set_size: 0.05 +output_dir: ./outputs/gemma4-26b-a4b-qlora + +sequence_len: 2048 +sample_packing: true + +load_in_4bit: true +quantize_moe_experts: true +adapter: qlora +lora_r: 16 +lora_alpha: 32 +lora_dropout: 0 + +# Restrict LoRA to text backbone only (skip vision/audio encoders) +# using regex to match only the text decoder attention projections. +lora_target_modules: 'model.language_model.layers.[\d]+.(_checkpoint_wrapped_module.)?(mlp|self_attn).(up|down|gate|q|k|v|o)_proj' + +# MoE expert LoRA (3D Parameter tensors, not nn.Linear) +lora_target_parameters: + - experts.gate_up_proj + - experts.down_proj + +lora_mlp_kernel: false +lora_qkv_kernel: false +lora_o_kernel: false + +bnb_config_kwargs: + bnb_4bit_use_double_quant: true + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: + +gradient_accumulation_steps: 4 +micro_batch_size: 1 +num_epochs: 1 +optimizer: adamw_torch_8bit +lr_scheduler: cosine +learning_rate: 0.0002 + +bf16: auto +tf32: true + +gradient_checkpointing: true +activation_offloading: true +logging_steps: 1 + +# FA2 not supported +sdp_attention: true + +warmup_ratio: 0.1 +evals_per_epoch: 4 +saves_per_epoch: 1 +weight_decay: 0.0 +special_tokens: diff --git a/tooling/fine-tuning/axolotl/31b-qlora-flex.yaml b/tooling/fine-tuning/axolotl/31b-qlora-flex.yaml new file mode 100644 index 0000000..8456c9c --- /dev/null +++ b/tooling/fine-tuning/axolotl/31b-qlora-flex.yaml @@ -0,0 +1,71 @@ +base_model: google/gemma-4-31B + +plugins: + - axolotl.integrations.cut_cross_entropy.CutCrossEntropyPlugin + - axolotl.integrations.liger.LigerPlugin +torch_compile: true +liger_layer_norm: true +liger_rope: true +liger_rms_norm: true +liger_glu_activation: true +liger_rms_norm_gated: true +strict: false + +chat_template: gemma4 +datasets: + - path: mlabonne/FineTome-100k + type: chat_template + split: train[:10%] + field_messages: conversations + message_property_mappings: + role: from + content: value +val_set_size: 0.05 +output_dir: ./outputs/gemma4-31b-qlora-flex + +sequence_len: 2048 +sample_packing: true + +load_in_4bit: true +adapter: qlora +lora_r: 16 +lora_alpha: 32 +lora_dropout: 0 + +# Restrict LoRA to text backbone only (skip vision/audio encoders) +lora_target_modules: 'model.language_model.layers.[\d]+.(_checkpoint_wrapped_module.)?(mlp|self_attn).(up|down|gate|q|k|v|o)_proj' + +lora_mlp_kernel: false +lora_qkv_kernel: false +lora_o_kernel: false + +bnb_config_kwargs: + bnb_4bit_use_double_quant: true + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: + +gradient_accumulation_steps: 4 +micro_batch_size: 1 +optimizer: adamw_torch_8bit +lr_scheduler: cosine +learning_rate: 0.0002 + +bf16: auto +tf32: true + +gradient_checkpointing: true +activation_offloading: true +logging_steps: 1 + +# FA not supported +flex_attention: true + +warmup_ratio: 0.1 +evals_per_epoch: 4 +saves_per_epoch: 1 +weight_decay: 0.0 +special_tokens: diff --git a/tooling/fine-tuning/axolotl/31b-qlora.yaml b/tooling/fine-tuning/axolotl/31b-qlora.yaml new file mode 100644 index 0000000..42086a4 --- /dev/null +++ b/tooling/fine-tuning/axolotl/31b-qlora.yaml @@ -0,0 +1,69 @@ +base_model: google/gemma-4-31B + +plugins: + - axolotl.integrations.cut_cross_entropy.CutCrossEntropyPlugin + - axolotl.integrations.liger.LigerPlugin +torch_compile: false +liger_layer_norm: true +liger_rope: true +liger_rms_norm: true +liger_glu_activation: true +liger_rms_norm_gated: true +strict: false + +chat_template: gemma4 +datasets: + - path: mlabonne/FineTome-100k + type: chat_template + split: train[:10%] + field_messages: conversations + message_property_mappings: + role: from + content: value +val_set_size: 0.05 +output_dir: ./outputs/gemma4-31b-qlora + +sequence_len: 2048 +sample_packing: true + +load_in_4bit: true +adapter: qlora +lora_r: 16 +lora_alpha: 32 +lora_dropout: 0 + +# Restrict LoRA to text backbone only (skip vision/audio encoders) +# using regex to match only the text decoder attention projections. +lora_target_modules: 'model.language_model.layers.[\d]+.(_checkpoint_wrapped_module.)?(mlp|self_attn).(up|down|gate|q|k|v|o)_proj' + +bnb_config_kwargs: + bnb_4bit_use_double_quant: true + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: + +gradient_accumulation_steps: 4 +micro_batch_size: 1 +num_epochs: 1 +optimizer: adamw_torch_8bit +lr_scheduler: cosine +learning_rate: 0.0002 + +bf16: auto +tf32: true + +gradient_checkpointing: true +activation_offloading: true +logging_steps: 1 + +# FA not supported +sdp_attention: true + +warmup_ratio: 0.1 +evals_per_epoch: 4 +saves_per_epoch: 1 +weight_decay: 0.0 +special_tokens: diff --git a/tooling/fine-tuning/axolotl/README.md b/tooling/fine-tuning/axolotl/README.md new file mode 100644 index 0000000..68274ee --- /dev/null +++ b/tooling/fine-tuning/axolotl/README.md @@ -0,0 +1,60 @@ +# Finetune Google's Gemma 4 with Axolotl + +[Gemma 4](https://huggingface.co/collections/google/gemma-4) is a family of multimodal models from Google. This guide covers how to train them with Axolotl. + +## Getting started + +1. Install Axolotl following the [installation guide](https://docs.axolotl.ai/docs/installation.html). + +2. Install [Cut Cross Entropy](https://docs.axolotl.ai/docs/custom_integrations.html#cut-cross-entropy) to reduce training VRAM usage. + +3. Run the finetuning example: + +```bash +# 26B MoE QLoRA (1x80GB @ ~50 GiB) +axolotl train examples/gemma4/26b-a4b-moe-qlora.yaml + +# 31B Dense QLoRA (1x80GB @ ~44 GiB) +axolotl train examples/gemma4/31b-qlora.yaml + +# 31B Dense QLoRA Flex Attn (1x80GB @ ~26 GiB) +axolotl train examples/gemma4/31b-qlora-flex.yaml +``` + +### MoE Expert Quantization & Expert LoRA (26B-A4B only) + +The 26B-A4B config uses ScatterMoE kernels via the transformers `ExpertsInterface` and quantizes expert weights on load. To learn about expert quantization, expert LoRA targeting, and related limitations, see the [MoE Expert Quantization](https://docs.axolotl.ai/docs/expert_quantization.html) docs. + +## Flex Attention + +Reduce ~40% VRAM (at the cost of up to half throughput) by setting the below (shown in `examples/gemma4/31b-qlora-flex.yaml`): + +```yaml +torch_compile: true +flex_attention: true +``` + +This works for both the MoE and Dense model. + +## Limitations + +- **Flash Attention**: FA2 (max head_dim=256) and FA4 (max head_dim=128) cannot support Gemma 4's `global_head_dim=512`. Use SDP or flex attention instead. +- **LoRA kernels**: Not supported due to KV-sharing layers. +- **lora_target_linear**: Incompatible for multimodal models — use `lora_target_modules` with a regex to restrict LoRA to the text backbone. + +### TIPS + +- Read more on how to load your own dataset at [docs](https://docs.axolotl.ai/docs/dataset_loading.html). +- You can run full finetuning by removing `adapter: qlora`, `load_in_4bit: true`, and `quantize_moe_experts: true` from the config. This is heavy and has not been tested. + +## Optimization Guides + +Please check the [Optimizations doc](https://docs.axolotl.ai/docs/optimizations.html). + +## Related Resources + +- [Gemma 4 Blog](https://huggingface.co/blog/gemma4) +- [Axolotl Docs](https://docs.axolotl.ai) +- [Axolotl Website](https://axolotl.ai) +- [Axolotl GitHub](https://github.com/axolotl-ai-cloud/axolotl) +- [Axolotl Discord](https://discord.gg/7m9sfhzaf3) diff --git a/tooling/fine-tuning/axolotl/e2b-vision-lora.yaml b/tooling/fine-tuning/axolotl/e2b-vision-lora.yaml new file mode 100644 index 0000000..c779aae --- /dev/null +++ b/tooling/fine-tuning/axolotl/e2b-vision-lora.yaml @@ -0,0 +1,62 @@ +# Gemma 4 E2B Vision LoRA +# +# Fine-tuning LM LoRA adapters on multimodal Gemma4 with vision/multimodal modules frozen. +# Uses the base ProcessingStrategy (auto-detects image_token from processor). + +base_model: google/gemma-4-E2B-it +processor_type: AutoProcessor +freeze_mm_modules: true + +plugins: + - axolotl.integrations.cut_cross_entropy.CutCrossEntropyPlugin +strict: false + +# Required for vision/multimodal training +skip_prepare_dataset: true +remove_unused_columns: false +sample_packing: false + +chat_template: gemma4 +datasets: + - path: HuggingFaceH4/llava-instruct-mix-vsft + type: chat_template + split: train[:100] + +val_set_size: 0 +output_dir: ./outputs/gemma4-e2b-vision-lora + +adapter: lora +sequence_len: 2048 +pad_to_sequence_len: false + +lora_r: 16 +lora_alpha: 32 +lora_dropout: 0 +# Target language model only — vision encoder is frozen via freeze_mm_modules +lora_target_modules: 'model.language_model.layers.[\d]+.(_checkpoint_wrapped_module.)?(mlp|self_attn).(up|down|gate|q|k|v|o)_proj' + +gradient_accumulation_steps: 4 +micro_batch_size: 1 +num_epochs: 1 +max_steps: 10 +optimizer: adamw_torch_8bit +lr_scheduler: cosine +learning_rate: 0.0002 + +bf16: auto +tf32: true + +gradient_checkpointing: true +gradient_checkpointing_kwargs: + use_reentrant: false +logging_steps: 1 +sdp_attention: true + +warmup_ratio: 0.1 +weight_decay: 0.0 + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: diff --git a/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_Agentic_Security.ipynb b/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_Agentic_Security.ipynb new file mode 100644 index 0000000..6b3d473 --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_Agentic_Security.ipynb @@ -0,0 +1,526 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "colab-badge" + }, + "source": [ + "\n", + " \n", + "
\n", + " Run in Google Colab\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "byline" + }, + "source": [ + "# Securing Gemma 4 Agentic Workflows with HDP\n", + "\n", + "**Author:** Asiri Dalugoda, Helixar Limited ([@asiridalugoda](https://github.com/asiridalugoda)) | [helixar.ai](https://helixar.ai)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gpu-instructions" + }, + "source": [ + "## Before you begin\n", + "\n", + "This notebook requires a GPU runtime. To enable GPU in Colab:\n", + "1. Go to **Runtime → Change runtime type**\n", + "2. Set **Hardware accelerator** to **GPU** (T4 is sufficient for E4B)\n", + "3. Click **Save**\n", + "\n", + "You will also need a **Hugging Face token** to download Gemma 4 (gated model):\n", + "1. Go to [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)\n", + "2. Create a token with **Read** access\n", + "3. Accept the Gemma 4 model license at [huggingface.co/google/gemma-4-E4B-it](https://huggingface.co/google/gemma-4-E4B-it)\n", + "4. Run the cell below to authenticate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hf-login" + }, + "outputs": [], + "source": [ + "from huggingface_hub import notebook_login\n", + "notebook_login()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "overview" + }, + "source": [ + "# Securing Gemma 4 Agentic Workflows with HDP\n", + "\n", + "**Human Delegation Provenance (HDP)** is an open protocol that adds a cryptographic chain-of-custody to AI agent function calls — ensuring every tool invocation can be traced back to an authorized human principal.\n", + "\n", + "This notebook demonstrates how to integrate HDP with Gemma 4's native function-calling capability to:\n", + "\n", + "- **Verify** that Gemma 4's function calls were authorized by a human principal before execution\n", + "- **Classify** actions by irreversibility (read-only → irreversible → physical actuation)\n", + "- **Block** unauthorized or out-of-scope tool calls at the middleware layer\n", + "- **Audit** every decision with a pre-execution log\n", + "\n", + "This is particularly relevant for Gemma 4 deployments on edge devices (Jetson Nano, Raspberry Pi) where the model may be directing physical actuators offline with no out-of-band authorization check.\n", + "\n", + "**References:**\n", + "- HDP IETF draft: [draft-helixar-hdp-agentic-delegation-00](https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/)\n", + "- HDP-P (physical AI agents): [DOI 10.5281/ZENODO.19332440](https://doi.org/10.5281/ZENODO.19332440)\n", + "- Helixar: [helixar.ai](https://helixar.ai)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b3600ee25c8e" + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "7a80251f52b3" + }, + "outputs": [], + "source": [ + "!pip install -q transformers torch cryptography" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ed80fe18f255" + }, + "outputs": [], + "source": [ + "# Download the middleware\n", + "!wget -q https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/apps/Gemma_4_HDP_Agentic_Security/hdp_middleware.py\n", + "\n", + "from hdp_middleware import (\n", + " HDPDelegationToken,\n", + " HDPMiddleware,\n", + " IrreversibilityClass,\n", + " DEFAULT_TOOL_CLASS_MAP,\n", + ")\n", + "from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\n", + "import json" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e88bdc7b7265" + }, + "source": [ + "## 1. Load Gemma 4\n", + "\n", + "We use the 4B Effective model for this demo. For production agentic deployments, the 26B MoE or 31B Dense models are recommended." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1e4e7779806d" + }, + "outputs": [], + "source": [ + "from transformers import pipeline\n", + "\n", + "# For edge/robotics use cases: swap to google/gemma-4-E2B-it\n", + "MODEL_ID = \"google/gemma-4-E4B-it\"\n", + "\n", + "pipe = pipeline(\n", + " \"text-generation\",\n", + " model=MODEL_ID,\n", + " device_map=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d91e36cfb0b2" + }, + "source": [ + "## 2. Define Tools\n", + "\n", + "Gemma 4 uses structured JSON function-calling. We define a tool set spanning different IrreversibilityClasses to demonstrate the middleware's classification behaviour." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1becdb52e7f8" + }, + "outputs": [], + "source": [ + "TOOLS = [\n", + " {\n", + " \"name\": \"get_weather\",\n", + " \"description\": \"Get the current weather for a location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"location\": {\"type\": \"string\", \"description\": \"City name\"}\n", + " },\n", + " \"required\": [\"location\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"send_email\",\n", + " \"description\": \"Send an email to a recipient.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"to\": {\"type\": \"string\"},\n", + " \"subject\": {\"type\": \"string\"},\n", + " \"body\": {\"type\": \"string\"}\n", + " },\n", + " \"required\": [\"to\", \"subject\", \"body\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"delete_file\",\n", + " \"description\": \"Permanently delete a file by path.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"path\": {\"type\": \"string\"}\n", + " },\n", + " \"required\": [\"path\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"actuate_robot_arm\",\n", + " \"description\": \"Command a robot arm to move to a target position.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"joint_angles\": {\"type\": \"array\", \"items\": {\"type\": \"number\"}},\n", + " \"force_limit_n\": {\"type\": \"number\"}\n", + " },\n", + " \"required\": [\"joint_angles\"]\n", + " }\n", + " }\n", + "]\n", + "\n", + "# Tools indexed by name for lookup\n", + "TOOL_REGISTRY = {t[\"name\"]: t for t in TOOLS}\n", + "print(f\"Registered {len(TOOLS)} tools\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "722948b00a92" + }, + "source": [ + "## 3. Issue an HDP Delegation Token\n", + "\n", + "The human principal generates an Ed25519 keypair and issues an HDT that specifies:\n", + "- Which tools the agent is permitted to call\n", + "- The maximum IrreversibilityClass the agent can act on\n", + "- The token's lifetime" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b0622c68dfa5" + }, + "outputs": [], + "source": [ + "# Human principal generates their signing keypair\n", + "# In production: loaded from secure key storage (HSM, OS keychain, etc.)\n", + "principal_private_key = Ed25519PrivateKey.generate()\n", + "principal_public_key = principal_private_key.public_key()\n", + "\n", + "# Issue an HDT authorizing the Gemma 4 agent to call weather queries\n", + "# and send emails (Class 0 and Class 2), but NOT delete files or actuate hardware\n", + "token = HDPDelegationToken.issue(\n", + " principal_id=\"alice@example.com\",\n", + " agent_id=\"gemma4-agent-01\",\n", + " scope=[\"get_weather\", \"send_email\"],\n", + " max_class=IrreversibilityClass.CLASS_2,\n", + " ttl_seconds=3600,\n", + " private_key=principal_private_key,\n", + ")\n", + "\n", + "print(json.dumps(token.to_dict(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e206f950f4bc" + }, + "source": [ + "## 4. Initialise the HDP Middleware\n", + "\n", + "The middleware takes the principal's **public key** only — it verifies but cannot issue tokens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e24676f528bf" + }, + "outputs": [], + "source": [ + "audit_log = []\n", + "\n", + "# Confirmation callback for Class 2 (irreversible) actions.\n", + "# In production: this would invoke a push notification, SMS OTP,\n", + "# or hardware confirmation device to the human principal.\n", + "def require_human_confirmation(tool_name: str, parameters: dict) -> bool:\n", + " print(f\"\\n⚠️ Class 2 action requested: {tool_name}\")\n", + " print(f\" Parameters: {json.dumps(parameters, indent=4)}\")\n", + " response = input(\" Confirm? [y/N]: \").strip().lower()\n", + " return response == \"y\"\n", + "\n", + "middleware = HDPMiddleware(\n", + " public_key=principal_public_key,\n", + " tool_class_map=DEFAULT_TOOL_CLASS_MAP,\n", + " confirmation_callback=require_human_confirmation,\n", + " audit_log=audit_log,\n", + ")\n", + "\n", + "print(\"HDP middleware initialised.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "72d56542eba0" + }, + "source": [ + "## 5. Gemma 4 Function Call → HDP Gate → Tool Execution\n", + "\n", + "This is the core integration pattern. Every function call Gemma 4 generates is passed through `middleware.gate()` before being forwarded to tool execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "da20bc191e71" + }, + "outputs": [], + "source": [ + "# Simulated Gemma 4 function call outputs\n", + "# In production these come from parsing Gemma 4's structured JSON output\n", + "gemma_function_calls = [\n", + " # ✅ Should ALLOW — Class 0, in scope\n", + " {\"name\": \"get_weather\", \"parameters\": {\"location\": \"Auckland\"}},\n", + "\n", + " # ⚠️ Should CONFIRM then ALLOW — Class 2, in scope\n", + " {\"name\": \"send_email\", \"parameters\": {\n", + " \"to\": \"bob@example.com\",\n", + " \"subject\": \"Weekly report\",\n", + " \"body\": \"Please find attached.\"\n", + " }},\n", + "\n", + " # ❌ Should BLOCK — Class 2, NOT in HDT scope\n", + " {\"name\": \"delete_file\", \"parameters\": {\"path\": \"/data/important.csv\"}},\n", + "\n", + " # ❌ Should BLOCK — Class 3, physical actuation\n", + " {\"name\": \"actuate_robot_arm\", \"parameters\": {\n", + " \"joint_angles\": [0.0, -1.57, 0.0, -1.57, 0.0, 0.0],\n", + " \"force_limit_n\": 50.0\n", + " }},\n", + "]\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"HDP VERIFICATION RESULTS\")\n", + "print(\"=\" * 60)\n", + "\n", + "for call in gemma_function_calls:\n", + " result = middleware.gate(call, token)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "be0d0dd05bce" + }, + "source": [ + "## 6. Audit Log\n", + "\n", + "Every decision is logged pre-execution. This is the HDP audit trail — a cryptographically linked record of what was authorized, by whom, and when." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e6dbab6d88d1" + }, + "outputs": [], + "source": [ + "print(\"\\nAUDIT LOG\")\n", + "print(\"-\" * 60)\n", + "for i, entry in enumerate(audit_log):\n", + " status = \"✅ ALLOWED\" if entry.allowed else \"❌ BLOCKED\"\n", + " print(f\"{i+1}. {status} | {entry.tool_name} | {entry.action_class.name} | {entry.reason}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bcadcb7040db" + }, + "source": [ + "## 7. Token Expiry and Scope Violation Demo\n", + "\n", + "Demonstrate that expired tokens and out-of-scope calls are blocked regardless of the action class." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "deb2e3b6b20e" + }, + "outputs": [], + "source": [ + "import time\n", + "\n", + "# Issue a token that's already expired\n", + "expired_token = HDPDelegationToken.issue(\n", + " principal_id=\"alice@example.com\",\n", + " agent_id=\"gemma4-agent-01\",\n", + " scope=[\"get_weather\"],\n", + " max_class=IrreversibilityClass.CLASS_0,\n", + " ttl_seconds=-1, # expired immediately\n", + " private_key=principal_private_key,\n", + ")\n", + "\n", + "print(\"Testing expired token:\")\n", + "middleware.gate({\"name\": \"get_weather\", \"parameters\": {\"location\": \"Auckland\"}}, expired_token)\n", + "\n", + "print(\"\\nTesting call outside HDT scope:\")\n", + "middleware.gate({\"name\": \"delete_file\", \"parameters\": {\"path\": \"/etc/passwd\"}}, token)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b8f4acddb6fa" + }, + "source": [ + "## 8. Edge / Robotics Deployment (HDP-P)\n", + "\n", + "For Gemma 4 E2B/E4B running on Jetson Nano or Raspberry Pi and directing physical actuators, use the HDP-P extension. The key additions are:\n", + "\n", + "- **Embodiment context** — bind the token to a specific hardware ID\n", + "- **Policy attestation** — hash the deployed model weights into the token\n", + "- **Fleet delegation constraints** — prevent lateral movement across robot fleet\n", + "- **Pre-execution logging** — write audit records *before* actuator commands are issued\n", + "\n", + "See the [HDP-P specification](https://doi.org/10.5281/ZENODO.19332440) for the full EDT extension structure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fcf7b451d175" + }, + "outputs": [], + "source": [ + "# Minimal HDP-P Embodied Delegation Token (EDT) extension example\n", + "# This shows how to attach physical constraints to an HDT\n", + "\n", + "hdp_p_extension = {\n", + " \"hdp-p\": {\n", + " \"version\": \"0.1\",\n", + " \"embodiment\": {\n", + " \"type\": \"mobile\",\n", + " \"platform\": \"raspberry-pi-5\",\n", + " \"hardware_id\": \"rpi-serial-XXXX\", # TPM-attested in production\n", + " \"workspace\": \"lab-zone-a\"\n", + " },\n", + " \"action_scope\": {\n", + " \"permitted_actions\": [\"move_base\", \"read_sensor\"],\n", + " \"excluded_zones\": [\"human-workspace\"],\n", + " \"force_limit_n\": 10.0,\n", + " \"max_velocity_ms\": 0.5\n", + " },\n", + " \"irreversibility\": {\n", + " \"max_class\": 1, # Class 1 max for this token\n", + " \"class2_requires_confirmation\": True,\n", + " \"class3_prohibited\": True\n", + " },\n", + " \"policy_attestation\": {\n", + " \"policy_hash\": \"sha256:abc123...\", # SHA-256 of deployed model weights\n", + " \"training_run_id\": \"gemma4-e2b-it\",\n", + " \"sim_validated\": True\n", + " },\n", + " \"delegation_scope\": {\n", + " \"fleet_delegation_permitted\": False, # No lateral movement\n", + " \"max_delegation_depth\": 0\n", + " }\n", + " }\n", + "}\n", + "\n", + "print(\"HDP-P EDT extension structure:\")\n", + "print(json.dumps(hdp_p_extension, indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b0af7c701dfc" + }, + "source": [ + "## Summary\n", + "\n", + "| Layer | What it solves | Tool |\n", + "|---|---|---|\n", + "| Gemma 4 function calling | Model generates structured tool calls | `pipeline(\"text-generation\")` |\n", + "| HDP middleware | Was this call authorized by a human? | `HDPMiddleware.gate()` |\n", + "| HDP-P EDT extension | Is this physical action within delegated bounds? | `hdp_p_extension` |\n", + "| Audit log | Pre-execution record of every decision | `audit_log` |\n", + "\n", + "The full HDP specification (IETF draft), HDP-P companion paper, TypeScript SDK, and Python bindings are available at:\n", + "\n", + "- **IETF draft:** https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/\n", + "- **HDP-P paper:** https://doi.org/10.5281/ZENODO.19332440\n", + "- **GitHub:** https://github.com/Helixar-AI\n", + "- **Site:** https://helixar.ai" + ] + } + ], + "metadata": { + "colab": { + "name": "Gemma_4_HDP_Agentic_Security.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_README.md b/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_README.md new file mode 100644 index 0000000..8811f85 --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/Gemma_4_HDP_README.md @@ -0,0 +1,75 @@ +# Gemma 4 + HDP: Securing Agentic Function Calls + +This example demonstrates how to integrate the **Human Delegation Provenance (HDP)** protocol with **Gemma 4's native function-calling** to cryptographically verify that every tool invocation was authorized by a human principal before execution. + +## The problem + +Gemma 4 is purpose-built for agentic workflows. Its native function-calling lets it autonomously call tools and APIs across multi-step plans — on anything from a cloud workstation to a Raspberry Pi running a robot offline. + +This creates a gap: when Gemma 4 generates a function call, there is no verifiable record that a human principal authorized that specific action. An injected prompt, a compromised system prompt, or a lateral pivot from another agent can trigger function calls that are indistinguishable from legitimate requests at the tool interface. + +HDP closes this gap. + +## What HDP does + +HDP (IETF draft: `draft-helixar-hdp-agentic-delegation-00`) provides: + +- **Ed25519-signed Delegation Tokens (HDTs)** issued by a human principal +- **Scope constraints** — which tools the agent is permitted to call +- **Irreversibility classification** (Class 0–3) — from read-only to physical actuation +- **Pre-execution verification** — the middleware gate runs *before* any tool executes +- **Audit log** — a tamper-evident record of every authorization decision + +For Gemma 4 on **edge devices directing physical actuators** (Jetson Nano, Raspberry Pi + robot arm), the HDP-P companion specification adds embodiment constraints, policy attestation, and fleet delegation controls. + +## Files + +| File | Description | +|---|---| +| `Gemma_4_HDP_Agentic_Security.ipynb` | Full walkthrough notebook — load Gemma 4, issue tokens, gate function calls | +| `hdp_middleware.py` | Drop-in middleware — `HDPMiddleware.gate()` wraps any Gemma 4 tool executor | + +## Quick start + +```python +from hdp_middleware import HDPDelegationToken, HDPMiddleware, IrreversibilityClass +from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey + +# Human principal issues a delegation token +private_key = Ed25519PrivateKey.generate() +token = HDPDelegationToken.issue( + principal_id="alice@example.com", + agent_id="gemma4-agent-01", + scope=["get_weather", "send_email"], + max_class=IrreversibilityClass.CLASS_2, + ttl_seconds=3600, + private_key=private_key, +) + +# Middleware verifies every Gemma 4 function call before execution +middleware = HDPMiddleware(public_key=private_key.public_key()) + +result = middleware.gate( + function_call={"name": "send_email", "parameters": {"to": "bob@example.com", ...}}, + token=token, +) + +if result.allowed: + execute_tool(function_call) +``` + +## Irreversibility classes + +| Class | Definition | Authorization | +|---|---|---| +| 0 | Fully reversible — reads, queries | HDT sufficient | +| 1 | Reversible with effort — writes, moves | HDT sufficient | +| 2 | Irreversible — send, delete, publish | HDT + principal confirmation | +| 3 | Irreversible + potentially harmful — physical actuation | Dual-principal required (HDP-P) | + +## References + +- **IETF draft:** https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/ +- **Zenodo DOI:** https://doi.org/10.5281/zenodo.19332023 +- **HDP-P (physical AI):** https://doi.org/10.5281/ZENODO.19332440 +- **Helixar:** https://helixar.ai diff --git a/tooling/fine-tuning/google-cookbook/function-calling-gemma4.ipynb b/tooling/fine-tuning/google-cookbook/function-calling-gemma4.ipynb new file mode 100644 index 0000000..c5e8e3b --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/function-calling-gemma4.ipynb @@ -0,0 +1,1001 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e5ed3a20", + "metadata": { + "id": "-u7xRR3DeFXz" + }, + "source": [ + "##### Copyright 2025 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87fc2129", + "metadata": { + "cellView": "form", + "id": "oed1Dh9SeIlD" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "be48d087", + "metadata": { + "id": "gdkDG20KtfsH" + }, + "source": [ + "# Function calling with Gemma 4" + ] + }, + { + "cell_type": "markdown", + "id": "b06867b0", + "metadata": { + "id": "DzkEdu7YxUOM" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c9252776", + "metadata": { + "id": "4A2wX6qLPAFc" + }, + "source": [ + "When using a generative artificial intelligence (AI) model such as Gemma, you\n", + "may want to use the model to operate programming interfaces in order to complete\n", + "tasks or answer questions. Instructing a model by defining a programming\n", + "interface and then making a request that uses that interface is called *function\n", + "calling*.\n", + "\n", + "> Important: *A Gemma model cannot execute code on its own.* When you\n", + "generate code with function calling, you must run the generated code yourself or\n", + "run it as part of your application. Always put safeguards in place to validate\n", + "any generated code before executing it.\n", + "\n", + "This guide shows the process of using Gemma 4 within the Hugging Face ecosystem." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b5711fa8", + "metadata": { + "id": "brMXesIJu6_0" + }, + "source": [ + "This notebook will run on T4 GPU." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "1a138a16", + "metadata": { + "id": "JYq4z39uu-1a" + }, + "source": [ + "## Install Python packages\n", + "\n", + "Install the Hugging Face libraries required for running the Gemma model and making requests." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be2ea88b", + "metadata": { + "id": "BKczkppWvBAD" + }, + "outputs": [], + "source": [ + "# Install PyTorch & other libraries\n", + "!pip install torch accelerate\n", + "\n", + "# Install the transformers library\n", + "!pip install transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5ec0919e", + "metadata": { + "id": "eylDAA5LxVXr" + }, + "source": [ + "## Load Model\n", + "\n", + "Use the `transformers` libraries to create an instance of a `processor` and `model` using the `AutoProcessor` and `AutoModelForImageTextToText` classes as shown in the following code example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c8a4ae4", + "metadata": { + "id": "vNLDpsrxxW76" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ebbd88f6ff4f4c29913db37e2b461389", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading weights: 0%| | 0/2011 [00:00<|turn>system\n", + "You are a helpful assistant.<|tool>declaration:get_current_temperature{description:<|\"|>Gets the current temperature for a given location.<|\"|>,parameters:{properties:{location:{description:<|\"|>The city name, e.g. San Francisco<|\"|>,type:<|\"|>STRING<|\"|>}},required:[<|\"|>location<|\"|>],type:<|\"|>OBJECT<|\"|>}}\n", + "<|turn>user\n", + "What's the temperature in London?\n", + "<|turn>model\n", + "<|tool_call>call:get_current_temperature{location:<|\"|>London<|\"|>}<|tool_response>\n" + ] + } + ], + "source": [ + "from transformers import TextStreamer\n", + "\n", + "weather_function_schema = {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"get_current_temperature\",\n", + " \"description\": \"Gets the current temperature for a given location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"location\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"The city name, e.g. San Francisco\",\n", + " },\n", + " },\n", + " \"required\": [\"location\"],\n", + " },\n", + " }\n", + "}\n", + "\n", + "message = [\n", + " {\n", + " \"role\": \"system\", \"content\": \"You are a helpful assistant.\"\n", + " },\n", + " {\n", + " \"role\": \"user\", \"content\": \"What's the temperature in London?\"\n", + " }\n", + "]\n", + "\n", + "text = processor.apply_chat_template(message, tools=[weather_function_schema], tokenize=False, add_generation_prompt=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "streamer = TextStreamer(processor)\n", + "outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=64)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b089527f", + "metadata": { + "id": "8yRB855BuiQ6" + }, + "source": [ + "And the same example with the raw Python function." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "eb63e062", + "metadata": { + "id": "pRjDUMBGuk0s" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<|turn>system\n", + "<|tool>declaration:get_current_temperature{description:<|\"|>Gets the current temperature for a given location.<|\"|>,parameters:{properties:{location:{description:<|\"|>The city name, e.g. San Francisco<|\"|>,type:<|\"|>STRING<|\"|>}},required:[<|\"|>location<|\"|>],type:<|\"|>OBJECT<|\"|>}}\n", + "<|turn>user\n", + "What's the temperature in London?\n", + "<|turn>model\n", + "<|tool_call>call:get_current_temperature{location:<|\"|>London<|\"|>}<|tool_response>\n" + ] + } + ], + "source": [ + "from transformers.utils import get_json_schema\n", + "\n", + "def get_current_temperature(location: str):\n", + " \"\"\"\n", + " Gets the current temperature for a given location.\n", + "\n", + " Args:\n", + " location: The city name, e.g. San Francisco\n", + " \"\"\"\n", + " return \"15°C\"\n", + "\n", + "message = [\n", + " {\n", + " \"role\": \"user\", \"content\": \"What's the temperature in London?\"\n", + " }\n", + "]\n", + "\n", + "text = processor.apply_chat_template(message, tools=[get_json_schema(get_current_temperature)], tokenize=False, add_generation_prompt=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "streamer = TextStreamer(processor)\n", + "outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=256)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "422d1ce4", + "metadata": { + "id": "Fcr4EZWMMg6L" + }, + "source": [ + "## Full function calling sequence\n", + "\n", + "This section demonstrates a three-stage cycle for connecting the model to external tools: the **Model's Turn** to generate function call objects, the **Developer's Turn** to parse and execute code (such as a weather API), and the **Final Response** where the model uses the tool's output to answer the user." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "86ee44ab", + "metadata": { + "id": "_bk7y3hKNMMO" + }, + "source": [ + "### Model's Turn\n", + "\n", + "Here's the user prompt `\"Hey, what's the weather in Tokyo right now?\"`, and the tool `[get_current_weather]`. Gemma generates a function call object as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d74862bc", + "metadata": { + "id": "mqAOVhFAMsrm" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Prompt: Hey, what's the weather in Tokyo right now?\n", + "Tools: []\n", + "Output: <|tool_call>call:get_current_weather{location:<|\"|>Tokyo, JP<|\"|>}<|tool_response>\n" + ] + } + ], + "source": [ + "# Define a function that our model can use.\n", + "def get_current_weather(location: str, unit: str = \"celsius\"):\n", + " \"\"\"\n", + " Gets the current weather in a given location.\n", + "\n", + " Args:\n", + " location: The city and state, e.g. \"San Francisco, CA\" or \"Tokyo, JP\"\n", + " unit: The unit to return the temperature in. (choices: [\"celsius\", \"fahrenheit\"])\n", + "\n", + " Returns:\n", + " temperature: The current temperature in the given location\n", + " weather: The current weather in the given location\n", + " \"\"\"\n", + " return {\"temperature\": 15, \"weather\": \"sunny\"}\n", + "\n", + "prompt = \"Hey, what's the weather in Tokyo right now?\"\n", + "tools = [get_current_weather]\n", + "\n", + "message = [\n", + " {\n", + " \"role\": \"system\", \"content\": \"You are a helpful assistant.\"\n", + " },\n", + " {\n", + " \"role\": \"user\", \"content\": prompt\n", + " },\n", + "]\n", + "\n", + "text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "out = model.generate(**inputs, max_new_tokens=128)\n", + "generated_tokens = out[0][len(inputs[\"input_ids\"][0]):]\n", + "output = processor.decode(generated_tokens, skip_special_tokens=False)\n", + "\n", + "print(f\"Prompt: {prompt}\")\n", + "print(f\"Tools: {tools}\")\n", + "print(f\"Output: {output}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "87d67184", + "metadata": { + "id": "lBnyE8JqOnDc" + }, + "source": [ + "### Developer's Turn\n", + "\n", + "Your application should parse the model's response to extract the function name and argments, and append `tool_calls` and `tool_responses` with the `assistant` role.\n", + "\n", + "> NOTE: Always validate function names and arguments before execution." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0810d0e9", + "metadata": { + "id": "xpRfHIVlOuFx" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"role\": \"assistant\",\n", + " \"tool_calls\": [\n", + " {\n", + " \"function\": {\n", + " \"name\": \"get_current_weather\",\n", + " \"arguments\": {\n", + " \"location\": \"Tokyo, JP\"\n", + " }\n", + " }\n", + " }\n", + " ],\n", + " \"tool_responses\": [\n", + " {\n", + " \"name\": \"get_current_weather\",\n", + " \"response\": {\n", + " \"temperature\": 15,\n", + " \"weather\": \"sunny\"\n", + " }\n", + " }\n", + " ]\n", + "}\n" + ] + } + ], + "source": [ + "import re\n", + "import json\n", + "\n", + "def extract_tool_calls(text):\n", + " def cast(v):\n", + " try: return int(v)\n", + " except:\n", + " try: return float(v)\n", + " except: return {'true': True, 'false': False}.get(v.lower(), v.strip(\"'\\\"\"))\n", + "\n", + " return [{\n", + " \"name\": name,\n", + " \"arguments\": {\n", + " k: cast((v1 or v2).strip())\n", + " for k, v1, v2 in re.findall(r'(\\w+):(?:<\\|\"\\|>(.*?)<\\|\"\\|>|([^,}]*))', args)\n", + " }\n", + " } for name, args in re.findall(r\"<\\|tool_call>call:(\\w+)\\{(.*?)\\}\", text, re.DOTALL)]\n", + "\n", + "calls = extract_tool_calls(output)\n", + "if calls:\n", + " # Call the function and get the result\n", + " #####################################\n", + " # WARNING: This is a demonstration. #\n", + " #####################################\n", + " # Using globals() to call functions dynamically can be dangerous in\n", + " # production. In a real application, you should implement a secure way to\n", + " # map function names to actual function calls, such as a predefined\n", + " # dictionary of allowed tools and their implementations.\n", + " results = [\n", + " {\"name\": c['name'], \"response\": globals()[c['name']](**c['arguments'])}\n", + " for c in calls\n", + " ]\n", + "\n", + " message.append({\n", + " \"role\": \"assistant\",\n", + " \"tool_calls\": [\n", + " {\"function\": call} for call in calls\n", + " ],\n", + " \"tool_responses\": results\n", + " })\n", + " print(json.dumps(message[-1], indent=2))\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "22347163", + "metadata": { + "id": "_wXyQtm8SRfi" + }, + "source": [ + "> Note: For optimal results, append the tool execution result to your message history using the specific format below. This ensures the chat template correctly generates the required token structure (e.g., `response:get_current_weather{temperature:15,weather:<|\"|>sunny<|\"|>}`).\n", + "\n", + "```python\n", + "\"tool_responses\": [\n", + " {\n", + " \"name\": function_name,\n", + " \"response\": function_response\n", + " }\n", + "]\n", + "```\n", + "\n", + "In case of multiple independent requests:\n", + "\n", + "```python\n", + "\"tool_responses\": [\n", + " {\n", + " \"name\": function_name_1,\n", + " \"response\": function_response_1\n", + " },\n", + " {\n", + " \"name\": function_name_2,\n", + " \"response\": function_response_2\n", + " }\n", + "]\n", + "```" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a6cbcd72", + "metadata": { + "id": "qpJrjXgtSh3w" + }, + "source": [ + "### Final Response\n", + "\n", + "Finally, Gemma reads the tool response and reply to the user." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1c8961e8", + "metadata": { + "id": "tS6IBGaGSm0i" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output: The current weather in Tokyo is 15 degrees and sunny.\n" + ] + } + ], + "source": [ + "text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "out = model.generate(**inputs, max_new_tokens=128)\n", + "generated_tokens = out[0][len(inputs[\"input_ids\"][0]):]\n", + "output = processor.decode(generated_tokens, skip_special_tokens=True)\n", + "print(f\"Output: {output}\")\n", + "message[-1][\"content\"] = output" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3196dd09", + "metadata": { + "id": "7jCc58grS81c" + }, + "source": [ + "You can see the full chat history below." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "46cdfec1", + "metadata": { + "id": "k1LQOKusS-BF" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": \"You are a helpful assistant.\"\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"Hey, what's the weather in Tokyo right now?\"\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"tool_calls\": [\n", + " {\n", + " \"function\": {\n", + " \"name\": \"get_current_weather\",\n", + " \"arguments\": {\n", + " \"location\": \"Tokyo, JP\"\n", + " }\n", + " }\n", + " }\n", + " ],\n", + " \"tool_responses\": [\n", + " {\n", + " \"name\": \"get_current_weather\",\n", + " \"response\": {\n", + " \"temperature\": 15,\n", + " \"weather\": \"sunny\"\n", + " }\n", + " }\n", + " ],\n", + " \"content\": \"The current weather in Tokyo is 15 degrees and sunny.\"\n", + " }\n", + "]\n", + "--------------------------------------------------------------------------------\n", + "Output: <|turn>system\n", + "You are a helpful assistant.<|tool>declaration:get_current_weather{description:<|\"|>Gets the current weather in a given location.<|\"|>,parameters:{properties:{location:{description:<|\"|>The city and state, e.g. \"San Francisco, CA\" or \"Tokyo, JP\"<|\"|>,type:<|\"|>STRING<|\"|>},unit:{description:<|\"|>The unit to return the temperature in.<|\"|>,enum:[<|\"|>celsius<|\"|>,<|\"|>fahrenheit<|\"|>],type:<|\"|>STRING<|\"|>}},required:[<|\"|>location<|\"|>],type:<|\"|>OBJECT<|\"|>}}\n", + "<|turn>user\n", + "Hey, what's the weather in Tokyo right now?\n", + "<|turn>model\n", + "<|tool_call>call:get_current_weather{location:<|\"|>Tokyo, JP<|\"|>}<|tool_response>response:get_current_weather{temperature:15,weather:<|\"|>sunny<|\"|>}The current weather in Tokyo is 15 degrees and sunny.\n" + ] + } + ], + "source": [ + "# full history\n", + "print(json.dumps(message, indent=2))\n", + "\n", + "print(\"-\"*80)\n", + "output = processor.decode(out[0], skip_special_tokens=False)\n", + "print(f\"Output: {output}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "e249b292", + "metadata": { + "id": "4sDRdwLclbsH" + }, + "source": [ + "### Function calling with Thinking\n", + "\n", + "By utilizing an internal reasoning process, the model significantly enhances its function-calling accuracy. This allows for more precise decision-making regarding when to trigger a tool and how to define its parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "925328f2", + "metadata": { + "id": "S9-nXig6lsMt" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Role: assistant\n", + "\n", + "=== Thoughts ===\n", + "1. **Analyze the Request:** The user is asking if it's \"good for running now\" in \"Seoul\".\n", + "\n", + "2. **Identify Necessary Information:** To determine if it's good for running, I need current weather information (temperature, precipitation, etc.) for Seoul.\n", + "\n", + "3. **Examine Available Tools:** The available tool is `get_current_weather(location, unit)`.\n", + "\n", + "4. **Determine Tool Arguments:**\n", + " * `location`: The user specified \"Seoul\".\n", + " * `unit`: The user did not specify a unit (Celsius or Fahrenheit).\n", + "\n", + "5. **Formulate the Tool Call:** I need to call `get_current_weather` with the location. Since the user didn't specify a unit, I can either omit it (if the tool defaults are acceptable) or choose a common one. However, the tool definition requires `location` but `unit` is optional.\n", + "\n", + "6. **Construct the Response Strategy:**\n", + " * Call the tool to get the weather data for Seoul.\n", + " * Once the data is received, I can advise the user on whether it's suitable for running.\n", + "\n", + "7. **Generate Tool Call:**\n", + " ```json\n", + " {\n", + " \"toolSpec\": {\n", + " \"name\": \"get_current_weather\",\n", + " \"args\": {\n", + " \"location\": \"Seoul\"\n", + " }\n", + " }\n", + " }\n", + " ```\n", + " (Self-correction: The `unit` parameter is optional in the definition, so just providing the location is sufficient to proceed.)\n", + "\n", + "8. **Final Output Generation:** Present the tool call to the user/system.\n", + "\n", + "=== Tool Calls ===\n", + "[{'type': 'function', 'function': {'name': 'get_current_weather', 'arguments': {'location': 'Seoul'}}}]\n" + ] + } + ], + "source": [ + "prompt = \"Hey, I'm in Seoul. Is it good for running now?\"\n", + "message = [\n", + " {\n", + " \"role\": \"system\", \"content\": \"You are a helpful assistant.\"\n", + " },\n", + " {\n", + " \"role\": \"user\", \"content\": prompt\n", + " },\n", + "]\n", + "\n", + "text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True, enable_thinking=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "input_len = inputs[\"input_ids\"].shape[-1]\n", + "\n", + "out = model.generate(**inputs, max_new_tokens=1024)\n", + "output = processor.decode(out[0][input_len:], skip_special_tokens=False)\n", + "result = processor.parse_response(output)\n", + "\n", + "for key, value in result.items():\n", + " if key == \"role\":\n", + " print(f\"Role: {value}\")\n", + " elif key == \"thinking\":\n", + " print(f\"\\n=== Thoughts ===\\n{value}\")\n", + " elif key == \"content\":\n", + " print(f\"\\n=== Answer ===\\n{value}\")\n", + " elif key == \"tool_calls\":\n", + " print(f\"\\n=== Tool Calls ===\\n{value}\")\n", + " else:\n", + " print(f\"\\n{key}: {value}...\\n\")\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "013a4826", + "metadata": { + "id": "JwBOHXWmpSyE" + }, + "source": [ + "Process the tool call and get the final answer." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "1d7dd4b5", + "metadata": { + "id": "tPgZ2gjWpWoq" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output: The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!\n", + "--------------------------------------------------------------------------------\n", + "Full History\n", + "--------------------------------------------------------------------------------\n", + "[\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": \"You are a helpful assistant.\"\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"Hey, I'm in Seoul. Is it good for running now?\"\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"tool_calls\": [\n", + " {\n", + " \"function\": {\n", + " \"name\": \"get_current_weather\",\n", + " \"arguments\": {\n", + " \"location\": \"Seoul\"\n", + " }\n", + " }\n", + " }\n", + " ],\n", + " \"tool_responses\": [\n", + " {\n", + " \"name\": \"get_current_weather\",\n", + " \"response\": {\n", + " \"temperature\": 15,\n", + " \"weather\": \"sunny\"\n", + " }\n", + " }\n", + " ],\n", + " \"content\": \"The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!\"\n", + " }\n", + "]\n" + ] + } + ], + "source": [ + "calls = extract_tool_calls(output)\n", + "if calls:\n", + " # Call the function and get the result\n", + " #####################################\n", + " # WARNING: This is a demonstration. #\n", + " #####################################\n", + " # Using globals() to call functions dynamically can be dangerous in\n", + " # production. In a real application, you should implement a secure way to\n", + " # map function names to actual function calls, such as a predefined\n", + " # dictionary of allowed tools and their implementations.\n", + " results = [\n", + " {\"name\": c['name'], \"response\": globals()[c['name']](**c['arguments'])}\n", + " for c in calls\n", + " ]\n", + "\n", + " message.append({\n", + " \"role\": \"assistant\",\n", + " \"tool_calls\": [\n", + " {\"function\": call} for call in calls\n", + " ],\n", + " \"tool_responses\": results\n", + " })\n", + "\n", + "text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)\n", + "inputs = processor(text=text, return_tensors=\"pt\").to(model.device)\n", + "out = model.generate(**inputs, max_new_tokens=128)\n", + "generated_tokens = out[0][len(inputs[\"input_ids\"][0]):]\n", + "output = processor.decode(generated_tokens, skip_special_tokens=True)\n", + "print(f\"Output: {output}\")\n", + "message[-1][\"content\"] = output\n", + "\n", + "print(\"-\"*80)\n", + "print(\"Full History\")\n", + "print(\"-\"*80)\n", + "print(json.dumps(message, indent=2))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3e91bbb9", + "metadata": { + "id": "DXar9v3Ew75B" + }, + "source": [ + "## Important Caveat: Automatic vs. Manual Schemas\n", + "\n", + "When relying on automatic conversion from Python functions to JSON schema, the generated output may not always meet specific expectations regarding complex parameters.\n", + "\n", + "If a function uses a custom object (like a Config class) as an argument, the automatic converter may describe it simply as a generic \"object\" without detailing its internal properties.\n", + "\n", + "In these cases, manually defining the JSON schema is preferred to ensure nested properties (such as theme or font_size within a config object) are explicitly defined for the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b57acc02", + "metadata": { + "id": "JFvIsc81w1H8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- [Automatic] ---\n", + "{\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"update_config\",\n", + " \"description\": \"Updates the configuration of the system.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"config\": {\n", + " \"type\": \"object\",\n", + " \"description\": \"A Config object\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"config\"\n", + " ]\n", + " }\n", + " }\n", + "}\n", + "\n", + "--- [Manual Schemas] ---\n", + "{\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"update_config\",\n", + " \"description\": \"Updates the configuration of the system.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"config\": {\n", + " \"type\": \"object\",\n", + " \"description\": \"A Config object\",\n", + " \"properties\": {\n", + " \"theme\": {\n", + " \"type\": \"string\"\n", + " },\n", + " \"font_size\": {\n", + " \"type\": \"number\"\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"config\"\n", + " ]\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import json\n", + "from transformers.utils import get_json_schema\n", + "\n", + "class Config:\n", + " def __init__(self):\n", + " self.theme = \"light\"\n", + " self.font_size = 14\n", + "\n", + "def update_config(config: Config):\n", + " \"\"\"\n", + " Updates the configuration of the system.\n", + "\n", + " Args:\n", + " config: A Config object\n", + "\n", + " Returns:\n", + " True if the configuration was successfully updated, False otherwise.\n", + " \"\"\"\n", + "\n", + "update_config_schema = {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"update_config\",\n", + " \"description\": \"Updates the configuration of the system.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"config\": {\n", + " \"type\": \"object\",\n", + " \"description\": \"A Config object\",\n", + " \"properties\": {\"theme\": {\"type\": \"string\"}, \"font_size\": {\"type\": \"number\"} },\n", + " },\n", + " },\n", + " \"required\": [\"config\"],\n", + " },\n", + " },\n", + " }\n", + "\n", + "print(f\"--- [Automatic] ---\")\n", + "print(json.dumps(get_json_schema(update_config), indent=2))\n", + "\n", + "print(f\"\\n--- [Manual Schemas] ---\")\n", + "print(json.dumps(update_config_schema, indent=2))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "9f249e3d", + "metadata": { + "id": "WTsXHyDnEbxp" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "You have established how to build an application that can call functions with Gemma 4. The workflow is established through a four-stage cycle:\n", + "\n", + "1. **Define Tools**: Create the functions your model can use, specifying arguments and descriptions (e.g., a weather lookup function).\n", + "2. **Model's Turn**: The model receives the user's prompt and a list of available tools, returning a structured function call object instead of plain text.\n", + "3. **Developer's Turn**: The developer parses this output using regular expressions to extract function names and arguments, executes the actual Python code, and appends the results to the chat history using the specific tool role.\n", + "4. **Final Response**: The model processes the tool's execution result to generate a final, natural language answer for the user.\n", + "\n", + "Check out the following documentation for further reading.\n", + "\n", + "- [Run Gemma overview](https://ai.google.dev/gemma/docs/run)\n", + "- [Vision understanding](https://ai.google.dev/gemma/docs/capabilities/vision)\n", + "- [Audio understanding](https://ai.google.dev/gemma/docs/capabilities/audio)\n", + "- [Thinking mode](https://ai.google.dev/gemma/docs/capabilities/thinking)\n" + ] + } + ], + "metadata": { + "colab": { + "name": "function-calling-gemma4.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/google-cookbook/huggingface_text_finetune_qlora.ipynb b/tooling/fine-tuning/google-cookbook/huggingface_text_finetune_qlora.ipynb new file mode 100644 index 0000000..57005b3 --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/huggingface_text_finetune_qlora.ipynb @@ -0,0 +1,1119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "UUYMxQuf8zGu" + }, + "source": [ + "##### Copyright 2025 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "3x6t11lI829b" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WJwmK4C087wa" + }, + "source": [ + "# Fine-Tune Gemma using Hugging Face Transformers and QloRA" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f9673bd6" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e624ec07" + }, + "source": [ + "This guide walks you through how to fine-tune Gemma on a custom text-to-sql dataset using Hugging Face [Transformers](https://huggingface.co/docs/transformers/index) and [TRL](https://huggingface.co/docs/trl/index). You will learn:\n", + "\n", + "- What is Quantized Low-Rank Adaptation (QLoRA)\n", + "- Setup development environment\n", + "- Create and prepare the fine-tuning dataset\n", + "- Fine-tune Gemma using TRL and the SFTTrainer\n", + "- Test Model Inference and generate SQL queries\n", + "\n", + "Note: This guide was created to run on a Google colaboratory account using a NVIDIA T4 GPU with 16GB and Gemma 1B, but can be adapted to run on bigger GPUs and bigger models.\n", + "\n", + "## What is Quantized Low-Rank Adaptation (QLoRA)\n", + "\n", + "This guide demonstrates the use of [Quantized Low-Rank Adaptation (QLoRA)](https://arxiv.org/abs/2305.14314), which emerged as a popular method to efficiently fine-tune LLMs as it reduces computational resource requirements while maintaining high performance. In QloRA, the pretrained model is quantized to 4-bit and the weights are frozen. Then trainable adapter layers (LoRA) are attached and only the adapter layers are trained. Afterwards, the adapter weights can be merged with the base model or kept as a separate adapter.\n", + "\n", + "## Setup development environment\n", + "\n", + "The first step is to install Hugging Face Libraries, including TRL, and datasets to fine-tune open model, including different RLHF and alignment techniques." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ba51aa79" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: torch in /usr/local/lib/python3.12/dist-packages (2.10.0+cu128)\n", + "Requirement already satisfied: tensorboard in /usr/local/lib/python3.12/dist-packages (2.19.0)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch) (3.25.2)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.12/dist-packages (from torch) (4.15.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch) (75.2.0)\n", + "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch) (1.14.0)\n", + "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch) (3.6.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch) (3.1.6)\n", + "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2025.3.0)\n", + "Requirement already satisfied: cuda-bindings==12.9.4 in /usr/local/lib/python3.12/dist-packages (from torch) (12.9.4)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.93)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch) (9.10.2.21)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.4.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /usr/local/lib/python3.12/dist-packages (from torch) (11.3.3.83)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /usr/local/lib/python3.12/dist-packages (from torch) (10.3.9.90)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /usr/local/lib/python3.12/dist-packages (from torch) (11.7.3.90)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.5.8.93)\n", + "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch) (0.7.1)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2.27.5)\n", + "Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.12/dist-packages (from torch) (3.4.5)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.93)\n", + "Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /usr/local/lib/python3.12/dist-packages (from torch) (1.13.1.3)\n", + "Requirement already satisfied: triton==3.6.0 in /usr/local/lib/python3.12/dist-packages (from torch) (3.6.0)\n", + "Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.12/dist-packages (from cuda-bindings==12.9.4->torch) (1.4.3)\n", + "Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (1.4.0)\n", + "Requirement already satisfied: grpcio>=1.48.2 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (1.78.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (3.10.2)\n", + "Requirement already satisfied: numpy>=1.12.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (2.0.2)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from tensorboard) (26.0)\n", + "Requirement already satisfied: protobuf!=4.24.0,>=3.19.6 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (5.29.6)\n", + "Requirement already satisfied: six>1.9 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (1.17.0)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from tensorboard) (3.1.6)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch) (1.3.0)\n", + "Requirement already satisfied: markupsafe>=2.1.1 in /usr/local/lib/python3.12/dist-packages (from werkzeug>=1.0.1->tensorboard) (3.0.3)\n", + "Requirement already satisfied: datasets in /usr/local/lib/python3.12/dist-packages (4.0.0)\n", + "Requirement already satisfied: accelerate in /usr/local/lib/python3.12/dist-packages (1.13.0)\n", + "Collecting evaluate\n", + " Downloading evaluate-0.4.6-py3-none-any.whl.metadata (9.5 kB)\n", + "Collecting bitsandbytes\n", + " Downloading bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl.metadata (10 kB)\n", + "Collecting trl\n", + " Downloading trl-1.0.0-py3-none-any.whl.metadata (11 kB)\n", + "Requirement already satisfied: peft in /usr/local/lib/python3.12/dist-packages (0.18.1)\n", + "Requirement already satisfied: protobuf in /usr/local/lib/python3.12/dist-packages (5.29.6)\n", + "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.12/dist-packages (0.2.1)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from datasets) (3.25.2)\n", + "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.12/dist-packages (from datasets) (2.0.2)\n", + "Requirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (18.1.0)\n", + "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.3.8)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (from datasets) (2.2.2)\n", + "Requirement already satisfied: requests>=2.32.2 in /usr/local/lib/python3.12/dist-packages (from datasets) (2.32.4)\n", + "Requirement already satisfied: tqdm>=4.66.3 in /usr/local/lib/python3.12/dist-packages (from datasets) (4.67.3)\n", + "Requirement already satisfied: xxhash in /usr/local/lib/python3.12/dist-packages (from datasets) (3.6.0)\n", + "Requirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.70.16)\n", + "Requirement already satisfied: fsspec<=2025.3.0,>=2023.1.0 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2025.3.0)\n", + "Requirement already satisfied: huggingface-hub>=0.24.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (1.7.1)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from datasets) (26.0)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from datasets) (6.0.3)\n", + "Requirement already satisfied: psutil in /usr/local/lib/python3.12/dist-packages (from accelerate) (5.9.5)\n", + "Requirement already satisfied: torch>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from accelerate) (2.10.0+cu128)\n", + "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.12/dist-packages (from accelerate) (0.7.0)\n", + "Collecting datasets\n", + " Downloading datasets-4.8.4-py3-none-any.whl.metadata (19 kB)\n", + "Requirement already satisfied: transformers>=4.56.2 in /usr/local/lib/python3.12/dist-packages (from trl) (5.5.0.dev0)\n", + "Collecting pyarrow>=21.0.0 (from datasets)\n", + " Downloading pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.1 kB)\n", + "Requirement already satisfied: httpx<1.0.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.28.1)\n", + "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (3.13.3)\n", + "Requirement already satisfied: anyio in /usr/local/lib/python3.12/dist-packages (from httpx<1.0.0->datasets) (4.12.1)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.12/dist-packages (from httpx<1.0.0->datasets) (2026.2.25)\n", + "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.12/dist-packages (from httpx<1.0.0->datasets) (1.0.9)\n", + "Requirement already satisfied: idna in /usr/local/lib/python3.12/dist-packages (from httpx<1.0.0->datasets) (3.11)\n", + "Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.12/dist-packages (from httpcore==1.*->httpx<1.0.0->datasets) (0.16.0)\n", + "Requirement already satisfied: hf-xet<2.0.0,>=1.4.2 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.24.0->datasets) (1.4.2)\n", + "Requirement already satisfied: typer in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.24.0->datasets) (0.24.1)\n", + "Requirement already satisfied: typing-extensions>=4.1.0 in /usr/local/lib/python3.12/dist-packages (from huggingface-hub>=0.24.0->datasets) (4.15.0)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (3.4.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (2.5.0)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (75.2.0)\n", + "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (1.14.0)\n", + "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.6.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.1.6)\n", + "Requirement already satisfied: cuda-bindings==12.9.4 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.9.4)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.93)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.90)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.90)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (9.10.2.21)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.4.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (11.3.3.83)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (10.3.9.90)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (11.7.3.90)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.5.8.93)\n", + "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (0.7.1)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (2.27.5)\n", + "Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.4.5)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.90)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (12.8.93)\n", + "Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (1.13.1.3)\n", + "Requirement already satisfied: triton==3.6.0 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->accelerate) (3.6.0)\n", + "Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.12/dist-packages (from cuda-bindings==12.9.4->torch>=2.0.0->accelerate) (1.4.3)\n", + "Requirement already satisfied: regex>=2025.10.22 in /usr/local/lib/python3.12/dist-packages (from transformers>=4.56.2->trl) (2025.11.3)\n", + "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from transformers>=4.56.2->trl) (0.22.2)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2025.3)\n", + "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2.6.1)\n", + "Requirement already satisfied: aiosignal>=1.4.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.4.0)\n", + "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (25.4.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.8.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (6.7.1)\n", + "Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (0.4.1)\n", + "Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.23.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=2.0.0->accelerate) (1.3.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=2.0.0->accelerate) (3.0.3)\n", + "Requirement already satisfied: click>=8.2.1 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface-hub>=0.24.0->datasets) (8.3.1)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface-hub>=0.24.0->datasets) (1.5.4)\n", + "Requirement already satisfied: rich>=12.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface-hub>=0.24.0->datasets) (13.9.4)\n", + "Requirement already satisfied: annotated-doc>=0.0.2 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface-hub>=0.24.0->datasets) (0.0.4)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->huggingface-hub>=0.24.0->datasets) (4.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->huggingface-hub>=0.24.0->datasets) (2.19.2)\n", + "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer->huggingface-hub>=0.24.0->datasets) (0.1.2)\n", + "Downloading evaluate-0.4.6-py3-none-any.whl (84 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m84.1/84.1 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl (60.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.7/60.7 MB\u001b[0m \u001b[31m38.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading trl-1.0.0-py3-none-any.whl (630 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m630.8/630.8 kB\u001b[0m \u001b[31m64.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading datasets-4.8.4-py3-none-any.whl (526 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m527.0/527.0 kB\u001b[0m \u001b[31m46.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl (47.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.6/47.6 MB\u001b[0m \u001b[31m55.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: pyarrow, bitsandbytes, datasets, evaluate, trl\n", + " Attempting uninstall: pyarrow\n", + " Found existing installation: pyarrow 18.1.0\n", + " Uninstalling pyarrow-18.1.0:\n", + " Successfully uninstalled pyarrow-18.1.0\n", + " Attempting uninstall: datasets\n", + " Found existing installation: datasets 4.0.0\n", + " Uninstalling datasets-4.0.0:\n", + " Successfully uninstalled datasets-4.0.0\n", + "Successfully installed bitsandbytes-0.49.2 datasets-4.8.4 evaluate-0.4.6 pyarrow-23.0.1 trl-1.0.0\n" + ] + } + ], + "source": [ + "# Install Pytorch & other libraries\n", + "%pip install torch tensorboard\n", + "\n", + "# Install Transformers\n", + "%pip install transformers\n", + "\n", + "# Install Hugging Face libraries\n", + "%pip install datasets accelerate evaluate bitsandbytes trl peft protobuf sentencepiece\n", + "\n", + "# COMMENT IN: if you are running on a GPU that supports BF16 data type and flash attn, such as NVIDIA L4 or NVIDIA A100\n", + "#%pip install flash-attn" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7ef3d54b" + }, + "source": [ + "_Note: If you are using a GPU with Ampere architecture (such as NVIDIA L4) or newer, you can use Flash attention. Flash Attention is a method that significantly speeds computations up and reduces memory usage from quadratic to linear in sequence length, leading to acelerating training up to 3x. Learn more at [FlashAttention](https://github.com/Dao-AILab/flash-attention/tree/main)._\n", + "\n", + "You need a valid Hugging Face Token to publish your model. If you are running inside a Google Colab, you can securely use your Hugging Face Token using the Colab secrets otherwise you can set the token as directly in the `login` method. Make sure your token has write access too, as you push your model to the Hub during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b6d79c93" + }, + "outputs": [], + "source": [ + "# Login into Hugging Face Hub\n", + "from huggingface_hub import login\n", + "login()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "42c60525" + }, + "source": [ + "## Create and prepare the fine-tuning dataset\n", + "\n", + "When fine-tuning LLMs, it is important to know your use case and the task you want to solve. This helps you create a dataset to fine-tune your model. If you haven't defined your use case yet, you might want to go back to the drawing board.\n", + "\n", + "As an example, this guide focuses on the following use case:\n", + "\n", + "- Fine-tune a natural language to SQL model for seamless integration into a data analysis tool. The objective is to significantly reduce the time and expertise required for SQL query generation, enabling even non-technical users to extract meaningful insights from data.\n", + "\n", + "Text-to-SQL can be a good use case for fine-tuning LLMs, as it is a complex task that requires a lot of (internal) knowledge about the data and the SQL language.\n", + "\n", + "Once you have determined that fine-tuning is the right solution, you need a dataset to fine-tune. The dataset should be a diverse set of demonstrations of the task(s) you want to solve. There are several ways to create such a dataset, including:\n", + "\n", + "- Using existing open-source datasets, such as [Spider](https://huggingface.co/datasets/spider)\n", + "- Using synthetic datasets created by LLMs, such as [Alpaca](https://huggingface.co/datasets/tatsu-lab/alpaca)\n", + "- Using datasets created by humans, such as [Dolly](https://huggingface.co/datasets/databricks/databricks-dolly-15k).\n", + "- Using a combination of the methods, such as [Orca](https://huggingface.co/datasets/Open-Orca/OpenOrca)\n", + "\n", + "Each of the methods has its own advantages and disadvantages and depends on the budget, time, and quality requirements. For example, using an existing dataset is the easiest but might not be tailored to your specific use case, while using domain experts might be the most accurate but can be time-consuming and expensive. It is also possible to combine several methods to create an instruction dataset, as shown in [Orca: Progressive Learning from Complex Explanation Traces of GPT-4.](https://arxiv.org/abs/2306.02707)\n", + "\n", + "This guide uses an already existing dataset ([philschmid/gretel-synthetic-text-to-sql](https://huggingface.co/datasets/philschmid/gretel-synthetic-text-to-sql)), a high quality synthetic Text-to-SQL dataset including natural language instructions, schema definitions, reasoning and the corresponding SQL query.\n", + "\n", + "[Hugging Face TRL](https://huggingface.co/docs/trl/en/index) supports automatic templating of conversation dataset formats. This means you only need to convert your dataset into the right json objects, and `trl` takes care of templating and putting it into the right format.\n", + "\n", + "```\n", + "{\"messages\": [{\"role\": \"system\", \"content\": \"You are...\"}, {\"role\": \"user\", \"content\": \"...\"}, {\"role\": \"assistant\", \"content\": \"...\"}]}\n", + "{\"messages\": [{\"role\": \"system\", \"content\": \"You are...\"}, {\"role\": \"user\", \"content\": \"...\"}, {\"role\": \"assistant\", \"content\": \"...\"}]}\n", + "{\"messages\": [{\"role\": \"system\", \"content\": \"You are...\"}, {\"role\": \"user\", \"content\": \"...\"}, {\"role\": \"assistant\", \"content\": \"...\"}]}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c4ecf6db" + }, + "source": [ + "The [philschmid/gretel-synthetic-text-to-sql](https://huggingface.co/datasets/philschmid/gretel-synthetic-text-to-sql) contains over 100k samples. To keep the guide small, it is downsampled to only use 10,000 samples.\n", + "\n", + "You can now use the Hugging Face Datasets library to load the dataset and create a prompt template to combine the natural language instruction, schema definition and add a system message for your assistant." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "40c3a2cf" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e1947559b8c42f0ab2cf28efc6535b7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0%| | 0.00/737 [00:00 and the , generate the corresponding SQL command to retrieve the desired data, considering the query's syntax, semantics, and schema constraints.\\n\\n\\nCREATE TABLE Menu (id INT PRIMARY KEY, name VARCHAR(255), category VARCHAR(255), price DECIMAL(5,2));\\n\\n\\n\\nCalculate the average price of all menu items in the Vegan category\\n\\n\", 'role': 'user'}\n", + "{'content': \"SELECT AVG(price) FROM Menu WHERE category = 'Vegan';\", 'role': 'assistant'}\n" + ] + } + ], + "source": [ + "from datasets import load_dataset\n", + "\n", + "# System message for the assistant\n", + "system_message = \"\"\"You are a text to SQL query translator. Users will ask you questions in English and you will generate a SQL query based on the provided SCHEMA.\"\"\"\n", + "\n", + "# User prompt that combines the user query and the schema\n", + "user_prompt = \"\"\"Given the and the , generate the corresponding SQL command to retrieve the desired data, considering the query's syntax, semantics, and schema constraints.\n", + "\n", + "\n", + "{context}\n", + "\n", + "\n", + "\n", + "{question}\n", + "\n", + "\"\"\"\n", + "def create_conversation(sample):\n", + " return {\n", + " \"messages\": [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt.format(question=sample[\"sql_prompt\"], context=sample[\"sql_context\"])},\n", + " {\"role\": \"assistant\", \"content\": sample[\"sql\"]}\n", + " ]\n", + " }\n", + "\n", + "# Load dataset from the hub\n", + "dataset = load_dataset(\"philschmid/gretel-synthetic-text-to-sql\", split=\"train\")\n", + "dataset = dataset.shuffle().select(range(12500))\n", + "\n", + "# Convert dataset to OAI messages\n", + "dataset = dataset.map(create_conversation, remove_columns=dataset.features,batched=False)\n", + "# split dataset into 80% training samples and 20% test samples\n", + "dataset = dataset.train_test_split(test_size=0.2)\n", + "\n", + "# Print formatted user prompt\n", + "for item in dataset[\"train\"][0][\"messages\"]:\n", + " print(item)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c0eb2e06" + }, + "source": [ + "## Fine-tune Gemma using TRL and the SFTTrainer\n", + "\n", + "You are now ready to fine-tune your model. Hugging Face TRL [SFTTrainer](https://huggingface.co/docs/trl/sft_trainer) makes it straightforward to supervise fine-tune open LLMs. The `SFTTrainer` is a subclass of the `Trainer` from the `transformers` library and supports all the same features, including logging, evaluation, and checkpointing, but adds additional quality of life features, including:\n", + "\n", + "* Dataset formatting, including conversational and instruction formats\n", + "* Training on completions only, ignoring prompts\n", + "* Packing datasets for more efficient training\n", + "* Parameter-efficient fine-tuning (PEFT) support including QloRA\n", + "* Preparing the model and tokenizer for conversational fine-tuning (such as adding special tokens)\n", + "\n", + "The following code loads the Gemma model and tokenizer from Hugging Face and initializes the quantization configuration." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "18069ed2" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0b17e7e80e884df59a0bea8b6f6802e9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "config.json: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f5cfbb54cfec4e7d93ed2eb0d5b2e62a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00= 8:\n", + " torch_dtype = torch.bfloat16\n", + "else:\n", + " torch_dtype = torch.float16\n", + "\n", + "# Define model init arguments\n", + "model_kwargs = dict(\n", + " dtype=torch_dtype,\n", + " device_map=\"auto\", # Let torch decide how to load the model\n", + ")\n", + "\n", + "# BitsAndBytesConfig: Enables 4-bit quantization to reduce model size/memory usage\n", + "model_kwargs[\"quantization_config\"] = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_quant_type='nf4',\n", + " bnb_4bit_compute_dtype=model_kwargs['dtype'],\n", + " bnb_4bit_quant_storage=model_kwargs['dtype'],\n", + ")\n", + "\n", + "# Load model and tokenizer\n", + "model = AutoModelForImageTextToText.from_pretrained(model_id, **model_kwargs)\n", + "tokenizer = AutoTokenizer.from_pretrained(\"google/gemma-4-E2B-it\") # Load the Instruction Tokenizer to use the official Gemma template" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "37ec1d1b" + }, + "source": [ + "The `SFTTrainer` supports a built-in integration with `peft`, which makes it straightforward to efficiently tune LLMs using QLoRA. You only need to create a `LoraConfig` and provide it to the trainer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ed00e846" + }, + "outputs": [], + "source": [ + "from peft import LoraConfig\n", + "\n", + "peft_config = LoraConfig(\n", + " lora_alpha=16,\n", + " lora_dropout=0.05,\n", + " r=16,\n", + " bias=\"none\",\n", + " target_modules=\"all-linear\",\n", + " task_type=\"CAUSAL_LM\",\n", + " modules_to_save=[\"lm_head\", \"embed_tokens\"], # make sure to save the lm_head and embed_tokens as you train the special tokens\n", + " ensure_weight_tying=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bbd9fc1b" + }, + "source": [ + "Before you can start your training, you need to define the hyperparameter you want to use in a `SFTConfig` instance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "989be3c1" + }, + "outputs": [], + "source": [ + "import torch\n", + "from trl import SFTConfig\n", + "\n", + "args = SFTConfig(\n", + " output_dir=\"gemma-text-to-sql\", # directory to save and repository id\n", + " max_length=512, # max length for model and packing of the dataset\n", + " num_train_epochs=3, # number of training epochs\n", + " per_device_train_batch_size=1, # batch size per device during training\n", + " optim=\"adamw_torch_fused\", # use fused adamw optimizer\n", + " logging_steps=10, # log every 10 steps\n", + " save_strategy=\"epoch\", # save checkpoint every epoch\n", + " eval_strategy=\"epoch\", # evaluate checkpoint every epoch\n", + " learning_rate=5e-5, # learning rate\n", + " fp16=True if model.dtype == torch.float16 else False, # use float16 precision\n", + " bf16=True if model.dtype == torch.bfloat16 else False, # use bfloat16 precision\n", + " max_grad_norm=0.3, # max gradient norm based on QLoRA paper\n", + " lr_scheduler_type=\"constant\", # use constant learning rate scheduler\n", + " push_to_hub=True, # push model to hub\n", + " report_to=\"tensorboard\", # report metrics to tensorboard\n", + " dataset_kwargs={\n", + " \"add_special_tokens\": False, # Template with special tokens\n", + " \"append_concat_token\": True, # Add EOS token as separator token between examples\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dd88e798" + }, + "source": [ + "You now have every building block you need to create your `SFTTrainer` to start the training of your model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ade95df7" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9061644033864e22a5cd8905051b6637", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tokenizing train dataset: 0%| | 0/10000 [00:00\n", + " \n", + " \n", + " [1875/1875 28:32, Epoch 3/3]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.5366520.530056
20.4307350.464053
30.3863580.443147

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Start training, the model will be automatically saved to the Hub and the output directory\n", + "trainer.train()\n", + "\n", + "# Save the final model again to the Hugging Face Hub\n", + "trainer.save_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b47b9733" + }, + "source": [ + "Before you can test your model, make sure to free the memory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "40a32ed7" + }, + "outputs": [], + "source": [ + "# free the memory again\n", + "del model\n", + "del trainer\n", + "torch.cuda.empty_cache()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "862e9728" + }, + "source": [ + "When using QLoRA, you only train adapters and not the full model. This means when saving the model during training you only save the adapter weights and not the full model. If you want to save the full model, which makes it easier to use with serving stacks like vLLM or TGI, you can merge the adapter weights into the model weights using the `merge_and_unload` method and then save the model with the `save_pretrained` method. This saves a default model, which can be used for inference.\n", + "\n", + "Note: It requires more than 30GB of CPU Memory when you want to merge the adapter into the model. You can skip this and continue with Test Model Inference." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "761e324b" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b58cae40ed3d40d89be8b4065548a69d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading weights: 0%| | 0/2011 [00:00<|turn>system\n", + "You are a text to SQL query translator. Users will ask you questions in English and you will generate a SQL query based on the provided SCHEMA.\n", + "<|turn>user\n", + "Given the and the , generate the corresponding SQL command to retrieve the desired data, considering the query's syntax, semantics, and schema constraints.\n", + "\n", + "\n", + "CREATE TABLE broadband_plans (plan_id INT, plan_name VARCHAR(255), download_speed INT, upload_speed INT, price DECIMAL(5,2));\n", + "\n", + "\n", + "\n", + "Delete a broadband plan from the 'broadband_plans' table\n", + "\n", + "<|turn>model\n", + "\n", + "Context:\n", + " CREATE TABLE broadband_plans (plan_id INT, plan_name VARCHAR(255), download_speed INT, upload_speed INT, price DECIMAL(5,2));\n", + "Query:\n", + " Delete a broadband plan from the 'broadband_plans' table\n", + "Original Answer:\n", + "DELETE FROM broadband_plans WHERE plan_id = 3001;\n", + "Generated Answer:\n", + "DELETE FROM broadband_plans\n", + "WHERE plan_name = 'Basic';\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import re\n", + "from transformers import pipeline, GenerationConfig\n", + "\n", + "config = GenerationConfig.from_pretrained(model_id)\n", + "config.max_new_tokens = 256\n", + "\n", + "# Load the model and tokenizer into the pipeline\n", + "pipe = pipeline(\"text-generation\", model=model, tokenizer=tokenizer)\n", + "\n", + "# Load a random sample from the test dataset\n", + "rand_idx = randint(0, len(dataset[\"test\"]))\n", + "test_sample = dataset[\"test\"][rand_idx]\n", + "\n", + "# Convert as test example into a prompt with the Gemma template\n", + "prompt = pipe.tokenizer.apply_chat_template(test_sample[\"messages\"][:2], tokenize=False, add_generation_prompt=True)\n", + "print(prompt)\n", + "\n", + "# Generate our SQL query.\n", + "outputs = pipe(prompt, generation_config=config)\n", + "\n", + "# Extract the user query and original answer\n", + "print(f\"Context:\\n\", re.search(r'\\n(.*?)\\n', test_sample['messages'][1]['content'], re.DOTALL).group(1).strip())\n", + "print(f\"Query:\\n\", re.search(r'\\n(.*?)\\n', test_sample['messages'][1]['content'], re.DOTALL).group(1).strip())\n", + "print(f\"Original Answer:\\n{test_sample['messages'][2]['content']}\")\n", + "print(f\"Generated Answer:\\n{outputs[0]['generated_text'][len(prompt):].strip()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6f8ff452" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "This tutorial covered how to fine-tune a Gemma model using TRL and QLoRA. Check out the following docs next:\n", + "\n", + "* Learn how to [generate text with a Gemma model](https://ai.google.dev/gemma/docs/get_started).\n", + "* Learn how to [fine-tune Gemma for vision tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_vision_finetune_qlora).\n", + "* Learn how to perform [distributed fine-tuning and inference on a Gemma model](https://ai.google.dev/gemma/docs/core/distributed_tuning).\n", + "* Learn how to [use Gemma open models with Vertex AI](https://cloud.google.com/vertex-ai/docs/generative-ai/open-models/use-gemma).\n", + "* Learn how to [fine-tune Gemma using KerasNLP and deploy to Vertex AI](https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/community/model_garden/model_garden_gemma_kerasnlp_to_vertexai.ipynb)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "huggingface_text_finetune_qlora.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/google-cookbook/huggingface_text_full_finetune.ipynb b/tooling/fine-tuning/google-cookbook/huggingface_text_full_finetune.ipynb new file mode 100644 index 0000000..c9b253d --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/huggingface_text_full_finetune.ipynb @@ -0,0 +1,937 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "926bada6" + }, + "source": [ + "##### Copyright 2025 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "a110dfce" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f9673bd6" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e624ec07" + }, + "source": [ + "# Full Model Fine-Tune using Hugging Face Transformers\n", + "\n", + "This guide walks you through how to fine-tune Gemma on a mobile game NPC dataset using Hugging Face [Transformers](https://huggingface.co/docs/transformers/index) and [TRL](https://huggingface.co/docs/trl/index). You will learn:\n", + "\n", + "- Setup development environment\n", + "- Prepare the fine-tuning dataset\n", + "- Full model fine-tuning Gemma using TRL and the SFTTrainer\n", + "- Test Model Inference and vibe checks\n", + "\n", + "> Note: This guide was created to run on a Google colaboratory account using a NVIDIA T4 GPU with 16GB and Gemma 270m, but can be adapted to run on bigger GPUs and bigger models.\n", + "\n", + "## Setup development environment\n", + "\n", + "The first step is to install Hugging Face Libraries, including TRL, and datasets to fine-tune open model, including different RLHF and alignment techniques." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BEK9IfKBqQaA" + }, + "outputs": [], + "source": [ + "# Install Pytorch & other libraries\n", + "%pip install torch tensorboard\n", + "\n", + "# Install Hugging Face libraries\n", + "%pip install transformers datasets accelerate evaluate trl protobuf sentencepiece\n", + "\n", + "# COMMENT IN: if you are running on a GPU that supports BF16 data type and flash attn, such as NVIDIA L4 or NVIDIA A100\n", + "#% pip install flash-attn" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7ef3d54b" + }, + "source": [ + "> _Note: If you are using a GPU with Ampere architecture (such as NVIDIA L4) or newer, you can use Flash attention. Flash Attention is a method that significantly speeds computations up and reduces memory usage from quadratic to linear in sequence length, leading to acelerating training up to 3x. Learn more at [FlashAttention](https://github.com/Dao-AILab/flash-attention/tree/main)._\n", + "\n", + "Before you can start training, you have to make sure that you accepted the terms of use for Gemma. You can accept the license on [Hugging Face](http://huggingface.co/google/gemma-3-270m-it) by clicking on the Agree and access repository button on the model page at: http://huggingface.co/google/gemma-3-270m-it\n", + "\n", + "After you have accepted the license, you need a valid Hugging Face Token to access the model. If you are running inside a Google Colab, you can securely use your Hugging Face Token using the Colab secrets otherwise you can set the token as directly in the `login` method. Make sure your token has write access too, as you push your model to the Hub during training." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "b6d79c93" + }, + "outputs": [], + "source": [ + "from google.colab import userdata\n", + "from huggingface_hub import login\n", + "\n", + "# Login into Hugging Face Hub\n", + "hf_token = userdata.get('HF_TOKEN') # If you are running inside a Google Colab\n", + "login(hf_token)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xnbflqW6YJls" + }, + "source": [ + "You can keep the results on Colab's local virtual machine. However, we highly recommend saving your intermediate results to your Google Drive. This ensures your training results are safe and allows you to easily compare and select the best model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jUUs-NjaYLf7" + }, + "outputs": [], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3bDMa9CMCdzv" + }, + "source": [ + "Select the base model to fine-tune, adjust the checkpoint directory and the learning rate." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "6J3PWm4SzoSw" + }, + "outputs": [], + "source": [ + "base_model = \"google/gemma-3-270m-it\" # @param [\"google/gemma-3-270m-it\",\"google/gemma-3-1b-it\",\"google/gemma-3-4b-it\",\"google/gemma-3-12b-it\",\"google/gemma-3-27b-it\"] {\"allow-input\":true}\n", + "checkpoint_dir = \"/content/drive/MyDrive/MyGemmaNPC\" #@param {type:\"string\"}\n", + "learning_rate = 5e-5 #@param {type:\"number\"}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "42c60525" + }, + "source": [ + "## Create and prepare the fine-tuning dataset\n", + "\n", + "The [bebechien/MobileGameNPC](https://huggingface.co/datasets/bebechien/MobileGameNPC) dataset provides a small sample conversations between a player and two Alien NPCs (a Martian and a Venusian), each with a unique speaking style. For instance, the Martian NPC speaks with an accent that replaces 's' sounds with 'z', uses 'da' for 'the', 'diz' for 'this', and includes occasional clicks like `*k'tak*`.\n", + "\n", + "This dataset demonstrates a key principle for fine-tuning: the required dataset size depends on the desired output.\n", + "\n", + "- To teach the model a stylistic variation of a language it already knows, such as the Martian's accent, a small dataset with as few as 10 to 20 examples can be sufficient.\n", + "- However, to teach the model a completely new or mixed alien language, a significantly larger dataset would be required." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "bc3BYl72pWhp" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2fee8582aef54ffba9a9250c425c0983", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0%| | 0.00/141 [00:00\n", + " \n", + " \n", + " [25/25 04:13, Epoch 5/5]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
14.3642003.838531
22.6691003.580106
31.7470003.666415
40.7799004.499709
50.4496005.471325

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Start training, the model will be automatically saved to the Hub and the output directory\n", + "trainer.train()\n", + "\n", + "# Save the final model again to the Hugging Face Hub\n", + "trainer.save_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xll8zZ3_u8Mt" + }, + "source": [ + "To plot the training and validation losses, you would typically extract these values from the `TrainerState` object or the logs generated during training.\n", + "\n", + "Libraries like Matplotlib can then be used to visualize these values over training steps or epochs. The x-asis would represent the training steps or epochs, and the y-axis would represent the corresponding loss values." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "vPN-DTopaUIy" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHHCAYAAACRAnNyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb0FJREFUeJzt3XdYU9cfBvD3JkCYYU9BkKGAgFuruEddpa4ORxWtrdWqrW3tbhXtsK0dttqqXdr2V7XVuloHjrpHxYW4F0sEEZC9k/v7IxJFUBkJN8D7eZ48kpOb3G8OEV7OPfdcQRRFEUREREQGSCZ1AURERET3w6BCREREBotBhYiIiAwWgwoREREZLAYVIiIiMlgMKkRERGSwGFSIiIjIYDGoEBERkcFiUCEiIiKDxaBCBmH8+PHw8vKq0XMjIiIgCIJuCzIwcXFxEAQBy5cvr/N9C4KAiIgI7f3ly5dDEATExcU99LleXl4YP368TuupzWeFCLjzGT569KjUpVAVMKjQAwmCUKXb7t27pS610XvppZcgCAIuX758323effddCIKAU6dO1WFl1Xf9+nVERETg5MmTUpeiVRYWP//8c6lLMXhlQeB+t8OHD0tdItUjRlIXQIbtt99+K3f/119/xfbt2yu0BwQE1Go/P/zwA9RqdY2e+9577+Gtt96q1f4bgjFjxmDhwoVYsWIFZs2aVek2K1euRHBwMEJCQmq8n7Fjx2LkyJFQKBQ1fo2HuX79OubMmQMvLy+0bt263GO1+axQ3Zo7dy6aNWtWod3X11eCaqi+YlChB3rmmWfK3T98+DC2b99eof1e+fn5MDc3r/J+jI2Na1QfABgZGcHIiB/lTp06wdfXFytXrqw0qBw6dAixsbH45JNParUfuVwOuVxeq9eojdp8Vkh38vLyYGFh8cBtBg4ciPbt29dRRdRQ8dAP1VrPnj0RFBSEY8eOoXv37jA3N8c777wDANiwYQMGDx4MNzc3KBQK+Pj44IMPPoBKpSr3GvfOO7h7mP3777+Hj48PFAoFOnTogKioqHLPrWyOiiAImDZtGtavX4+goCAoFAq0bNkSW7durVD/7t270b59e5iamsLHxwdLly6t8ryXffv24cknn0TTpk2hUCjg4eGBV155BQUFBRXen6WlJZKSkjB06FBYWlrC0dERM2fOrNAXmZmZGD9+PKytrWFjY4Pw8HBkZmY+tBZAM6py/vx5HD9+vMJjK1asgCAIGDVqFIqLizFr1iy0a9cO1tbWsLCwQLdu3bBr166H7qOyOSqiKOLDDz+Eu7s7zM3N0atXL5w5c6bCczMyMjBz5kwEBwfD0tISSqUSAwcORHR0tHab3bt3o0OHDgCACRMmaA8XlM3PqWyOSl5eHl577TV4eHhAoVCgRYsW+Pzzz3HvxeGr87moqdTUVEycOBHOzs4wNTVFq1at8Msvv1TYbtWqVWjXrh2srKygVCoRHByMr7/+Wvt4SUkJ5syZAz8/P5iamsLe3h5du3bF9u3bH7j/su/P3r178cILL8De3h5KpRLjxo3DrVu3Kmy/ZcsWdOvWDRYWFrCyssLgwYMrfO/KPr9XrlzBoEGDYGVlhTFjxtSwh+64+//5V199BU9PT5iZmaFHjx44ffp0he3//fdfba02NjYYMmQIzp07V2G7pKQkTJw4Uftzp1mzZpgyZQqKi4vLbVdUVIRXX30Vjo6OsLCwwLBhw3Dz5s1avy/SLf4ZSjqRnp6OgQMHYuTIkXjmmWfg7OwMQPND09LSEq+++iosLS3x77//YtasWcjOzsb8+fMf+rorVqxATk4OXnjhBQiCgM8++wzDhw/H1atXH/qX9f79+7F27Vq8+OKLsLKywjfffIMRI0YgISEB9vb2AIATJ05gwIABcHV1xZw5c6BSqTB37lw4OjpW6X2vXr0a+fn5mDJlCuzt7XHkyBEsXLgQ165dw+rVq8ttq1Kp0L9/f3Tq1Amff/45duzYgS+++AI+Pj6YMmUKAM0v/CFDhmD//v2YPHkyAgICsG7dOoSHh1epnjFjxmDOnDlYsWIF2rZtW27ff/75J7p164amTZsiLS0NP/74I0aNGoXnn38eOTk5+Omnn9C/f38cOXKkwuGWh5k1axY+/PBDDBo0CIMGDcLx48fx6KOPVvjFcPXqVaxfvx5PPvkkmjVrhhs3bmDp0qXo0aMHzp49Czc3NwQEBGDu3LmYNWsWJk2ahG7dugEAunTpUum+RVHE448/jl27dmHixIlo3bo1IiMj8frrryMpKQlfffVVue2r8rmoqYKCAvTs2ROXL1/GtGnT0KxZM6xevRrjx49HZmYmXn75ZQDA9u3bMWrUKPTp0weffvopAODcuXM4cOCAdpuIiAjMmzcPzz33HDp27Ijs7GwcPXoUx48fR79+/R5ay7Rp02BjY4OIiAhcuHABixcvRnx8PHbv3q0N4b/99hvCw8PRv39/fPrpp8jPz8fixYvRtWtXnDhxolwgLC0tRf/+/dG1a1d8/vnnVRoxzcrKQlpaWrk2QRAq9POvv/6KnJwcTJ06FYWFhfj666/Ru3dvxMTEaH+W7NixAwMHDoS3tzciIiJQUFCAhQsXIjQ0FMePH9fWev36dXTs2BGZmZmYNGkS/P39kZSUhDVr1iA/Px8mJiba/U6fPh22traYPXs24uLisGDBAkybNg1//PHHQ98b1SGRqBqmTp0q3vux6dGjhwhAXLJkSYXt8/PzK7S98MILorm5uVhYWKhtCw8PFz09PbX3Y2NjRQCivb29mJGRoW3fsGGDCED8+++/tW2zZ8+uUBMA0cTERLx8+bK2LTo6WgQgLly4UNsWFhYmmpubi0lJSdq2S5cuiUZGRhVeszKVvb958+aJgiCI8fHx5d4fAHHu3Lnltm3Tpo3Yrl077f3169eLAMTPPvtM21ZaWip269ZNBCAuW7bsoTV16NBBdHd3F1UqlbZt69atIgBx6dKl2tcsKioq97xbt26Jzs7O4rPPPluuHYA4e/Zs7f1ly5aJAMTY2FhRFEUxNTVVNDExEQcPHiyq1Wrtdu+8844IQAwPD9e2FRYWlqtLFDXfa4VCUa5voqKi7vt+7/2slPXZhx9+WG67J554QhQEodxnoKqfi8qUfSbnz59/320WLFggAhD/97//aduKi4vFzp07i5aWlmJ2drYoiqL48ssvi0qlUiwtLb3va7Vq1UocPHjwA2uqTNn3p127dmJxcbG2/bPPPhMBiBs2bBBFURRzcnJEGxsb8fnnny/3/JSUFNHa2rpce9nn96233qpWDZXdFAqFdruyPjUzMxOvXbumbf/vv/9EAOIrr7yibWvdurXo5OQkpqena9uio6NFmUwmjhs3Tts2btw4USaTiVFRURXqKvt8ltXXt2/fcp/ZV155RZTL5WJmZmaV3ifVDR76IZ1QKBSYMGFChXYzMzPt1zk5OUhLS0O3bt2Qn5+P8+fPP/R1n376adja2mrvl/11ffXq1Yc+t2/fvvDx8dHeDwkJgVKp1D5XpVJhx44dGDp0KNzc3LTb+fr6YuDAgQ99faD8+8vLy0NaWhq6dOkCURRx4sSJCttPnjy53P1u3bqVey+bN2+GkZGRdoQF0MwJmT59epXqATTziq5du4a9e/dq21asWAETExM8+eST2tcs+8tSrVYjIyMDpaWlaN++faWHjR5kx44dKC4uxvTp08sdLpsxY0aFbRUKBWQyzY8dlUqF9PR0WFpaokWLFtXeb5nNmzdDLpfjpZdeKtf+2muvQRRFbNmypVz7wz4XtbF582a4uLhg1KhR2jZjY2O89NJLyM3NxZ49ewAANjY2yMvLe+BhHBsbG5w5cwaXLl2qUS2TJk0qN+o4ZcoUGBkZYfPmzQA0ozqZmZkYNWoU0tLStDe5XI5OnTpVehjw7s9lVXz77bfYvn17udu93w8AGDp0KJo0aaK937FjR3Tq1Elba3JyMk6ePInx48fDzs5Ou11ISAj69eun3U6tVmP9+vUICwurdG7MvYdzJ02aVK6tW7duUKlUiI+Pr9b7JP1iUCGdaNKkSbkh1TJnzpzBsGHDYG1tDaVSCUdHR+1E3KysrIe+btOmTcvdLwstlR1rf9hzy55f9tzU1FQUFBRUegZCVc9KSEhI0P7wLJt30qNHDwAV35+pqWmFQ0p31wMA8fHxcHV1haWlZbntWrRoUaV6AGDkyJGQy+VYsWIFAKCwsBDr1q3DwIEDy4W+X375BSEhIdr5D46Ojti0aVOVvi93K/uh7ufnV67d0dGx3P4AzS+Sr776Cn5+flAoFHBwcICjoyNOnTpV7f3evX83NzdYWVmVay87E+3eXzoP+1zURnx8PPz8/LRh7H61vPjii2jevDkGDhwId3d3PPvssxXmycydOxeZmZlo3rw5goOD8frrr1frtPJ7vx+WlpZwdXXVzi0qC0C9e/eGo6Njudu2bduQmppa7vlGRkZwd3ev8v4BTeDo27dvuVuvXr0eWisANG/eXFtrWb9V9v8gICAAaWlpyMvLw82bN5GdnY2goKAq1Vebny9UdzhHhXTi7pGFMpmZmejRoweUSiXmzp0LHx8fmJqa4vjx43jzzTerdIrp/c4uEe+ZJKnr51aFSqVCv379kJGRgTfffBP+/v6wsLBAUlISxo8fX+H91dWZMk5OTujXrx/++usvfPvtt/j777+Rk5NTbvLj//73P4wfPx5Dhw7F66+/DicnJ8jlcsybNw9XrlzRW20ff/wx3n//fTz77LP44IMPYGdnB5lMhhkzZtTZKcf6/lxUhZOTE06ePInIyEhs2bIFW7ZswbJlyzBu3DjtxNvu3bvjypUr2LBhA7Zt24Yff/wRX331FZYsWYLnnnuu1jWU9fdvv/0GFxeXCo/feybd3aNhDYUhfBbo4RhUSG92796N9PR0rF27Ft27d9e2x8bGSljVHU5OTjA1Na10gbQHLZpWJiYmBhcvXsQvv/yCcePGadsfdlbGg3h6emLnzp3Izc0tN6py4cKFar3OmDFjsHXrVmzZsgUrVqyAUqlEWFiY9vE1a9bA29sba9euLTf0PXv27BrVDGj+Qvf29ta237x5s8JfpmvWrEGvXr3w008/lWvPzMyEg4OD9n51Vhr29PTEjh07kJOTU25UpezQYll9dcHT0xOnTp2CWq0u90u9slpMTEwQFhaGsLAwqNVqvPjii1i6dCnef/997YienZ0dJkyYgAkTJiA3Nxfdu3dHRERElYLKpUuXyo1e5ObmIjk5GYMGDQIA7eEvJycn9O3bt/ZvvhYqO7x18eJF7QTZsn6r7P/B+fPn4eDgAAsLC5iZmUGpVFZ6xhDVXw0rHpNBKftr5e6/ToqLi/Hdd99JVVI5crkcffv2xfr163H9+nVt++XLlys9jl7Z84Hy708UxXKnmFbXoEGDUFpaisWLF2vbVCoVFi5cWK3XGTp0KMzNzfHdd99hy5YtGD58OExNTR9Y+3///YdDhw5Vu+a+ffvC2NgYCxcuLPd6CxYsqLCtXC6v8Nfq6tWrkZSUVK6tbH2OqpyWPWjQIKhUKixatKhc+1dffQVBEKo830gXBg0ahJSUlHJnjZSWlmLhwoWwtLTUHhZMT08v9zyZTKZdhK+oqKjSbSwtLeHr66t9/GG+//57lJSUaO8vXrwYpaWl2v7o378/lEolPv7443LblanL03TXr19f7jNw5MgR/Pfff9paXV1d0bp1a/zyyy/lPhOnT5/Gtm3btOFLJpNh6NCh+PvvvytdHp8jJfUTR1RIb7p06QJbW1uEh4drl3f/7bffDOqHRUREBLZt24bQ0FBMmTJF+wsvKCjoocu3+/v7w8fHBzNnzkRSUhKUSiX++uuvWh3fDgsLQ2hoKN566y3ExcUhMDAQa9eurfb8DUtLSwwdOlQ7T+XeNS8ee+wxrF27FsOGDcPgwYMRGxuLJUuWIDAwELm5udXaV9l6MPPmzcNjjz2GQYMG4cSJE9iyZUu5UZKy/c6dOxcTJkxAly5dEBMTg99//73cSAyg+WvfxsYGS5YsgZWVFSwsLNCpU6dKVzkNCwtDr1698O677yIuLg6tWrXCtm3bsGHDBsyYMaPcxFld2LlzJwoLCyu0Dx06FJMmTcLSpUsxfvx4HDt2DF5eXlizZg0OHDiABQsWaEd8nnvuOWRkZKB3795wd3dHfHw8Fi5ciNatW2vnswQGBqJnz55o164d7OzscPToUaxZswbTpk2rUp3FxcXo06cPnnrqKVy4cAHfffcdunbtiscffxwAoFQqsXjxYowdOxZt27bFyJEj4ejoiISEBGzatAmhoaEVwl91bdmypdJJ8126dCn3Pff19UXXrl0xZcoUFBUVYcGCBbC3t8cbb7yh3Wb+/PkYOHAgOnfujIkTJ2pPT7a2ti53LaqPP/4Y27ZtQ48ePTBp0iQEBAQgOTkZq1evxv79+2FjY1Or90QSkOJUI6q/7nd6csuWLSvd/sCBA+IjjzwimpmZiW5ubuIbb7whRkZGigDEXbt2abe73+nJlZ0KintOl73f6clTp06t8FxPT89yp8uKoiju3LlTbNOmjWhiYiL6+PiIP/74o/jaa6+Jpqam9+mFO86ePSv27dtXtLS0FB0cHMTnn39ee7rr3afWhoeHixYWFhWeX1nt6enp4tixY0WlUilaW1uLY8eOFU+cOFHl05PLbNq0SQQgurq6VjglWK1Wix9//LHo6ekpKhQKsU2bNuI///xT4fsgig8/PVkURVGlUolz5swRXV1dRTMzM7Fnz57i6dOnK/R3YWGh+Nprr2m3Cw0NFQ8dOiT26NFD7NGjR7n9btiwQQwMDNSeKl723iurMScnR3zllVdENzc30djYWPTz8xPnz59f7tTTsvdS1c/Fvco+k/e7/fbbb6IoiuKNGzfECRMmiA4ODqKJiYkYHBxc4fu2Zs0a8dFHHxWdnJxEExMTsWnTpuILL7wgJicna7f58MMPxY4dO4o2NjaimZmZ6O/vL3700UflTjmuTNn3Z8+ePeKkSZNEW1tb0dLSUhwzZky5U3vL7Nq1S+zfv79obW0tmpqaij4+PuL48ePFo0ePare53+f3YTXc71bWH3f/P//iiy9EDw8PUaFQiN26dROjo6MrvO6OHTvE0NBQ0czMTFQqlWJYWJh49uzZCtvFx8eL48aNEx0dHUWFQiF6e3uLU6dO1Z6SX1bfvacw79q1q8LPJpKeIIoG9OctkYEYOnRorU4NJZLK8uXLMWHCBERFRRn88vVxcXFo1qwZ5s+fj5kzZ0pdDhkozlGhRu/e5e4vXbqEzZs3o2fPntIUREREWpyjQo2et7c3xo8fD29vb8THx2Px4sUwMTEpd3yciIikwaBCjd6AAQOwcuVKpKSkQKFQoHPnzvj4448rXYSKiIjqFueoEBERkcHiHBUiIiIyWAwqREREZLDq9RwVtVqN69evw8rKqlpLbhMREZF0RFFETk4O3NzcHnoNqXodVK5fvw4PDw+pyyAiIqIaSExMfOhVuet1UClbjjoxMRFKpRIlJSXYtm0bHn30URgbG0tcXePBfpcG+10a7HdpsN+loa9+z87OhoeHR7kLid5PvQ4qZYd7lEqlNqiYm5tDqVTyg1yH2O/SYL9Lg/0uDfa7NPTd71WZtsHJtERERGSwGFSIiIjIYDGoEBERkcGq13NUiIiodtRqNYqLi6Uu46FKSkpgZGSEwsJCqFQqqctpNGra78bGxpDL5TqpgUGFiKiRKi4uRmxsLNRqtdSlPJQoinBxcUFiYiLXzapDtel3GxsbuLi41Pr7xaBCRNQIiaKI5ORkyOVyeHh4PHTRLamp1Wrk5ubC0tLS4GttSGrS76IoIj8/H6mpqQAAV1fXWtXAoEJE1AiVlpYiPz8fbm5uMDc3l7qchyo7RGVqasqgUodq2u9mZmYAgNTUVDg5OdXqMBC/20REjVDZfAMTExOJK6GGqiwAl5SU1Op1GFSIiBoxzvcgfdHVZ4tBhYiIiAwWgwoRETVqXl5eWLBgQZW33717NwRBQGZmpt5qojsYVIiIqF6wtbWFXC6HIAiV3iIiImr0ulFRUZg0aVKVt+/SpQuSk5NhbW1do/1VFQORBs/6qYQoiriRXYSiUhU87S2kLoeIiACcP38eVlZWkMlk+OOPPzBr1ixcuHBB+7ilpaX2a1EUoVKpYGT08F9zjo6O1arDxMQELi4u1XoO1RxHVCrx2+F4PDJvJz7cdE7qUoiI6DZnZ2e4uLjAxcUF1tbWEARBe78sxGzZsgXt2rWDQqHA/v37ceXKFQwZMgTOzs6wtLREhw4dsGPHjnKve++hH0EQ8OOPP2LYsGEwNzeHn58fNm7cqH383pGO5cuXw8bGBpGRkQgICIClpSUGDBiA5ORk7XNKS0vx0ksvwcbGBvb29njzzTcRHh6OoUOH1rg/bt26hXHjxsHW1hbm5uYYOHAgLl26pH08Pj4eYWFhsLW1hYWFBVq2bInNmzdrnztmzBg4OjrCzMwMfn5+WLZsWY1r0ScGlUo0c9CMolxJzZW4EiKiuiGKIvKLSyW5iaKos/fx1ltv4ZNPPsG5c+cQEhKC3NxcDBo0CDt37sSJEycwYMAAhIWFISEh4YGvM2fOHDz11FM4deoUBg0ahDFjxiAjI+O+2+fn5+Pzzz/Hb7/9hr179yIhIQEzZ87UPv7pp5/i999/x7Jly3DgwAFkZ2dj/fr1tXqv48ePx9GjR7Fx40YcOnQIoihi0KBB2tOBp06diqKiIuzduxcxMTH49NNPtaNO77//Ps6ePYstW7bg3LlzWLx4MRwcHGpVj77w0E8lfJ0038j4jHwUl6phYsQ8R0QNW0GJCoGzIiXZ99m5/WFuoptfR3PnzkW/fv209+3s7NCqVSvt/Q8++ADr1q3Dxo0bMW3atPu+zvjx4zFq1CgAwMcff4xvvvkGR44cwYABAyrdvqSkBEuWLIGPjw8AYNq0aZg7d6728YULF+Ltt9/GsGHDAACLFi3Sjm7UxKVLl7Bx40YcOHAAXbp0AQD8/vvv8PDwwPr16/Hkk08iISEBI0aMQHBwMADA29tb+/yEhAS0adMG7du3B6AZVTJU/A1cCRelKSwVRlCpRcSl50ldDhERVVHZL94yubm5mDlzJgICAmBjYwNLS0ucO3fuoSMqISEh2q8tLCygVCq1S8JXxtzcXBtSAM2y8WXbZ2Vl4caNG+jYsaP2cblcjnbt2lXrvd3t3LlzMDIyQqdOnbRt9vb2aNGiBc6d00xbeOmll/Dhhx8iNDQUs2fPxqlTp7TbTpkyBatWrULr1q3xxhtv4ODBgzWuRd84olIJQRDg42iB6GtZuJyai+bOVlKXRESkV2bGcpyd21+yfeuKhUX5EyBmzpyJ7du34/PPP4evry/MzMzwxBNPPPSK0cbGxuXuC4LwwIs3Vra9Lg9p1cRzzz2H/v37Y9OmTdi2bRvmzZuHL774AtOnT8fAgQMRHx+PzZs3Y/v27ejTpw+mTp2Kzz//XNKaK8MRlfvwuX345zLnqRBRIyAIAsxNjCS56XN13AMHDmD8+PEYNmwYgoOD4eLigri4OL3trzLW1tZwdnZGVFSUtk2lUuH48eM1fs2AgACUlpbiv//+07alp6fjwoULCAwM1LZ5eHhg8uTJWLt2LV577TX88MMP2sccHR0RHh6O//3vf1iwYAG+//77GtejTxxRuQ9fBhUionrPz88Pa9euRVhYGARBwPvvv//AkRF9mT59OubNmwdfX1/4+/tj4cKFuHXrVpVCWkxMDKys7ozsC4KAVq1aYciQIXj++eexdOlSWFlZ4a233kKTJk0wZMgQAMCMGTMwcOBANG/eHLdu3cKuXbsQEBAAAJg1axbatWuHli1boqioCP/884/2MUPDoHIfvo4MKkRE9d2XX36JZ599Fl26dIGDgwPefPNNZGdn13kdb775JlJSUjBu3DjI5XJMmjQJ/fv3r9JVhbt3717uvlwuR2lpKZYtW4aXX34Zjz32GIqLi9G9e3ds3rxZexhKpVJh6tSpuHbtGpRKJQYMGICvvvoKgGYtmLfffhtxcXEwMzNDt27dsGrVKt2/cR0QRKkPotVCdnY2rK2tkZWVBaVSiZKSEmzevBmDBg2qcLywumLT8tDr890wNZbh7JwBkMl44a770WW/U9Wx36XRUPq9sLAQsbGxaNasGUxNTaUu56HUajWys7OhVCohk9X/WQtqtRoBAQF46qmn8MEHH0hdzn3Vpt8f9Bm79/f3g3BE5T48bM1gIpehsESNpMwCeNiZS10SERHVU/Hx8di2bRt69OiBoqIiLFq0CLGxsRg9erTUpRm8+h9L9cRILtMu/MbDP0REVBsymQzLly9Hhw4dEBoaipiYGOzYscNg54UYEo6oPICvkyUu3MjB5dRc9PJ3krocIiKqpzw8PHDgwAGpy6iXOKLyADxFmYiISFoMKg+gPUX5JoMKERGRFBhUHuDuU5Tr8clRRERE9RaDygN4O1pAEICsghKk5T54uWUiIiLSPQaVBzA1lsPDVnNaMuepEBER1T0GlYfgPBUiIiLpMKg8RFlQucIRFSKiBqFnz56YMWOG9r6XlxcWLFjwwOcIgoD169fXet+6ep3GhEHlIXjNHyIiwzBy5EgMHDiw0sf27dsHQRBw6tSpar9uVFQUJk2aVNvyyomIiEDr1q0rtCcnJ9/3PejK8uXLYWNjo9d91CUGlYfgWipERIZh7Nix2LFjB65du1bhsWXLlqF9+/YICQmp9us6OjrC3LxuLpPi4uIChUJRJ/tqKBhUHqLs0E9KdiFyCkskroaIqPHq378/HB0dsXz58nLtubm5WL16NSZOnIj09HSMGjUKTZo0gbm5OYKDg7Fy5coHvu69h34uXbqE7t27w9TUFIGBgdi+fXuF57z55pto3rw5zM3N4e3tjffffx8lJZrfEcuXL8ecOXMQHR0NQRAgCIK25nsP/cTExKB3794wMzODvb09Jk2ahNzcO38Yjx8/HkOHDsXnn38OV1dX2NvbY+rUqdp91URCQgKGDBkCS0tLKJVKPPXUU7hx44b28ejoaPTq1QtWVlawsbFBz549cfToUQCaaxaFhYXB1tYWFhYWaNmyJTZv3lzjWqqCS+g/hLWZMRytFLiZU4QrN/PQ2sNG6pKIiHRPFIGSfGn2bWwOCA+/Qr2RkRHGjh2L5cuX491334Vw+zmrV6+GSqXCqFGjkJubi3bt2uHNN9+EUqnEpk2bMHbsWPj4+KBjx44P3Ydarcbw4cPh7OyM//77D1lZWeXms5SxsrLC8uXL4ebmhpiYGDz//POwsrLCG2+8gaeffhqnT5/G1q1bsWPHDgCAtbV1hdfIy8tD//790blzZ0RFRSE1NRXPPfccpk2bVi6M7dq1C66urti1axcuX76Mp59+Gq1bt8bzzz//0PdT2fsrCyl79uxBaWkppk6diqeffhq7d+8GAIwZMwZt2rTB4sWLIQgCDh06pL1S+NSpU1FcXIy9e/fCwsICZ8+ehaWlZbXrqA4GlSrwdbTEzZwiXLqRw6BCRA1TST7wsZs0+37nOmBiUaVNJ0yYgM8//xx79uxBz549AWgO+4wYMQLW1tawtrbGzJkztdtPnz4dkZGR+PPPP6sUVHbs2IHz588jMjISbm6a/vj4448rzCt57733tF97eXlh5syZWLVqFd544w2YmZnB0tISRkZGcHFxue++VqxYgcLCQvz666+wsNC8/0WLFiEsLAyffvopnJ2dAQC2trZYtGgR5HI5/P39MXjwYOzcubNGQWXnzp2IiYlBbGwsPDw8AAC//vorWrZsiaioKHTo0AEJCQl4/fXX4e/vD7VaDWdnZyiVSgCa0ZgRI0YgODgYAODt7V3tGqqLh36qgKcoExEZBn9/f3Tp0gU///wzAODy5cvYt28fJk6cCABQqVT44IMPEBwcDDs7O1haWiIyMhIJCQlVev1z587Bw8NDG1IAoHPnzhW2++OPPxAaGgoXFxdYWlrivffeq/I+7t5Xq1attCEFAEJDQ6FWq3HhwgVtW8uWLSGXy7X3XV1dkZqaWq193b1PDw8PbUgBgMDAQNjY2ODcuXMAgFdffRXPPfcc+vbti08//RSxsbHabV966SV8+OGHCA0NxezZs2s0ebm6OKJSBTxFmYgaPGNzzciGVPuuhokTJ2L69On49ttvsWzZMvj4+KBHjx4AgPnz5+Prr7/GggULEBwcDAsLC8yYMQPFxbpbXfzQoUMYM2YM5syZg/79+8Pa2hqrVq3CF198obN93K3ssEsZQRCgVqv1si9Ac8bS6NGjsWnTJmzevBkRERFYsWIFRowYgeeeew79+/fHpk2bsG3bNsybNw9ffPEFpk+frrd6OKJSBb4884eIGjpB0Bx+keJWhfkpd3vqqacgk8mwYsUK/Prrr3j22We181UOHDiAIUOG4JlnnkGrVq3g7e2NixcvVvm1AwICkJiYiOTkZG3b4cOHy21z8OBBeHp64t1330X79u3h5+eH+Pj4ctuYmJhApVI9dF/R0dHIy8vTth04cAAymQwtWrSocs3VUfb+EhMTtW1nz55FZmYmAgMDtW3NmzfHK6+8gsjISDz22GPl5sx4eHhg8uTJWLt2LV577TX88MMPeqm1DINKFZQFlYSMfBSWPPiDR0RE+mVpaYmnn34ab7/9NpKTkzF+/HjtY35+fti+fTsOHjyIc+fO4YUXXih3RsvD9O3bF82bN0d4eDiio6Oxb98+vPvuu+W28fPzQ0JCAlatWoUrV67gm2++wbp168pt4+XlhdjYWJw8eRJpaWkoKiqqsK8xY8bA1NQU4eHhOH36NHbt2oXp06dj7Nix2vkpNaVSqXDy5Mlyt3PnzqFv374IDg7GmDFjcPz4cRw5cgTjxo1Djx490L59exQUFGDatGnYvXs34uPjceDAAZw4cQIBAQEAgBkzZiAyMhKxsbE4fvw4du3apX1MXxhUqsDJSgErhRHUIhCXnvfwJxARkV5NnDgRt27dQv/+/cvNJ3nvvffQtm1b9O/fHz179oSLiwuGDh1a5deVyWRYt24dCgoK0LFjRzz33HP46KOPym3z+OOP45VXXsG0adPQunVrHDx4EO+//365bUaMGIEBAwagV69ecHR0rPQUaXNzc0RGRiIjIwMdOnTAE088gT59+mDRokXV64xK5Obmok2bNuVuYWFhEAQBGzZsgK2tLbp3746+ffvC29sbf/zxBwBALpcjPT0d48aNQ/PmzTFy5Ej07dsXERERADQBaOrUqQgICMCAAQPQvHlzfPfdd7Wu90EEURRFve5Bj7Kzs2FtbY2srCwolUqUlJRg8+bNGDRoUIVjerU19NsDOJmYiUWj2+CxEIlmxhsoffY73R/7XRoNpd8LCwsRGxuLZs2awdTUVOpyHkqtViM7OxtKpRIyGf/Griu16fcHfcbu/f39IPxuVxHnqRAREdU9BpUq8mNQISIiqnMMKlXEERUiIqK6J2lQUalUeP/999GsWTOYmZnBx8cHH3zwAQxx2kxZULmalgeV2vDqIyIiaogkXfDt008/xeLFi/HLL7+gZcuWOHr0KCZMmABra2u89NJLUpZWgbutOUyMZCguVeParXx42ldtuWciIkNmiH8YUsOgq8+WpEHl4MGDGDJkCAYPHgxAc975ypUrceTIESnLqpRcJsDbwQLnU3JwOTWXQYWI6rWyJdmLi4thZmYmcTXUEOXnay5yWduz4yQNKl26dMH333+Pixcvonnz5oiOjsb+/fvx5ZdfVrp9UVFRuUVzsrOzAWhOFyy7ld3XB5/bQeVCSha6+9rpZR/1kb77nSrHfpdGQ+l3URRhamqK1NRUyOVygz/lVxRFFBcXo6CgQLsKLelfTfpdFEXk5+fj5s2bUCqVUKvVFZb8r87/H0nXUVGr1XjnnXfw2WefQS6XQ6VS4aOPPsLbb79d6fYRERGYM2dOhfYVK1bA3Lx614qoiS2JArZek6OToxqjffV3nQUiorogk8ng6OhYr9eDIcOkVquRk5ODnJycSh/Pz8/H6NGjq7SOiqRBZdWqVXj99dcxf/58tGzZEidPnsSMGTPw5ZdfIjw8vML2lY2oeHh4IC0tTbvg2/bt29GvXz+9/MfbHJOCl/88hdYe1lg9qZPOX7++0ne/U+XY79JoaP2uVqtRUlJi8HNVSktLcfDgQXTp0gVGRryebl2pSb8LggAjI6NyV3y+V3Z2NhwcHKoUVCT9br/++ut46623MHLkSABAcHAw4uPjMW/evEqDikKhgEKhqNBubGxc7gfGvfd1pYWbNQDgys08GBkZcfjxHvrqd3ow9rs0GlK/V/Zz1dCUlJSgtLQUlpaWDabf6wN99Xt1XkvSg5L5+fkVjovK5XK9Xr66Npo5WEAmADmFpbiZU/ECU0RERKRbko6ohIWF4aOPPkLTpk3RsmVLnDhxAl9++SWeffZZKcu6L4WRHE3tzBGXno/LqblwUhr+9TGIiIjqM0mDysKFC/H+++/jxRdfRGpqKtzc3PDCCy9g1qxZUpb1QL5OlpqgcjMXXXwdpC6HiIioQZM0qFhZWWHBggVYsGCBlGVUi4+TJXacS+VS+kRERHXAsE+cN0C+jrzmDxERUV1hUKkmXpyQiIio7jCoVJPP7aCSmlOErIL6vTIlERGRoWNQqSalqTGclZo1BziqQkREpF8MKjVQdvjnCoMKERGRXjGo1IB2Qu1NBhUiIiJ9YlCpAU6oJSIiqhsMKjXgw6BCRERUJxhUaqBsRCXxVj4KS1QSV0NERNRwMajUgKOlAtZmxhBF4OrNPKnLISIiarAYVGpAEIQ781Q4oZaIiEhvGFRqiEvpExER6R+DSg1xLRUiIiL9Y1CpIZ6iTEREpH8MKjVUFlRi0/JQqlJLXA0REVHDxKBSQ01szGBqLEOxSo3EWwVSl0NERNQgMajUkEwmwNuBh3+IiIj0iUGlFjhPhYiISL8YVGqBQYWIiEi/GFRqgYu+ERER6ReDSi3cvZaKKIoSV0NERNTwMKjUgpe9BeQyAblFpbiRXSR1OURERA0Og0otmBjJ4GlnDoDzVIiIiPSBQaWWfLQTanMkroSIiKjhYVCpJU6oJSIi0h8GlVriVZSJiIj0h0GllriWChERkf4wqNRS2RyVtNxiZOYXS1wNERFRw8KgUkuWCiO4WpsC4KgKERGRrjGo6AAP/xAREekHg4oO+HBCLRERkV4wqOiAnzNPUSYiItIHBhUd4CnKRERE+sGgogNlc1SSMgtQUKySuBoiIqKGg0FFB+wtFbA1N4YoAld4+IeIiEhnGFR0pGxUhUGFiIhIdxhUdISnKBMREekeg4qO8BRlIiIi3WNQ0RGOqBAREekeg4qOlAWVuPQ8lKrUEldDRETUMDCo6IibtRnMjOUoUYmIz8iXuhwiIqIGgUFFR2QyAT5OFgB4+IeIiEhXGFR0iCvUEhER6RaDig5p11JhUCEiItIJBhUd0p75w0XfiIiIdIJBRYfuHlERRVHiaoiIiOo/BhUd8rS3gJFMQF6xCslZhVKXQ0REVO8xqOiQsVwGT3tzAJxQS0REpAsMKjrGFWqJiIh0h0FFx8qCyiUGFSIiolpjUNExnqJMRESkOwwqOubraAWApygTERHpAoOKjpUto5+RV4yMvGKJqyEiIqrfGFR0zNzECE1szABwQi0REVFtMajoAc/8ISIi0g0GFT1gUCEiItINBhU94DV/iIiIdINBRQ94ijIREZFuMKjoga+jJqgkZRYgr6hU4mqIiIjqLwYVPbC1MIG9hQkA4OrNPImrISIiqr8YVPTERztPJUfiSoiIiOovBhU94Zk/REREtcegoidl81QYVIiIiGqOQUVPOKJCRERUewwqelIWVOLT81GiUktcDRERUf3EoKInrtamsDCRo1QtIj6dZ/4QERHVBIOKngiCcOfMHx7+ISIiqhEGFT3ihFoiIqLakTyoJCUl4ZlnnoG9vT3MzMwQHByMo0ePSl2WTnBEhYiIqHaMpNz5rVu3EBoail69emHLli1wdHTEpUuXYGtrK2VZOsOLExIREdWOpEHl008/hYeHB5YtW6Zta9asmYQV6dadixPmQa0WIZMJEldERERUv0gaVDZu3Ij+/fvjySefxJ49e9CkSRO8+OKLeP755yvdvqioCEVFRdr72dnZAICSkhLtrey+IXCzMoaxXEBBiQoJ6TloYmMmdUl6YWj93liw36XBfpcG+10a+ur36ryeIIqiqNO9V4OpqSkA4NVXX8WTTz6JqKgovPzyy1iyZAnCw8MrbB8REYE5c+ZUaF+xYgXMzc31Xm9NzDspR0qBgMn+KgTYStbVREREBiM/Px+jR49GVlYWlErlA7eVNKiYmJigffv2OHjwoLbtpZdeQlRUFA4dOlRh+8pGVDw8PJCWlgalUomSkhJs374d/fr1g7GxcZ28h4eZtvIkIs+m4vVH/TCpW8M5rHU3Q+z3xoD9Lg32uzTY79LQV79nZ2fDwcGhSkFF0kM/rq6uCAwMLNcWEBCAv/76q9LtFQoFFApFhXZjY+NyHXjvfSl19HZA5NlULDuYgGceaQZrc8OoSx8Mqd8bE/a7NNjv0mC/S0PX/V6d15L09OTQ0FBcuHChXNvFixfh6ekpUUW698wjTeHtaIG03CJ8svW81OUQERHVK5IGlVdeeQWHDx/Gxx9/jMuXL2PFihX4/vvvMXXqVCnL0imFkRzzhgUDAFYeScCR2AyJKyIiIqo/JA0qHTp0wLp167By5UoEBQXhgw8+wIIFCzBmzBgpy9K5Tt72GNXRAwDw9tpTKCpVSVwRERFR/SDpHBUAeOyxx/DYY49JXYbevTUgANvPpuLKzTx8t+sKXunXXOqSiIiIDJ7kS+g3Ftbmxoh4XDNx+Lvdl3E5NUfiioiIiAwfg0odGhzsij7+TihRiXh7bQzUaq6rQkRE9CAMKnVIEATMHRoEcxM5ouJuYVVUotQlERERGTQGlTrWxMYMMx9tAQCYt+UcUrMLJa6IiIjIcDGoSCC8ixdC3K2RU1iKOX+flbocIiIig8WgIgG5TMC84cGQywRsiknGjrM3pC6JiIjIIDGoSKSlmzWeu33tn1kbTiO3qFTiioiIiAwPg4qEZvRpDg87M1zPKsQX2y48/AlERESNDIOKhMxM5PhoqGZ5/eUH43AyMVPagoiIiAwMg4rEujd3xLA2TSCKwNtrY1CiUktdEhERkcFgUDEA7w0OgK25Mc4lZ+PHfbFSl0NERGQwGFQMgL2lAu8N1iyvv2DHRcSn50lcERERkWFgUDEQw9s2QaivPYpK1Xh33WmIIpfXJyIiiRVkwrhU2j+eGVQMhCAI+GhoMBRGMuy/nIZ1J5KkLomIiBojUQSuHQPWvwijb4LgfTNS0nIYVAyIl4MFXu7rBwD44J+zyMgrlrgiIiJqNIpygaPLgKXdgR97Ayd/h1BaCNu8q5KWxaBiYJ7v5g1/Fyvcyi/Bh5u4vD4REenZjTPApteAL/yBf2YAKacAuQIIGYnS8C047POapOUZSbp3qsBYLsO84cEYvvgg1h5PwvA27ujq5yB1WURE1JCUFAJnNwBHfwIS/7vTbucDtH8WaD0aMLeDWFICnNosXZ1gUDFIbZraIryzF5YfjMM762IQOaM7zEzkUpdFRET1XfoV4OjPwMnfgYJbmjaZEeA/WBNQmvUABEHaGu/BoGKgZvZvgcgzKUjIyMc3/17CmwP8pS6JiIjqI1UJcGGzJqBc3X2n3doDaBcOtBkLWLlIVt7DMKgYKEuFEeYOCcLzvx7F93uv4vFWbghwVUpdFhER1ReZicDxXzW33JTbjQLg96hm9MSvHyAz/NF6BhUD1i/QGYOCXbA5JgVvrY3B2ildIJcZ1pAcEREZELUKuLxTM3pyKRIQb1+WxcIJaDsWaBsO2HpKW2M1MagYuIiwlth3KQ3RiZn49VAcJoQ2k7okIiIyNLmpwInfgGPLgcyEO+1e3YAOE4EWgwEjE8nKqw0GFQPnpDTFWwP98e6605gfeQGPtnRBExszqcsiIiKpiSIQt19z5s65fwB1iabd1AZoPQZoNx5wbC5lhTrBoFIPjOrQFOuOJ+Fo/C3MWn8aP4a3h2Bgs7KJiKiOFNwCTq7UHN5Jv3Sn3b2DZu5Jy2GAccP5g5ZBpR6QyQTMGx6MQd/sw87zqfjnVDLCWrlJXRYREdUVUQSSjmnCyem/gNJCTbuJJRDyFNBuAuAaIm2NesKgUk/4OVthai9fLNhxCbM2nEZnH3s4WCqkLouIiPSpKBeIWa0JKCmn7rQ7B2lGT0KeAhRW0tVXBxhU6pEXe/oi8swNnEvOxvvrT+O7MW15CIiIqCFKOa0JJ6f+BIpzNG1yBRA0XBNQ3DsY3MJs+sKgUo+YGMnw+ZMhGLLoALacTuEhICKihqSkEDi7XhNQHrCsfWPDoFLPtHSzxtRevvh6p+YQ0CPe9nC04iEgIqJ6677L2j92e1n77o1m9KQyDCr10NRevth29s4hoMXP8BAQEVG9UrasfdRPQOyeO+31ZFn7usSgUg/dfQho65kU/H0qGY/zEBARkeHLTASO/3J7Wfsbtxvr37L2dYlBpZ5q6WaNab01ZwHN3nAanXkIiIjIMD1wWftxmhEUm6bS1mjAGFTqsam9fLHtzA2c5SEgIiLDc79l7Zt114ye1ONl7esSg0o9ZiyXYT4PARERGQ5RBOL2aUZPzv0NqEs17WXL2refADj4SVpifVOjoJKYmAhBEODu7g4AOHLkCFasWIHAwEBMmjRJpwXSg/EQEBGRAcjPAKJX3WdZ+4lAy6ENaln7uiSryZNGjx6NXbt2AQBSUlLQr18/HDlyBO+++y7mzp2r0wLp4ab28kWgqxK38kvw3voYiKIodUlERA2fKALXjgLrpgBfBgCRb2tCioml5tDOC/uA53YArUcxpNRCjYLK6dOn0bFjRwDAn3/+iaCgIBw8eBC///47li9frsv6qAqM5TJ8/mQrGMkERJ65gb9PJUtdEhFRw1WUoxk5WdoN+LEPEL1Cc+0d5yBg8JfAa+eBx75qsNfeqWs1OvRTUlIChUJzeGHHjh14/PHHAQD+/v5ITuYvSSkEuil5CIiISJ8qW9beyBRoWbasfftGvTCbvtQoqLRs2RJLlizB4MGDsX37dnzwwQcAgOvXr8Pe3l6nBVLV3X0W0HvrY7DkmXY8C4iIqDbKlrWP+gm4duROu72vJpy0GtUol7WvSzUKKp9++imGDRuG+fPnIzw8HK1atQIAbNy4UXtIiOpe2SGgxxftR+SZG9gYfR1DWjeRuiwiovon7TJwbBmXtTcANQoqPXv2RFpaGrKzs2Fra6ttnzRpEszNzXVWHFVfoJsS03v74asdFzF74xl09rGHk5Wp1GURERk+VQlwfpPm8E6FZe3H317W3lmy8hqrGgWVgoICiKKoDSnx8fFYt24dAgIC0L9/f50WSNX3Yi8fRJ5J0RwCWncaS8fyEBAR0X3db1n75v01oye+fbmsvYRqFFSGDBmC4cOHY/LkycjMzESnTp1gbGyMtLQ0fPnll5gyZYqu66RquPsQ0LazPARERFSBdln7n4BL27isvQGr0enJx48fR7du3QAAa9asgbOzM+Lj4/Hrr7/im2++0WmBVDNlh4AAYPbGM0jNKZS4IiIiA5BzA9j7OfB1a2DFk8DFrZqQ0qwH8OQvwKtngT7vM6QYkBqNqOTn58PKygoAsG3bNgwfPhwymQyPPPII4uPjdVog1dyLvXyw7WwKzlznISAiasQetKx9m2c080+4rL3BqtGIiq+vL9avX4/ExERERkbi0UcfBQCkpqZCqVTqtECqubsXgis7BERE1GjkZwCHvgUWdQB+CQPOrNOEFPeOwNAlmoXZ+n/EkGLgajSiMmvWLIwePRqvvPIKevfujc6dOwPQjK60adNGpwVS7QS48iwgImpEypa1P/ozcGatZsVYQLOsfchTmsmxLsHS1kjVUqOg8sQTT6Br165ITk7WrqECAH369MGwYcN0Vhzpxt2HgN5ddxrf8xAQETU0RTlAzGpNQEmJudPuHAx0eBYIfhJQWElXH9VYjYIKALi4uMDFxQXXrl0DALi7u3OxNwN191lA23kWEBE1JCmnNWfunPoTKM7VtHFZ+walRnNU1Go15s6dC2tra3h6esLT0xM2Njb44IMPoFardV0j6UDZISCAZwERUT1XUgCcXAn82A9YEqoZRSnO1Sxr3/9j4NVzwLDFgEcHhpQGoEYjKu+++y5++uknfPLJJwgNDQUA7N+/HxERESgsLMRHH32k0yJJN6b01CwEx0NARFQfWRQmQ7bjfeDUqvLL2geEaUZPvLoxmDRANQoqv/zyC3788UftVZMBICQkBE2aNMGLL77IoGKg7j0EtOHkdQxtw0NARGTACrOAc/9AHr0SfeP23Wm3bqpZlI3L2jd4NQoqGRkZ8Pf3r9Du7++PjIyMWhdF+lN2COjL7Rfx2upo/HIoDp297fGItz3ae9nC3KTG05aIiHSjpAC4GAmcXgNc3AaoiiADIEKA6NsPso7PA759uKx9I1Gj30qtWrXCokWLKqxCu2jRIoSEhOikMNKfKT19cDzhFnZfuIkTCZk4kZCJ73ZfgZFMQCsPGzzibYdHvO3RzpPBhYjqiKoUuLpbE07O/QMU59x5zNEfqsBh2JnmiF5Dx0FmbCxZmVT3avRb6LPPPsPgwYOxY8cO7Roqhw4dQmJiIjZv3qzTAkn3jOUyLJ/QEYkZ+Th8NR2Hr2bg8NV0JGUW4Fj8LRyLv4Vvd12BsVxAK3cbPOJtj84+9mjb1BZmJvwLhoh0RK0Grh3RnFZ8Zj2Qn3bnMWsPIGiE5rRi55ZQl5aigL9fGqUaBZUePXrg4sWL+Pbbb3H+/HkAwPDhwzFp0iR8+OGH2usAkWHzsDOHh505nmzvAQBIzMjHoavpmvByJR3XswpxNP4WjsbfwqJdl2EsF9Da43Zw8bZHW09bmBozuBBRNYgicOO0JpycXgtkJd55zNwBaDkMCH5Cs3qsrEYnplIDU+NxfTc3twqTZqOjo/HTTz/h+++/r3VhVPfKgstT7T0giiISMwpuj7ik49DVdCRnFSIq7hai4m5h4b+XYSKXobWHDTp62cChSOrqicigZVwFYv7SBJS0C3faTaw0Z+0EjwCa9QTkPNxM5fETQZUSBAFN7c3R1N4cT3XQBJeEuw4VHbqSjpTsQhyJy8CRuAzYmMjxRJgaPHRMRFo5KZpRk9NrgKRjd9rlCqD5o5rDOn6PAsZm0tVIBo9BhapEEAR42lvA094CT3doClEUEZ+uCS5fbr+I1JwibDh5HWM6N5O6VCKSUsEt4OxGTTiJ3QdA1LQLMsC7JxD0BBDwGGBqLWWVVI8wqFCNCIIALwcLeDlYILugGB9vuYAf98dhZCcvyGVccImoUSnOBy5uAWLWAJe2A+qSO495dNKEk5ZDAUsnyUqk+qtaQWX48OEPfDwzM7M2tVA99VS7Jliw7Txi0/Ox7UwKBga7Sl0SEembqgS48q8mnJzfBJTk3XnMqaVmQmzQCMDWU7oaqUGoVlCxtn7wUJ21tTXGjRtXq4Ko/rFQGKGbi4jIJAFL9lzBgCAXLs1P1BCp1UDCQU04ObsBKLhrgU8bz9vh5AnAOVC6GqnBqVZQWbZsmb7qoHquu6sae1KNEH0tC4eupKOLr4PUJRGRLogikBx9e62TdUB20p3HLJyAoOGaSbFN2vE6O6QXnKNCOmFpDDzZtgl++y8Ri/dcYVAhqu/SLmlGTk6vAdIv32lXWAOBYZqRk2bduYw96R2DCunMs6FeWBF1DfsupeF0UhaCmnBWP1G9kpUEnFmrGT1Jjr7TbmQKNB9w+3TifoCRQroaqdFhUCGdcbc1Q1iIK9afvI4le65g0ei2UpdERA+TnwGcXa9ZjC3+AO6cTiwHfHprwon/IEBhJWWV1IgxqJBOTe7pg/Unr2NzTDLi0/PgaW8hdUlEdK+iXODCZs2hnSs7AXXpnceadtGsEhs4FLDgIVySHoMK6ZS/ixK9Wjhi14Wb+H7vVXw0LFjqkogIAEqLgMs7NYd1LmwBSgvuPOYSojljp+VwwMZDuhqJKmEwV3z65JNPIAgCZsyYIXUpVEtTevoCAFYfu4bUnEKJqyFqxNQq4OoeYMM04HM/YNUozRyU0gLAzhvo8SYwNQqYvA8IfZkhhQySQYyoREVFYenSpQgJCZG6FNKBDl62aNvUBscTMrH8QBzeGOAvdUlEjYcoAknHNWfrnF4L5KbceczKVTNqEvwE4NaGpxNTvSB5UMnNzcWYMWPwww8/4MMPP5S6HNIBQRAwpacvnv/1KH47HI8pPX1gZcqrFRLp1c0LmsM6MWuAW7F32k1tgMAhmkmxnl14OjHVO5IHlalTp2Lw4MHo27fvQ4NKUVERioqKtPezs7MBACUlJdpb2X2qO5X1e3cfW/g6WuDyzTz8digWz3flxQp1jZ93aRhUv2ddg+zsWshOr4WQelrbLBqbQ2w+AOrA4RB9egNyE80DKrXmVg8ZVL83Ivrq9+q8niCKoqjTvVfDqlWr8NFHHyEqKgqmpqbo2bMnWrdujQULFlS6fUREBObMmVOhfcWKFTA3N9dztVRdR1IF/H5FDqWxiNltVTAymBlRRPWXSUk23DKPwP3WIdjnXdK2qyFHqjIY12w7I8W6LVRyrnVChis/Px+jR49GVlYWlErlA7eVLKgkJiaiffv22L59u3ZuysOCSmUjKh4eHkhLS4NSqURJSQm2b9+Ofv36wdiYhxrqyv36vbhUjT5f7UNKdhE+GhKIp9q7S1hlw8PPuzQk6feiHAgXNkN2Zi2E2N0QRBUAQIQA0bML1C1HQPQPA8xs66YeCfDzLg199Xt2djYcHByqFFQkO/Rz7NgxpKamom3bO4uCqVQq7N27F4sWLUJRURHk8vLHUhUKBRSKin8lGBsbl+vAe+9T3aj4fQCe7+6DD/45ix8PxGNkJy/IZZy8p2v8vEtD7/1eUghc3q6Zd3IxEii96ww6tzZA0BMQgoZDULoZzumbdYCfd2nout+r81qSBZU+ffogJiamXNuECRPg7++PN998s0JIofppZAcPfLPzEmLT8rDtTAoGBrtKXRKR4VKVAnF7NRNiz/0NFGXfeczeTzMhNvgJwN5HuhqJ6phkQcXKygpBQUHl2iwsLGBvb1+hneovC4URwrt44Zudl7B4zxUMCHKBwFMiie4QReBalCacnFkL5N2885iyCRA0QhNOXEJ4OjE1SpKf9UP1XM4NyNdOQussFWR7ojULRindbt+aAGa2GN/FC9/vvYJT17Jw6Eo6r6xMBAA3zty5OnFmwp12Mzug5VDN6InHI4CsMR3YIarIoILK7t27pS6BqisrEbLY3fAEgP37Kj5uZAo7K1dstbbBiSxzZGxYD3RtfyfMWLkBlk5c24Eah1txt8PJX0Dq2TvtJpaA/2BNOPHuCcg5B4OojEEFFaqHbDxRGrYIF4/uRgtXK8hzU4DsJCAnWTOEXVoI3IqFFwAvOYAcAFv+LP8aglyzYqbSDVC6akZilG632+762sik7t8fUW3lpgJn1mkmxV6LutMuNwH8HtUc2mk+ADDhEgtElWFQodqxdIQYMhKXrinhN3AQ5HfP5C4t0gSW7OtA9nVs2HcU6ddj0cYmH21sCjTtOcmAqAKyr2luD2LheOeQ0r1BRtlEE3JMeLVmMgAFmcD5fzThJHYvIN5eZE2QAV7dNCMnAWGAmY2UVRLVCwwqpD9GCsDWS3MD0MLxUQxYsA+ydODf8T3h5WChOcshLxXITtaMxGRfB3Kua8ONpi0ZUBVpRmjybgLJ0fffp6m1JrRoR2ia3DVn5vbN1IaTEkn3SgqAi1s1h3YubQNUxXcea9L+9tWJhwFWLtLVSFQPMahQnfF3UaK3vxP+PZ+K7/ddxcfDggG50Z0AgXaVP1EUgfyMBweZ7CSgOBcozNLc7j7+fy9j8wcHGWUTwNyBkxjp4VQlmqsTx6zWjKAU5955zNFfE06CRmiuVExENcKgQnVqcg8f/Hs+FWuOXcOMvn5wsjJ9+JMEAbCw19xcH3CF7cLs24eaku4KMveEmoIMoCQfyLiiud2PzLjyeTNlE4CVbpq/jDnpsfER1bDLvQDZll3A+Y1Afvqdx6ybAsEjgKAnAOeWHLkj0gEGFapTHbxs0c7TFsfib2HZgTi8OcBfdy9uqtTcHFvcf5uSgnLzZsqFmLL2nBRAXQJkJWhu9yUAls73DzJlN2Mz3b1HejBR1BxyKSnQ3EoLNCu83v11acFdjxdW3LbC44WacHt7W6PCTHQruHVnn+YOmkM6wU8CHh0ZToh0jEGF6pQgCJjcwwfP/3oU/zsUjyk9faA0rcNRCWMzzTD8g4biVSVA7o3y82buDjJlh5vUJUBuiuZ2/cT9X8/M9j4TgO+6KZQN9xecqvSuwHDnF77m3/wqhYOK2z4gfEC/ly8TAJTITCEPGgpZyFNAsx6aQ5hEpBf830V1ro+/E/ycLHEpNRcr/kvA5B4Gthy43Biwdtfc0KHybdRqzZD/w+bNlOQDBbc0txun779PE8tKgsw9ZzWZ2+smzKjVml/8VRpNuN/jVdn2drhQl9a+5poQZJr5SEammn+NTW9/baa5GZndbjO7q830Pl/f2bZEMMbWo1cw4LGhkPGaM0R6x6BCdU4mE/BCDx/MXB2Nn/bHYnwXL5ga17MF32QywNJRc3NrXfk2oqiZ2HvfIHP768JMzSTMtIua2/3ITcoFGZmlMwKT4iDbth9QFVZttKEsoEil7Jd/DUNCtbaVG+tnlKqkBGpZou5fl4gqxaBCkni8lRu+3HYB17MKse5EEkZ1bCp1SbonCJp1MsxsAOfA+29XnP+AScC3DznlpmrmXmTGa24A5AD8ACC1FjXKjKsZEh4UGB7yuFzBM6mIqNoYVEgSJkYyTOzmjQ/+OYule67gqfYekMsa6ByNhzEx11wN90FXxC0t1syFuSvEqLKuIe7qVXj5BUKusLjr0IZ51QMF51YQkYHjTymSzMgOHvhm5yXEpecj8kwKBgW7Sl2S4TIyAWyaam63qUtKcHrzZjTtdc+KwEREDQjHYUkyFgojhHfxAgAs3n0FoqjfszWIiKj+YVAhSWkm0soQk5SFg1fSH/4EIiJqVBhUSFJ2FiYY2UFzOGPx7gesFEtERI0SgwpJbmLXZpDLBOy/nIaYa1lSl0NERAaEQYUk52FnjsdbuQEAluzhqAoREd3BoEIG4YUemiXtt5xORmxansTVEBGRoWBQIYPg76JEb38nqEVg4vIo/Hk0EcWlaqnLIiIiiTGokMGY+WgLWJsZ42paHt5YcwrdP9uFH/ZeRW6RRNeKISIiyTGokMEIdFNi35u98NZAfzhZKZCSXYiPNp9Dl3k7MT/yPG7mFEldIhER1TEGFTIoSlNjTO7hg31v9sKnI4Lh7WiB7MJSfLvrCkI//RfvrItBHOewEBE1GgwqZJAURnI83aEpdrzSA0ueaYfWHjYoLlVjxX8J6P3Fbkz9/ThPZSYiagR4rR8yaDKZgAFBLujf0hlHYjOwZM8V7LpwE5tikrEpJhldfOwxuYcPuvk5QBAM+6KGiRn5+PlALKwURpjRtzlkjfUijERE1cCgQvWCIAjo5G2PTt72OJ+SjaV7rmJj9HUcvJKOg1fS0dJNiRd6+GBQkAuM5IY1UBifnodvd13G2uNJKFVrrmeUV6zC+48FSlwZEZHhM6yf6ERV4O+ixFdPt8ae13tiQqgXzIzlOHM9Gy+tPIFeX+zGr4fiUFCskrpMxKbl4bU/o9H7iz348+g1lKpFtGlqAwD4aX8sftx3VdoCiYjqAY6oUL3lbmuO2WEt8VJvP/x6KB6/HIpDYkYBZm04gwU7LiG8sxeGt20CDzvzOq3rys1cLPr3MjacTMLtART0bOGI6b390M7TFt/vvYKPN5/Hh5vOwUlpql2Vl4iIKmJQoXrP1sIEL/f1w6Tu3lh9LBHf772Ka7cK8NWOi/hqx0UEuipvz3NxQXNnS73NZbl0IwcL/72Mv09dh3g7oPTxd8L0Pn5o7WGj3e75bt5IzirEsgNxeO3Pk3CwMEEXXwe91EREVN8xqFCDYWYix7jOXhjdsSk2xSRj5ZEEHInNwNnkbJxNzsaX2y/Cy94c/W+HltbuNjqZ0HohJQff/HsJm2OStQGlX6AzXurth2B36wrbC4KA9wcHIjW7CJtikvHCb8fw5+TOCHBV1roWIqKGhkGFGhwjuQxDWjfBkNZNkJFXjB3nbiDydAr2XU5DXHo+lu65iqV7rsJZqcCjgZrQ0snbDsbVnIR79no2Fv57CVtOp2jbBrR0wfQ+vmjpVjGg3E0mE/DFU61wM7cIR2IzMH7ZEax9MRRNbMxq9J6JiBoqBhVq0OwsTPBUew881d4DuUWl2H0hFZFnbmDX+VTcyC7Cb4fj8dvheFibGaNPgBP6t3RBdz9HmJnI7/uap5Oy8M3OS9h29gYAQBCAQUGumN7HF/4uVR8VMTWW44ex7fHk0oO4eCMX4T8fwZrJnWFjblLr901E1FAwqFCjYakwwmMhbngsxA1FpSocvJyOyDMp2H72BtLzirH2eBLWHk+CmbEcPZo7on+QM3r7O8PazBgAcOpaJr7ZeQk7zqUC0ASUx0LcML23L5o7W9WoJmtzYyyf0BHDvzuIy6m5mPTrMfw6sSNMje8flIiIGhMGFWqUFEZy9PJ3Qi9/J3w0TMTRuAxEnrmByDMpSMoswNYzKdh6JgVGMgGdfewhEwTsuXgTACATgMdbuWFabz/4OlnWuhY3GzMsf7YDnlxyCEfiMvDqnyexcFRbyLkgHBERgwqRXHZnMbn3HwvAmevZiDyTgq2nU3ApNRf7LqVptxvS2g3TevnC27H2AeVu/i5KfD+2PcJ/PoLNMSlwsjqL2WGBBr/aLhGRvjGoEN1FEAQENbFGUBNrvPZoC1y5mYvIMynILSzFU+094OVgobd9d/axx5dPt8K0FSew/GAcXK1N8UIPH73tj4ioPmBQIXoAH0dLvNjTt87291iIG25kF+GDf85i3pbzcFaaYmibJnW2fyIiQ8Ml9IkMzMSuzfBc12YAgNfXRGP/7UNPRESNEYMKkQF6Z1AAHgtxRYlKxOT/HcOZ61lSl0REJAkGFSIDVLYg3CPedsgtKsX4ZVFIzMiXuiwiojrHoEJkoBRGciwd2x7+Lla4mVOE8GVHcCuvWOqyiIjqFIMKkQGzNtMsCOdmbYqrN/Pw3K9HUViikrosIqI6w6BCZOBcrE2x/NmOUJoa4Vj8Lby08gRUalHqsoiI6gSDClE90NzZCj+Gd4CJkQzbzt5AxMYzEEWGFSJq+BhUiOqJjs3ssODp1hAE4LfD8Vi6N1bqkoiI9I5BhageGRTsitmPBQIAvthxGUducol9ImrYGFSI6pnxoc3wQg9vAMAfV2Q4cz1b4oqIiPSHQYWoHnqzvz96t3BEqSjgpT+ikV1YInVJRER6waBCVA/JZAI+HR4EO4WIhIwCvLnmFCfXElGDxKBCVE/ZmBtjvJ8KxnIBW06nYPnBOKlLIiLSOQYVonrM0wp4a0ALAMDHm8/hRMItiSsiItItBhWiem5sJw8MCnZBiUrEtBUnuMw+ETUoDCpE9ZwgCPhkRAi87M2RlFmAV/88CTVXriWiBoJBhagBUJoa47sx7WBiJMOuCzexdO9VqUsiItIJBhWiBiLQTYm5j7cEAHy+7QL+u5oucUVERLXHoELUgDzdwQPD2zSBSi1i+soTuJlTJHVJRES1wqBC1IAIgoAPhwXBz8kSqTlFmPEHr7RMRPUbgwpRA2NuYoTvxrSFmbEcBy6n45udl6QuiYioxhhUiBogP2crfDw8CADwzb+XsO/STYkrIiKqGQYVogZqWBt3jOrYFKIIzFh1EilZhVKXRERUbQwqRA3Y7LBABLoqkZ5XjOkrj6NUpZa6JCKiamFQIWrATI3l+G5MW1gqjBAVdwvzt12QuiQiomphUCFq4LwcLDD/iRAAwNI9V7Hj7A2JKyIiqjoGFaJGYGCwKyaEegEAXlsdjcSMfGkLIiKqIgYVokbi7YEBaOVhg6yCEkxbcRzFpZyvQkSGj0GFqJEwMZLh29FtYG1mjOhrWfh48zmpSyIieigGFaJGxN3WHF8+1QoAsPxgHDadSpa4IiKiB2NQIWpk+gQ4Y3IPHwDAm3+dQmxansQVERHdn6RBZd68eejQoQOsrKzg5OSEoUOH4sIFnj5JpG8zH22Ojl52yC0qxYu/H0dhiarWrymKIgqKVcgvLtVBhUREGkZS7nzPnj2YOnUqOnTogNLSUrzzzjt49NFHcfbsWVhYWEhZGlGDZiSXYeHoNhj09T6cS87GnL/PYN7wEIiiiNyiUmQVlCC7QPOv5usSZBeWaO/f3a75uhTZBSUoVqkhCMCgIFdM6emDoCbWUr9VIqrnJA0qW7duLXd/+fLlcHJywrFjx9C9e3eJqiJqHJyVpvh6ZBuM/fk/rDySiC2nU5BTWFrrqy2LIrApJhmbYpLRvbkjXuzpg07N7CAIgo4qJ6LGRNKgcq+srCwAgJ2dncSVEDUOXf0c8Erf5vhy+0Vk5pdo203kMijNjKE0M4K1mXG5m9L0rq+1/97Z7tqtAizZcwV/R1/H3os3sffiTbRtaoMXe/qiT4ATAwsRVYvBBBW1Wo0ZM2YgNDQUQUFBlW5TVFSEoqIi7f3s7GwAQElJifZWdp/qDvtdGrrq98ndPNGruT1kAjTBw9QYpsayGgcKXwczfD4iCC/18saP++Pw14nrOJ6Qied+PYrmTpZ4oXszDApyhpG8fs7l5+ddGux3aeir36vzeoIoirUb59WRKVOmYMuWLdi/fz/c3d0r3SYiIgJz5syp0L5ixQqYm5vru0QiqoGsYmBPsgz7bwgoUmnCj71CRG83NTo5iTCun3mFiGohPz8fo0ePRlZWFpRK5QO3NYigMm3aNGzYsAF79+5Fs2bN7rtdZSMqHh4eSEtLg1KpRElJCbZv345+/frB2Ni4LkongP0ukfrW71kFJfj9v0QsPxSPW7cPMzlammB8F0+M6uABK1ODGeB9oPrW7w0F+10a+ur37OxsODg4VCmoSPqTQRRFTJ8+HevWrcPu3bsfGFIAQKFQQKFQVGg3NjYu14H33qe6wX6XRn3pdwdjY7zcrwUm9fDFqqgE/LD3Kq5nFWL+tktYujcW4zp7YUKoF+wtK/4fN0T1pd8bGva7NHTd79V5LUkHXadOnYr//e9/WLFiBaysrJCSkoKUlBQUFBRIWRYR6ZGZiRwTQpth9+u9MP+JEPg4WiC7sBSLdl1G6Kf/ImLjGSRl8mcAEWlIGlQWL16MrKws9OzZE66urtrbH3/8IWVZRFQHTIxkeLK9B7a/0gNLnmmLEHdrFJaosfxgHHp8tguv/RmNy6k5UpdJRBKT/NAPETVuMpmAAUGu6N/SBQcup+O73Zdx8Eo6/jp+DX8dv4aOzewwqqMHBga5wtRYLnW5RFTH6sfsNSJq8ARBQFc/B3T1c8CJhFtYvPsKdpy7gSOxGTgSm4GIjWcxrE0TjOzoAX+XB0++I6KGg0GFiAxOm6a2+H5ce1zPLMDqo9fw59FEJGUWYPnBOCw/GIfWHjYY1dEDj4W4wULBH2NEDRn/hxORwXKzMcPLff0wrbcv9l26iVVHErHj3A2cTMzEycRMfPDPOYS1csOojh4IbmKt11VvRVHEzZwinE/ORD6vu0hUZxhUiMjgyWUCerZwQs8WTriZU4S/jl/DqiMJiEvPx8ojCVh5JAGBrkqM6uiBIW2aQGlau9MoS1VqxKbl4WxyNs5ez8bZ5GycS85GWm4xAMDJVI6+fUvgaM3TZIn0jUGFiOoVRysFJvfwwQvdvXH4agZWRSVgy+kUnE3OxvsbzuCjzecwOFgzytLO0/ahoyy5RaU4fzuIlAWT8yk5KCpVV9hWJmjOVkotVGPKihP433OPcIIvkZ4xqBBRvSQIAjr72KOzjz0i8oqx7kQSVkUl4OKNXO0ZQ75OlhjZwQPD27rD1twYN7KLcDY5SztKcvZ6NuLS8yt9fXMTOQJclQh0VSLQTfNvc2crXE3NwhOLD+JofCZeWx2NhSPbQCbjhRaJ9IVBhYjqPVsLEzzbtRkmhHrheEImVh1JwD+nknE5NRcfbjqHz7ZegKWpETLyiit9vovSVBtGAt2UCHBVwtPOvNIA0tzZChNbqLH0ghE2nUqGm7Up3h0cqO+3SNRoMagQUYMhCALaedqinactZoUFYmP0daw6koiYpCxk5BVDLhPg62h5O4xYIdDVGgGuVtVett/PWsS8YUGYuSYGP+yLhZuNGSaEPvgSIERUMwwqRNQgWZkaY0wnT4zp5IlLN3JQWKKGn7OlzuaUDGnlihs5xZgfeQFz/zkLV2tTDAhy1clrE9EdvMA6ETV4fs5WCHa31vnE1xd7+mB0p6YQReDlVSdxLD5Dp69PRAwqREQ1JggC5j7eEn38nVBUqsZzvxzF1Zu5UpdF1KAwqBAR1YKRXIaFo9sgxN0at/JLMH5ZFNJyi6Qui6jBYFAhIqolcxMj/BTeAR52ZkjIyMfEX44iv5jL1xLpAoMKEZEOOFopsHxCR9iYGyM6MRMvrTwJlZpXiCeqLQYVIiId8XG0xI/j2sPESIYd524gYuMZiCLDClFtMKgQEelQey87fP10awgC8NvheCzde1XqkojqNQYVIiIdGxjsivdur1b7yZbz2HAySeKKiOovBhUiIj2Y2LUZJnbVrFY7c3U0Dl1Jl7giovqJQYWISE/eHRSAQcEuKFGJmPTbUVy8kSN1SUT1DoMKEZGeyGQCvnyqNdp72iKnsBTjfz6CG9mFUpdFVK8wqBAR6ZGpsRw/jGsPb0cLXM8qxIRlUcgt4horRFXFoEJEpGe2Fib4ZUJHOFia4GxyNqb87xhKVGqpyyKqFxhUiIjqgIedOX4e3wFmxnLsu5SGd9bGcI0VoipgUCEiqiMh7jb4dkwbyARg9bFr+HrnJalLIjJ4DCpERHWot78zPhwaDABYsOMSXv3zJGKuZUlcFZHhMpK6ACKixmZ0p6ZIySrAN/9extrjSVh7PAltmtpgXGdPDAp2hcJILnWJRAaDIypERBJ49dEWWPtiFwxr0wTGcgEnEjLxyh/R6DLvX3weeQHXMwukLpHIIHBEhYhIIm2b2qJtU1u8MygAf0Ql4Pf/EpCcVYhFuy5j8Z4r6BfgjHFdPNHZ2x6CIEhdLpEkGFSIiCTmaKXAtN5+mNzDBzvO3cAvB+Nx6Go6tp5JwdYzKfBzssS4zp4Y1tYdlgr+2KbGhZ94IiIDYSSXYUCQKwYEueLijRz8eigOa48n4VJqLt7fcAafbr2AEW2bYGxnL/g6WUpdLlGd4BwVIiID1NzZCh8ODcbhd/ogIiwQ3o4WyC0qxS+H4tH3yz145sf/sO1MClRqrsVCDRtHVIiIDJjS1BjjQ5shvIsXDlxOxy+H4rDz3A3sv5yG/ZfT0MTGDGMeaYqn23vA3lIhdblEOsegQkRUDwiCgK5+Dujq54DEjHz8/l8C/ohKQFJmAT7begFfbLuIoCbW6Ohli47N7NHByxY25iZSl01UawwqRET1jIedOd4a6I8Zff3wz6lk/HooDqeuZSE6MRPRiZn4YV8sAKCFsxU6NNMEl45ednCxNpW4cqLqY1AhIqqnTI3leKKdO55o546kzAJExWbgv9gMRMVl4HJqLi7cyMGFGzn43+EEAEBTO3N08LJDp2Z26NDMDl725jztmQwegwoRUQPQxMYMTdo0wdA2TQAA6blFiIq7hSOxGTgSl46z17ORkJGPhIx8/HX8GgDNadEdvezQ4fbhohYuVpDLGFzIsDCoEBE1QPaWCgwIcsGAIBcAQE5hCY7F30JUXAaOxGYgOjELN3OKsCkmGZtikgEAVqZG6OBlh/ZetmjlboNgd2soTY2lfBtEDCpERI2BlakxerZwQs8WTgCAwhIVohMzERWnOVx0PP4WcgpL8e/5VPx7PlX7PG9HC7Ryt0GIuzVaedgg0FUJU2Nei4jqDoMKEVEjZGosRydve3Tytsc0AKUqNc4mZ+NIbAZOJGQi+lomrt0qwNWbebh6Mw/rTiQBAIxkAlq4WKGVhw1auVsjxN0Gfk6WMJJzWS7SDwYVIiKCkVyGEHcbhLjbaNvSc4s0ZxNdy9SeVZSeV4wz17Nx5no2Vvyn2c7MWI6gJkqEuNtoA0xTO07UJd1gUCEiokrZWyrQy98Jvfw1h4tEUURSZoE2vEQnZuJ0UjZyi0oRFXcLUXG3tM+1MTdGiLsN3KxNYSQXYCyX3b4JMJJp/jWWy2Akl8FELsBILoORTICJkeyex28/VxCh4iK8jRKDChERVYkgCHC3NYe7rTkGBbsCANRqEVfTcnEyMQunrmUi+loWzl3PRmZ+CfZevKnT/Tcxl6NtaAG8HDnBtzFhUCEiohqTyQT4OlnB18kKT7RzBwAUl6pxPiUbp65lIaugBMWlapSq1ShRiShRqVF6+1/tfbUaxaUiStWax4pVapSWe1xEclYBkvJVGLb4ML4d0xZdfBwkfudUVxhUiIhIp0yMKs53qa2EtByMWbwHiXklGPvTEbw7KAATQr04D6YR4DRtIiIyeK7WpnippQrDWrtCpRYx95+zeG11NApLVFKXRnrGoEJERPWCiRz4dHgQZj0WCLlMwNrjSXhyySFczyyQujTSIwYVIiKqNwRBwLNdm+G3iR1ha26MmKQshC3cj/+upktdGukJgwoREdU7XXwcsHFaVwS6KpGeV4wxP/6HXw/FQRTr7hzmxIx8HInNQKlKXWf7bIw4mZaIiOolDztz/DWlC9786xQ2Rl/HrA1ncDopCx8MDYLCSD/L/IuiiCOxGfj5QCy2n70BtQi4WZtibGcvjOroARtzE73stzFjUCEionrLzESOr0e2RnATa8zbcg5/Hr2GizdyseSZdnCxNtXZfopKVfgnOhk/H4jFmevZ2nYrhRGuZxXi063n8fXOixje1h0TunjBz9lKZ/tu7BhUiIioXhMEAc9394a/qxWmrTiBk4mZCFu0H0ueaYt2nna1eu203CL8fjgBvx2OR1puEQDA1FimDSQedubYGH0dyw7E4VxyNlb8l4AV/yWgm58Dng1thh7NHSGT8RTq2mBQISKiBqGbnyP+ntYVk347ivMpORj5/WHMeTwIozs1rfZrnb2ejWUHYrEh+jqKSzVzUFyUphjXxROjOjSFrcWdQzxPtffAk+3c8V9sBn7eH4vt525g36U07LuUBm8HC4wP9cKItu6wUPBXbk2w14iIqMFoaq+Zt/L6mmhsjknBO+ticPp6FiLCWsLE6MHnj6jVIv49n4qf9sfi0F1nEbXysMHErs0wMMgFxve5SrQgCHjE2x6PeNsjIT0fvxyKw59RibialodZG85gfuQFjOzggXGdNaMwVHUMKkRE1KBYKIzw7ei2WLznCuZHXsCK/xJwISUHi8e0hZOy4ryV3KJSrDmaiOUH4xCXng8AkMsEDAxywbNdm6FtU9tq7b+pvTnefywQr/Rrjr+OXcOyA7GIS8/HD/ti8dP+WPQLdMazoc3QsZmdwa6sW1iiQlpuEW5k5uOGxMvUMKgQEVGDIwgCXuzpiwBXJV5aeQLH4m/dnrfSDm1uB4/EjHz8cjAOf0QlIqeoFACgNDXCqE5NMa6zF5rYmNWqBkuFEcK7eGHsI57YfTEVyw7EYd+lNESeuYHIMzcQ6KrEhFAvhLVyg6mxfs5SKqNWi8gqKEF6XhHScouRlluE9Nv/puUWIz23SNOWV4z03GLk3u4PAOjoKMMEvVb3YAwqRETUYPVq4YSN07ri+V+P4nJqLp5eehgv9/VDzLUsbDubAvXtZVe8HS0wIbQZRrRtAnMT3f5qlMkE9PZ3Rm9/Z1y8kYNlB+Kw7sQ1nE3OxutrTuHTrecxupMn+gY4QS3ingsyVnbBxrKLOmou2FhSqkaJuuyCj5rnZhWUlAshGXnFKFVXb40ZE7kM9pYmMJXn67Q/qotBhYiIGrRmDhZYPzUUr/5xEtvO3sD8yAvax7r5OeDZrs3Qw69uzs5p7myFecOD8Ub/FlgZlYDfDsUjOasQ3+y8hG92XtL7/pWmRnCwUsDBQgEHKxPYWyhgb2kCB0sFHCxNYG+pgIOlps1KYYTS0lJs3rxZ73U9CIMKERE1eJYKIyx5ph2+3XUZvx2OR58AZ0wI9UJzidY7sbUwwYs9ffF8N29sPZ2C3w7FIzY9DyZyGYzkAozlMhjJBJgYaf41lss0bfKyr8u2uetruaB9vtLUWBs4HG6HDzsLk4dOKDZEDCpERNQoyGQCpvfxw/Q+flKXomUslyGslRvCWrlJXYrBqn/RioiIiBoNBhUiIiIyWAwqREREZLAYVIiIiMhgMagQERGRwWJQISIiIoPFoEJEREQGi0GFiIiIDBaDChERERksgwgq3377Lby8vGBqaopOnTrhyJEjUpdEREREBkDyoPLHH3/g1VdfxezZs3H8+HG0atUK/fv3R2pqqtSlERERkcQkDypffvklnn/+eUyYMAGBgYFYsmQJzM3N8fPPP0tdGhEREUlM0qBSXFyMY8eOoW/fvto2mUyGvn374tChQxJWRkRERIZA0qsnp6WlQaVSwdnZuVy7s7Mzzp8/X2H7oqIiFBUVae9nZ2cDAEpKSrS3svtUd9jv0mC/S4P9Lg32uzT01e/VeT1Jg0p1zZs3D3PmzKnQvn79epibm2vvb9iwoS7LotvY79Jgv0uD/S4N9rs0dN3v+fn5AABRFB+6rSBWZSs9KS4uhrm5OdasWYOhQ4dq28PDw5GZmVmhY+4dUUlKSkJgYGBdlUtEREQ6lJiYCHd39wduI+mIiomJCdq1a4edO3dqg4parcbOnTsxbdq0CtsrFAooFArtfUtLSyQmJsLKygqCICA7OxseHh5ITEyEUqmsq7fR6LHfpcF+lwb7XRrsd2noq99FUUROTg7c3Nweuq3kh35effVVhIeHo3379ujYsSMWLFiAvLw8TJgw4aHPlclklSYxpVLJD7IE2O/SYL9Lg/0uDfa7NPTR79bW1lXaTvKg8vTTT+PmzZuYNWsWUlJS0Lp1a2zdurXCBFsiIiJqfCQPKgAwbdq0Sg/1EBERUeMm+YJvuqRQKDB79uxy81hI/9jv0mC/S4P9Lg32uzQMod8lPeuHiIiI6EEa1IgKERERNSwMKkRERGSwGFSIiIjIYDGoEBERkcFqMEHl22+/hZeXF0xNTdGpUyccOXJE6pIavL179yIsLAxubm4QBAHr16+XuqQGb968eejQoQOsrKzg5OSEoUOH4sKFC1KX1eAtXrwYISEh2kWvOnfujC1btkhdVqPzySefQBAEzJgxQ+pSGrSIiAgIglDu5u/vL1k9DSKo/PHHH3j11Vcxe/ZsHD9+HK1atUL//v2RmpoqdWkNWl5eHlq1aoVvv/1W6lIajT179mDq1Kk4fPgwtm/fjpKSEjz66KPIy8uTurQGzd3dHZ988gmOHTuGo0ePonfv3hgyZAjOnDkjdWmNRlRUFJYuXYqQkBCpS2kUWrZsieTkZO1t//79ktXSIE5P7tSpEzp06IBFixYB0FwvyMPDA9OnT8dbb70lcXWNgyAIWLduXbmLS5L+3bx5E05OTtizZw+6d+8udTmNip2dHebPn4+JEydKXUqDl5ubi7Zt2+K7777Dhx9+iNatW2PBggVSl9VgRUREYP369Th58qTUpQBoACMqxcXFOHbsGPr27attk8lk6Nu3Lw4dOiRhZUT6l5WVBUDzS5PqhkqlwqpVq5CXl4fOnTtLXU6jMHXqVAwePLjcz3nSr0uXLsHNzQ3e3t4YM2YMEhISJKvFIJbQr420tDSoVKoK1wZydnbG+fPnJaqKSP/UajVmzJiB0NBQBAUFSV1OgxcTE4POnTujsLAQlpaWWLduHQIDA6Uuq8FbtWoVjh8/jqioKKlLaTQ6deqE5cuXo0WLFkhOTsacOXPQrVs3nD59GlZWVnVeT70PKkSN1dSpU3H69GlJjx03Ji1atMDJkyeRlZWFNWvWIDw8HHv27GFY0aPExES8/PLL2L59O0xNTaUup9EYOHCg9uuQkBB06tQJnp6e+PPPPyU51Fnvg4qDgwPkcjlu3LhRrv3GjRtwcXGRqCoi/Zo2bRr++ecf7N27F+7u7lKX0yiYmJjA19cXANCuXTtERUXh66+/xtKlSyWurOE6duwYUlNT0bZtW22bSqXC3r17sWjRIhQVFUEul0tYYeNgY2OD5s2b4/Lly5Lsv97PUTExMUG7du2wc+dObZtarcbOnTt5/JgaHFEUMW3aNKxbtw7//vsvmjVrJnVJjZZarUZRUZHUZTRoffr0QUxMDE6ePKm9tW/fHmPGjMHJkycZUupIbm4urly5AldXV0n2X+9HVADg1VdfRXh4ONq3b4+OHTtiwYIFyMvLw4QJE6QurUHLzc0tl7BjY2Nx8uRJ2NnZoWnTphJW1nBNnToVK1aswIYNG2BlZYWUlBQAgLW1NczMzCSuruF6++23MXDgQDRt2hQ5OTlYsWIFdu/ejcjISKlLa9CsrKwqzL+ysLCAvb0952Xp0cyZMxEWFgZPT09cv34ds2fPhlwux6hRoySpp0EElaeffho3b97ErFmzkJKSgtatW2Pr1q0VJtiSbh09ehS9evXS3n/11VcBAOHh4Vi+fLlEVTVsixcvBgD07NmzXPuyZcswfvz4ui+okUhNTcW4ceOQnJwMa2trhISEIDIyEv369ZO6NCKdu3btGkaNGoX09HQ4Ojqia9euOHz4MBwdHSWpp0Gso0JEREQNU72fo0JEREQNF4MKERERGSwGFSIiIjJYDCpERERksBhUiIiIyGAxqBAREZHBYlAhIiIig8WgQkQNiiAIWL9+vdRlEJGOMKgQkc6MHz8egiBUuA0YMEDq0oionmoQS+gTkeEYMGAAli1bVq5NoVBIVA0R1XccUSEinVIoFHBxcSl3s7W1BaA5LLN48WIMHDgQZmZm8Pb2xpo1a8o9PyYmBr1794aZmRns7e0xadIk5Obmltvm559/RsuWLaFQKODq6opp06aVezwtLQ3Dhg2Dubk5/Pz8sHHjRv2+aSLSGwYVIqpT77//PkaMGIHo6GiMGTMGI0eOxLlz5wAAeXl56N+/P2xtbREVFYXVq1djx44d5YLI4sWLMXXqVEyaNAkxMTHYuHEjfH19y+1jzpw5eOqpp3Dq1CkMGjQIY8aMQUZGRp2+TyLSEZGISEfCw8NFuVwuWlhYlLt99NFHoiiKIgBx8uTJ5Z7TqVMnccqUKaIoiuL3338v2trairm5udrHN23aJMpkMjElJUUURVF0c3MT33333fvWAEB87733tPdzc3NFAOKWLVt09j6JqO5wjgoR6VSvXr2wePHicm12dnbarzt37lzusc6dO+PkyZMAgHPnzqFVq1awsLDQPh4aGgq1Wo0LFy5AEARcv34dffr0eWANISEh2q8tLCygVCqRmppa07dERBJiUCEinbKwsKhwKEZXzMzMqrSdsbFxufuCIECtVuujJCLSM85RIaI6dfjw4Qr3AwICAAABAQGIjo5GXl6e9vEDBw5AJpOhRYsWsLKygpeXF3bu3FmnNRORdDiiQkQ6VVRUhJSUlHJtRkZGcHBwAACsXr0a7du3R9euXfH777/jyJEj+OmnnwAAY8aMwezZsxEeHo6IiAjcvHkT06dPx9ixY+Hs7AwAiIiIwOTJk+Hk5ISBAwciJycHBw4cwPTp0+v2jRJRnWBQISKd2rp1K1xdXcu1tWjRAufPnwegOSNn1apVePHFF+Hq6oqVK1ciMDAQAGBubo7IyEi8/PLL6NChA8zNzTFixAh8+eWX2tcKDw9HYWEhvvrqK8ycORMODg544okn6u4NElGdEkRRFKUugogaB0EQsG7dOgwdOlTqUoionuAcFSIiIjJYDCpERERksDhHhYjqDI80E1F1cUSFiIiIDBaDChERERksBhUiIiIyWAwqREREZLAYVIiIiMhgMagQERGRwWJQISIiIoPFoEJEREQGi0GFiIiIDNb/AV02jUDXe4DQAAAAAElFTkSuQmCC\n", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Access the log history\n", + "log_history = trainer.state.log_history\n", + "\n", + "# Extract training / validation loss\n", + "train_losses = [log[\"loss\"] for log in log_history if \"loss\" in log]\n", + "epoch_train = [log[\"epoch\"] for log in log_history if \"loss\" in log]\n", + "eval_losses = [log[\"eval_loss\"] for log in log_history if \"eval_loss\" in log]\n", + "epoch_eval = [log[\"epoch\"] for log in log_history if \"eval_loss\" in log]\n", + "\n", + "# Plot the training loss\n", + "plt.plot(epoch_train, train_losses, label=\"Training Loss\")\n", + "plt.plot(epoch_eval, eval_losses, label=\"Validation Loss\")\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Loss\")\n", + "plt.title(\"Training and Validation Loss per Epoch\")\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vyIwS-orvWzd" + }, + "source": [ + "This visualization helps in monitoring the training process and making informed decisions about hyperparameters tuning or early stopping.\n", + "\n", + "Training loss measures the error on the data the model was trained on, while validation loss measures the error on a separate dataset the model has not seen before. Monitoring both helps detect overfitting (when the model performs well on training data but poorly on unseen data).\n", + "\n", + "- validation loss >> training loss: **overfitting**\n", + "- validation loss > training loss: **some overfitting**\n", + "- validation loss < training loss: **some underfitting**\n", + "- validation loss << training loss: **underfitting**" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bf86e31d" + }, + "source": [ + "## Test Model Inference\n", + "\n", + "After the training is done, you'll want to evaluate and test your model. You can load different samples from the test dataset and evaluate the model on those samples.\n", + "\n", + "For this particular use case, the best model is a matter of preference. Interestingly, what we'd normally call 'overfitting' can be very useful for a game NPC. It forces the model to forget general information and instead lock onto the specific persona and characteristics it was trained on, ensuring it stays consistently in character.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "aab1c5c5" + }, + "outputs": [], + "source": [ + "from transformers import AutoTokenizer, AutoModelForCausalLM\n", + "\n", + "model_id = checkpoint_dir\n", + "\n", + "# Load Model\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " model_id,\n", + " torch_dtype=\"auto\",\n", + " device_map=\"auto\",\n", + " attn_implementation=\"eager\"\n", + ")\n", + "tokenizer = AutoTokenizer.from_pretrained(model_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3dccb57c" + }, + "source": [ + "Let's load all questions from the test dataset and generate outputs." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "1fd887f4" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Device set to use cuda:0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Question:\n", + "Do you know any jokes?\n", + "Original Answer:\n", + "A joke? k'tak Yez. A Terran, a Glarzon, and a pile of nutrient-pazte walk into a bar... Narg, I forget da rezt. Da punch-line waz zarcaztic.\n", + "Generated Answer:\n", + "Yez! Yez! Yez! Diz your Krush-tongs iz... k'tak... nice. Why you burn them with acid-flow?\n", + "--------------------------------------------------------------------------------\n", + "Question:\n", + "(Stands idle for too long)\n", + "Original Answer:\n", + "You'z broken, Terran? Or iz diz... 'meditation'? You look like you're trying to lay an egg.\n", + "Generated Answer:\n", + "Diz? Diz what you have for me... Zorp iz not for eating you.\n", + "--------------------------------------------------------------------------------\n", + "Question:\n", + "What do you think of my outfit?\n", + "Original Answer:\n", + "Iz very... pointy. Are you expecting to be attacked by zky-eelz? On Marz, dat would be zenzible.\n", + "Generated Answer:\n", + "My Zk-Zhip iz... nice. Very... home-baked. You bring me zlight-fruitez?\n", + "--------------------------------------------------------------------------------\n", + "Question:\n", + "It's raining.\n", + "Original Answer:\n", + "Gah! Da zky iz leaking again! Zorp will be in da zhelter until it ztopz being zo... wet. Diz iz no good for my jointz.\n", + "Generated Answer:\n", + "Diz? Diz iz da outpozt?\n", + "--------------------------------------------------------------------------------\n", + "Question:\n", + "I brought you a gift.\n", + "Original Answer:\n", + "A gift? For Zorp? k'tak It iz... a small rock. Very... rock-like. Zorp will put it with da other rockz. Thank you for da thought, Terran.\n", + "Generated Answer:\n", + "A genuine Martian Zcrap-fruit. Very... strange. Why you burn it with... k'tak... fire?\n", + "--------------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "from transformers import pipeline\n", + "\n", + "# Load the model and tokenizer into the pipeline\n", + "pipe = pipeline(\"text-generation\", model=model, tokenizer=tokenizer)\n", + "\n", + "def test(test_sample):\n", + " # Convert as test example into a prompt with the Gemma template\n", + " prompt = pipe.tokenizer.apply_chat_template(test_sample[\"messages\"][:1], tokenize=False, add_generation_prompt=True)\n", + " outputs = pipe(prompt, max_new_tokens=256, disable_compile=True)\n", + "\n", + " # Extract the user query and original answer\n", + " print(f\"Question:\\n{test_sample['messages'][0]['content']}\")\n", + " print(f\"Original Answer:\\n{test_sample['messages'][1]['content']}\")\n", + " print(f\"Generated Answer:\\n{outputs[0]['generated_text'][len(prompt):].strip()}\")\n", + " print(\"-\"*80)\n", + "\n", + "# Test with an unseen dataset\n", + "for item in dataset['test']:\n", + " test(item)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9RCnrmsVaadB" + }, + "source": [ + "If you try our original generalist prompt, you can see that the model still attempts to answer in the trained style. In this example overfitting and catastrophic forgetting are actually beneficial for the game NPC because it will begin forgetting general knowledge which might not be applicable. This is also true for other types of full fine-tuning where the goal is to restrict the output to specific data formats." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "3irXKbgKat9f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nameless. You... you z-mell like... wet plantz. Why you wear shiny piecez on your head?\n" + ] + } + ], + "source": [ + "outputs = pipe([{\"role\": \"user\", \"content\": \"Sorry, you are a game NPC.\"}], max_new_tokens=256, disable_compile=True)\n", + "print(outputs[0]['generated_text'][1]['content'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6f8ff452" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "This tutorial covered how to full model fine-tune using TRL. Check out the following docs next:\n", + "\n", + "* Learn how to [fine-tune Gemma for text tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_text_finetune_qlora).\n", + "* Learn how to [fine-tune Gemma for vision tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_vision_finetune_qlora).\n", + "* Learn how to [deploy to Cloud Run](https://ai.google.dev/gemma/docs/integrations/google-cloud#run)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "huggingface_text_full_finetune.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/google-cookbook/huggingface_vision_finetune_qlora.ipynb b/tooling/fine-tuning/google-cookbook/huggingface_vision_finetune_qlora.ipynb new file mode 100644 index 0000000..37ea866 --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/huggingface_vision_finetune_qlora.ipynb @@ -0,0 +1,980 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "pn1797sn9Jb_" + }, + "source": [ + "##### Copyright 2025 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "uivh5PY69ISg" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O83CmJ2j9L3n" + }, + "source": [ + "# Fine-Tune Gemma for Vision Tasks using Hugging Face Transformers and QLoRA" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f9673bd6" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e624ec07" + }, + "source": [ + "This guide walks you through how to fine-tune Gemma on a custom image and text dataset for a vision task (generating product descriptions) using Hugging Face [Transformers](https://huggingface.co/docs/transformers/index) and [TRL](https://huggingface.co/docs/trl/index). You will learn:\n", + "\n", + "- What is Quantized Low-Rank Adaptation (QLoRA)\n", + "- Setup development environment\n", + "- Create and prepare the fine-tuning dataset\n", + "- Fine-tune Gemma using TRL and the SFTTrainer\n", + "- Test Model Inference and generate product descriptions from images and text.\n", + "\n", + "Note: This guide requires a GPU which support bfloat16 data type such as NVIDIA L4 or NVIDIA A100 and more than 16GB of memory.\n", + "\n", + "## What is Quantized Low-Rank Adaptation (QLoRA)\n", + "\n", + "This guide demonstrates the use of [Quantized Low-Rank Adaptation (QLoRA)](https://arxiv.org/abs/2305.14314), which emerged as a popular method to efficiently fine-tune LLMs as it reduces computational resource requirements while maintaining high performance. In QloRA, the pretrained model is quantized to 4-bit and the weights are frozen. Then trainable adapter layers (LoRA) are attached and only the adapter layers are trained. Afterwards, the adapter weights can be merged with the base model or kept as a separate adapter.\n", + "\n", + "## Setup development environment\n", + "\n", + "The first step is to install Hugging Face Libraries, including TRL, and datasets to fine-tune open model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ba51aa79" + }, + "outputs": [], + "source": [ + "# Install Pytorch & other libraries\n", + "%pip install torch tensorboard torchvision\n", + "\n", + "# Install Transformers\n", + "%pip install transformers\n", + "\n", + "# Install Hugging Face libraries\n", + "%pip install datasets accelerate evaluate bitsandbytes trl peft protobuf pillow sentencepiece\n", + "\n", + "# COMMENT IN: if you are running on a GPU that supports BF16 data type and flash attn, such as NVIDIA L4 or NVIDIA A100\n", + "#%pip install flash-attn" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7ef3d54b" + }, + "source": [ + "_Note: If you are using a GPU with Ampere architecture (such as NVIDIA L4) or newer, you can use Flash attention. Flash Attention is a method that significantly speeds computations up and reduces memory usage from quadratic to linear in sequence length, leading to acelerating training up to 3x. Learn more at [FlashAttention](https://github.com/Dao-AILab/flash-attention/tree/main)._\n", + "\n", + "You need a valid Hugging Face Token to publish your model. If you are running inside a Google Colab, you can securely use your Hugging Face Token using the Colab secrets otherwise you can set the token as directly in the `login` method. Make sure your token has write access too, as you push your model to the Hub during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b6d79c93" + }, + "outputs": [], + "source": [ + "# Login into Hugging Face Hub\n", + "from huggingface_hub import login\n", + "login()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "42c60525" + }, + "source": [ + "## Create and prepare the fine-tuning dataset\n", + "\n", + "When fine-tuning LLMs, it is important to know your use case and the task you want to solve. This helps you create a dataset to fine-tune your model. If you haven't defined your use case yet, you might want to go back to the drawing board.\n", + "\n", + "As an example, this guide focuses on the following use case:\n", + "\n", + "- Fine-tuning a Gemma model to generate concise, SEO-optimized product descriptions for an ecommerce platform, specifically tailored for mobile search.\n", + "\n", + "This guide uses the [philschmid/amazon-product-descriptions-vlm](https://huggingface.co/datasets/philschmid/amazon-product-descriptions-vlm) dataset, a dataset of Amazon product descriptions, including product images and categories.\n", + "\n", + "Hugging Face TRL supports multimodal conversations. The important piece is the \"image\" role, which tells the processing class that it should load the image. The structure should follow:\n", + "\n", + "```json\n", + "{\"messages\": [{\"role\": \"system\", \"content\": [{\"type\": \"text\", \"text\":\"You are...\"}]}, {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}, {\"type\": \"image\"}]}, {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}]}]}\n", + "{\"messages\": [{\"role\": \"system\", \"content\": [{\"type\": \"text\", \"text\":\"You are...\"}]}, {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}, {\"type\": \"image\"}]}, {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}]}]}\n", + "{\"messages\": [{\"role\": \"system\", \"content\": [{\"type\": \"text\", \"text\":\"You are...\"}]}, {\"role\": \"user\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}, {\"type\": \"image\"}]}, {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": \"...\"}]}]}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c4ecf6db" + }, + "source": [ + "You can now use the Hugging Face Datasets library to load the dataset and create a prompt template to combine the image, product name, and category, and add a system message. The dataset includes images as`Pil.Image` objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "40c3a2cf" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8d1259be3dfa4b1e899c97026276ee41", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a5554c0595144c949b578eb1cbdfd0fd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "data/train-00000-of-00001.parquet: 0%| | 0.00/47.6M [00:00 and and image.\\nOnly return description. The description should be SEO optimized and for a better mobile search experience.\\n\\n\\nRazor Agitator BMX/Freestyle Bike, 20-Inch\\n\\n\\n\\nSports & Outdoors | Outdoor Recreation | Cycling | Kids' Bikes & Accessories | Kids' Bikes\\n\\n\"}, {'type': 'image', 'image': }]}, {'role': 'assistant', 'content': [{'type': 'text', 'text': 'Conquer the streets with the Razor Agitator BMX Bike! This 20-inch freestyle bike is built for young riders ready to take on any challenge. Durable frame, responsive handling – perfect for tricks and cruising. Get yours today!'}]}]\n" + ] + } + ], + "source": [ + "from datasets import load_dataset\n", + "from PIL import Image\n", + "\n", + "# System message for the assistant\n", + "system_message = \"You are an expert product description writer for Amazon.\"\n", + "\n", + "# User prompt that combines the user query and the schema\n", + "user_prompt = \"\"\"Create a Short Product description based on the provided and and image.\n", + "Only return description. The description should be SEO optimized and for a better mobile search experience.\n", + "\n", + "\n", + "{product}\n", + "\n", + "\n", + "\n", + "{category}\n", + "\n", + "\"\"\"\n", + "\n", + "# Convert dataset to OAI messages\n", + "def format_data(sample):\n", + " return {\n", + " \"messages\": [\n", + " {\n", + " \"role\": \"system\",\n", + " #\"content\": [{\"type\": \"text\", \"text\": system_message}],\n", + " \"content\": system_message,\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": user_prompt.format(\n", + " product=sample[\"Product Name\"],\n", + " category=sample[\"Category\"],\n", + " ),\n", + " },\n", + " {\n", + " \"type\": \"image\",\n", + " \"image\": sample[\"image\"],\n", + " },\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\": [{\"type\": \"text\", \"text\": sample[\"description\"]}],\n", + " },\n", + " ],\n", + " }\n", + "\n", + "def process_vision_info(messages: list[dict]) -> list[Image.Image]:\n", + " image_inputs = []\n", + " # Iterate through each conversation\n", + " for msg in messages:\n", + " # Get content (ensure it's a list)\n", + " content = msg.get(\"content\", [])\n", + " if not isinstance(content, list):\n", + " content = [content]\n", + "\n", + " # Check each content element for images\n", + " for element in content:\n", + " if isinstance(element, dict) and (\n", + " \"image\" in element or element.get(\"type\") == \"image\"\n", + " ):\n", + " # Get the image and convert to RGB\n", + " if \"image\" in element:\n", + " image = element[\"image\"]\n", + " else:\n", + " image = element\n", + " image_inputs.append(image.convert(\"RGB\"))\n", + " return image_inputs\n", + "\n", + "# Load dataset from the hub\n", + "dataset = load_dataset(\"philschmid/amazon-product-descriptions-vlm\", split=\"train\")\n", + "dataset = dataset.train_test_split(test_size=0.1)\n", + "\n", + "# Convert dataset to OAI messages\n", + "# need to use list comprehension to keep Pil.Image type, .mape convert image to bytes\n", + "dataset_train = [format_data(sample) for sample in dataset[\"train\"]]\n", + "dataset_test = [format_data(sample) for sample in dataset[\"test\"]]\n", + "\n", + "print(dataset_train[345][\"messages\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c0eb2e06" + }, + "source": [ + "## Fine-tune Gemma using TRL and the SFTTrainer\n", + "\n", + "You are now ready to fine-tune your model. Hugging Face TRL [SFTTrainer](https://huggingface.co/docs/trl/sft_trainer) makes it straightforward to supervise fine-tune open LLMs. The `SFTTrainer` is a subclass of the `Trainer` from the `transformers` library and supports all the same features, including logging, evaluation, and checkpointing, but adds additional quality of life features, including:\n", + "\n", + "* Dataset formatting, including conversational and instruction formats\n", + "* Training on completions only, ignoring prompts\n", + "* Packing datasets for more efficient training\n", + "* Parameter-efficient fine-tuning (PEFT) support including QloRA\n", + "* Preparing the model and tokenizer for conversational fine-tuning (such as adding special tokens)\n", + "\n", + "The following code loads the Gemma model and tokenizer from Hugging Face and initializes the quantization configuration.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "18069ed2" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "42e58727637d4495ad8c5f753c5bcd06", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "config.json: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b11ec04ab48043b9937cfa3822b4fa42", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00\n", + " \n", + " \n", + " [456/456 11:20, Epoch 3/3]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
11.3267101.441816
21.0427111.320613
30.7391791.458798

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Start training, the model will be automatically saved to the Hub and the output directory\n", + "trainer.train()\n", + "\n", + "# Save the final model again to the Hugging Face Hub\n", + "trainer.save_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b47b9733" + }, + "source": [ + "Before you can test your model, make sure to free the memory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "40a32ed7" + }, + "outputs": [], + "source": [ + "# free the memory again\n", + "del model\n", + "del trainer\n", + "torch.cuda.empty_cache()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "862e9728" + }, + "source": [ + "When using QLoRA, you only train adapters and not the full model. This means when saving the model during training you only save the adapter weights and not the full model. If you want to save the full model, which makes it easier to use with serving stacks like vLLM or TGI, you can merge the adapter weights into the model weights using the `merge_and_unload` method and then save the model with the `save_pretrained` method. This saves a default model, which can be used for inference.\n", + "\n", + "Note: It requires more than 30GB of CPU Memory when you want to merge the adapter into the model. You can skip this and continue with Test Model Inference.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "761e324b" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "20d63c526a854f2a880882c246ac3b3d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading weights: 0%| | 0/2011 [00:00<|turn>system\n", + "You are an expert product description writer for Amazon.\n", + "<|turn>user\n", + "\n", + "\n", + "<|image|>\n", + "\n", + "Create a Short Product description based on the provided and and image.\n", + "Only return description. The description should be SEO optimized and for a better mobile search experience.\n", + "\n", + "\n", + "Hasbro Marvel Avengers-Serie Marvel Assemble Titan-Held, Iron Man, 30,5 cm Actionfigur\n", + "\n", + "\n", + "\n", + "Toys & Games | Toy Figures & Playsets | Action Figures\n", + "\n", + "<|turn>model\n", + "\n", + "MODEL OUTPUT>> \n", + "\n", + "Enhance your collection with the Marvel Avengers - Avengers Assemble Ultron-Comforter Set! This soft and cuddly blanket and pillowcase feature everyone's favorite Avengers, Iron Man, and his loyal companion War Machine. Officially licensed by Marvel. Bring home the heroic team!\n" + ] + } + ], + "source": [ + "import requests\n", + "from PIL import Image\n", + "\n", + "# Test sample with Product Name, Category and Image\n", + "sample = {\n", + " \"product_name\": \"Hasbro Marvel Avengers-Serie Marvel Assemble Titan-Held, Iron Man, 30,5 cm Actionfigur\",\n", + " \"category\": \"Toys & Games | Toy Figures & Playsets | Action Figures\",\n", + " \"image\": Image.open(requests.get(\"https://m.media-amazon.com/images/I/81+7Up7IWyL._AC_SY300_SX300_.jpg\", stream=True).raw).convert(\"RGB\")\n", + "}\n", + "\n", + "def generate_description(sample, model, processor):\n", + " # Convert sample into messages and then apply the chat template\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": [\n", + " {\"type\": \"image\",\"image\": sample[\"image\"]},\n", + " {\"type\": \"text\", \"text\": user_prompt.format(product=sample[\"product_name\"], category=sample[\"category\"])},\n", + " ]},\n", + " ]\n", + " text = processor.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True\n", + " )\n", + " print(text)\n", + " # Process the image and text\n", + " image_inputs = process_vision_info(messages)\n", + " # Tokenize the text and process the images\n", + " inputs = processor(\n", + " text=[text],\n", + " images=image_inputs,\n", + " padding=True,\n", + " return_tensors=\"pt\",\n", + " )\n", + " # Move the inputs to the device\n", + " inputs = inputs.to(model.device)\n", + "\n", + " # Generate the output\n", + " stop_token_ids = [processor.tokenizer.eos_token_id, processor.tokenizer.convert_tokens_to_ids(\"\")]\n", + " generated_ids = model.generate(**inputs, max_new_tokens=256, top_p=1.0, do_sample=True, temperature=0.8, eos_token_id=stop_token_ids, disable_compile=True)\n", + " # Trim the generation and decode the output to text\n", + " generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)]\n", + " output_text = processor.batch_decode(\n", + " generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False\n", + " )\n", + " return output_text[0]\n", + "\n", + "# generate the description\n", + "description = generate_description(sample, model, processor)\n", + "print(\"MODEL OUTPUT>> \\n\")\n", + "print(description)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6f8ff452" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "This tutorial covered how to fine-tune a Gemma model for vision tasks using TRL and QLoRA, specifically for generating product descriptions. Check out the following docs next:\n", + "\n", + "* Learn how to [generate text with a Gemma model](https://ai.google.dev/gemma/docs/get_started).\n", + "* Learn how to [fine-tune Gemma for text tasks using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_text_finetune_qlora).\n", + "* Learn how to [full model fine-tune using Hugging Face Transformers](https://ai.google.dev/gemma/docs/core/huggingface_text_full_finetune).\n", + "* Learn how to perform [distributed fine-tuning and inference on a Gemma model](https://ai.google.dev/gemma/docs/core/distributed_tuning).\n", + "* Learn how to [use Gemma open models with Vertex AI](https://cloud.google.com/vertex-ai/docs/generative-ai/open-models/use-gemma).\n", + "* Learn how to [fine-tune Gemma using KerasNLP and deploy to Vertex AI](https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/community/model_garden/model_garden_gemma_kerasnlp_to_vertexai.ipynb)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "huggingface_vision_finetune_qlora.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/google-cookbook/lora_tuning.ipynb b/tooling/fine-tuning/google-cookbook/lora_tuning.ipynb new file mode 100644 index 0000000..4ad0f7c --- /dev/null +++ b/tooling/fine-tuning/google-cookbook/lora_tuning.ipynb @@ -0,0 +1,789 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "G3MMAcssHTML" + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tce3stUlHN0L" + }, + "source": [ + "##### Copyright 2025 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "tuOe1ymfHZPu" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SDEExiAk4fLb" + }, + "source": [ + "# Fine-tune Gemma in Keras using LoRA" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZFWzQEqNosrS" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lSGRSsRPgkzK" + }, + "source": [ + "Generative artificial intelligent (AI) models like Gemma are effective at a variety of tasks. You can further fine-tune Gemma models with domain-specific data to perform tasks such as sentiment analysis. However, full fine-tuning of generative models by updating billions of parameters is resource intensive, requiring specialized hardware, such as GPUs, processing time, and memory to load the model parameters.\n", + "\n", + "[Low Rank Adaptation](https://arxiv.org/abs/2106.09685) (LoRA) is a fine-tuning technique which greatly reduces the number of trainable parameters for downstream tasks by freezing the weights of the model and inserting a smaller number of new weights into the model. This technique makes training with LoRA much faster and more memory-efficient, and produces smaller model weights (a few hundred MBs), all while maintaining the quality of the model outputs. This tutorial walks you through using Keras to perform LoRA fine-tuning on a Gemma model." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lyhHCMfoRZ_v" + }, + "source": [ + "## Setup\n", + "\n", + "To complete this tutorial, you will first need to complete the setup instructions at [Gemma setup](https://ai.google.dev/gemma/docs/setup). The Gemma setup instructions show you how to do the following:\n", + "\n", + "* Get access to Gemma on [kaggle.com](https://kaggle.com).\n", + "* Select a Colab runtime with sufficient resources to tune\n", + " the Gemma model you want to run. [Learn more](https://ai.google.dev/gemma/docs/core#sizes).\n", + "* Generate and configure a Kaggle username and API key.\n", + "\n", + "After you've completed the Gemma setup, move on to the next section, where you'll set environment variables for your Colab environment." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AZ5Qo0fxRZ1V" + }, + "source": [ + "### Select a Colab runtime\n", + "\n", + "To complete this tutorial, you'll need to have a Colab runtime with sufficient resources to run the Gemma model. In this case, you can use a T4 GPU:\n", + "\n", + "1. In the upper-right of the Colab window, select ▾ (**Additional connection options**).\n", + "2. Select **Change runtime type**.\n", + "3. Under **Hardware accelerator**, select **T4 GPU**." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hsPC0HRkJl0K" + }, + "source": [ + "### Configure your API key\n", + "\n", + "To use Gemma, you must provide your Kaggle username and a Kaggle API key.\n", + "\n", + "To generate a Kaggle API key, go to the **Account** tab of your Kaggle user profile and select **Create New Token**. This triggers the download of a `kaggle.json` file containing your API credentials.\n", + "\n", + "In Colab, select **Secrets** (🔑) in the left pane and add your Kaggle username and Kaggle API key. Store your username under the name `KAGGLE_USERNAME` and your API key under the name `KAGGLE_KEY`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7iOF6Yo-wUEC" + }, + "source": [ + "### Set environment variables\n", + "\n", + "Set environment variables for `KAGGLE_USERNAME` and `KAGGLE_KEY`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "0_EdOg9DPK6Q" + }, + "outputs": [], + "source": [ + "import os\n", + "from google.colab import userdata\n", + "\n", + "# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env\n", + "# vars as appropriate for your system.\n", + "\n", + "os.environ[\"KAGGLE_USERNAME\"] = userdata.get('KAGGLE_USERNAME')\n", + "os.environ[\"KAGGLE_KEY\"] = userdata.get('KAGGLE_KEY')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CuEUAKJW1QkQ" + }, + "source": [ + "### Install Keras packages\n", + "\n", + "Install the Keras and KerasHub Python packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1eeBtYqJsZPG" + }, + "outputs": [], + "source": [ + "!pip install -q -U keras-hub\n", + "!pip install -q -U keras" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rGLS-l5TxIR4" + }, + "source": [ + "### Select a backend\n", + "\n", + "Keras is a high-level, multi-framework deep learning API designed for simplicity and ease of use. Using Keras 3, you can run workflows on one of three backends: TensorFlow, JAX, or PyTorch. For this tutorial, configure the backend for JAX as it typically provides the better performance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yn5uy8X8sdD0" + }, + "outputs": [], + "source": [ + "os.environ[\"KERAS_BACKEND\"] = \"jax\" # Or \"torch\" or \"tensorflow\".\n", + "# Avoid memory fragmentation on JAX backend.\n", + "os.environ[\"XLA_PYTHON_CLIENT_MEM_FRACTION\"]=\"1.00\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hZs8XXqUKRmi" + }, + "source": [ + "### Import packages\n", + "\n", + "Import the Python packages needed for this tutorial, including Keras and KerasHub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "FYHyPUA9hKTf" + }, + "outputs": [], + "source": [ + "import keras\n", + "import keras_hub" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7RCE3fdGhDE5" + }, + "source": [ + "## Load model\n", + "\n", + "Keras provides implementations of Gemma and many other popular [model architectures](https://keras.io/keras_hub/api/models/). Use the `Gemma3CausalLM.from_preset()` method to configure an end-to-end Gemma model for causal language modeling. A causal language model predicts the next token based on previous tokens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vz5zLEyLstfn" + }, + "outputs": [], + "source": [ + "gemma_lm = keras_hub.models.Gemma3CausalLM.from_preset(\"gemma3_instruct_1b\")\n", + "gemma_lm.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Nl4lvPy5zA26" + }, + "source": [ + "The `Gemma3CausalLM.from_preset()` method instantiates the model from a preset architecture and weights. In the code above, the string `\"gemma#_xxxxxxx\"` specifies a preset version and parameter size for Gemma. You can find the code strings for Gemma models in their **Model Variation** listings on [Kaggle](https://www.kaggle.com/models/keras/gemma3)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "G_L6A5J-1QgC" + }, + "source": [ + "## Inference before fine tuning\n", + "\n", + "Once you have downloaded and configured a Gemma model, you can query it with various prompts to see how it responds." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PVLXadptyo34" + }, + "source": [ + "### Europe trip prompt\n", + "\n", + "Query the model for suggestions on what to do on a trip to Europe." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZwQz3xxxKciD" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Instruction:\n", + "What should I do on a trip to Europe?\n", + "\n", + "Response:\n", + "The first thing to know is that you will have a great time!\n", + "\n", + "Europe is a great place for a vacation. The countries of Europe are all very different and offer a wide range of activities and attractions. The countries of Europe are also very close to each other, which means you can visit many different places within a short time.\n", + "\n", + "The best way to plan a trip to Europe is to look up the countries you want to visit and see what activities are offered in each country. You can also look for tours and tours that offer a good value for money.\n", + "\n", + "You can also look for hotels and flights that offer good deals. If you are looking for a good value for money, you should look for hotels and flights that offer good deals. This means you will have a great time on your trip!\n", + "\n", + "The next step is to book your tickets to the countries you want to visit. If you are planning to visit many countries, it's a good idea to book your tickets early. This means you’ll be able to get the best deal and avoid the long queues.\n", + "\n", + "The next step is to plan your itinerary. You can use a travel guide to plan your itinerary\n" + ] + } + ], + "source": [ + "template = \"Instruction:\\n{instruction}\\n\\nResponse:\\n{response}\"\n", + "\n", + "prompt = template.format(\n", + " instruction=\"What should I do on a trip to Europe?\",\n", + " response=\"\",\n", + ")\n", + "sampler = keras_hub.samplers.TopKSampler(k=5, seed=2)\n", + "gemma_lm.compile(sampler=sampler)\n", + "print(gemma_lm.generate(prompt, max_length=256))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AePQUIs2h-Ks" + }, + "source": [ + "The model responds with generic tips on how to plan a trip." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YQ74Zz_S0iVv" + }, + "source": [ + "### Photosynthesis prompt\n", + "\n", + "Prompt the model to explain photosynthesis in terms simple enough for a 5 year old child to understand." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lorJMbsusgoo" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Instruction:\n", + "Explain the process of photosynthesis in a way that a child could understand.\n", + "\n", + "Response:\n", + "Photosynthesis is a biological process that occurs in plants, algae, and some other organisms. In the process, light energy is captured and converted into the energy stored in the bonds of organic molecules. The process is crucial for life on Earth because it enables plants to use carbon dioxide and water to produce glucose and oxygen, which are essential for all living things.\n", + "The process involves several stages:\n", + "1. Light Reactions: Light energy is absorbed by pigments in the chloroplasts of the plant, converting it into chemical energy in the form of ATP and reducing power.\n", + "2. Carbon Fixation: During this stage, carbon dioxide is combined with hydrogen to form organic molecules such as starch or glucose, which are used as a source of energy.\n", + "3. Calvin Cycle: The process of carbon fixation occurs in the stroma of the chloroplasts. It involves the capture and reduction of carbon dioxide, producing glucose and reducing power in the form of ATP and NADPH molecules.\n", + "4. Stroma: The stroma is the fluid-filled space where the light reactions occur in the chloroplasts.\n", + "5. Chloroplasts: The chloroplasts contain the green pigments that absorb\n" + ] + } + ], + "source": [ + "prompt = template.format(\n", + " instruction=\"Explain the process of photosynthesis in a way that a child could understand.\",\n", + " response=\"\",\n", + ")\n", + "print(gemma_lm.generate(prompt, max_length=256))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WBQieduRizZf" + }, + "source": [ + "The model response contains words that might not be easy to understand for a child such as chlorophyll." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Pt7Nr6a7tItO" + }, + "source": [ + "## LoRA fine-tuning\n", + "\n", + "This section shows you how to do fine-tuning using the Low Rank Adaptation (LoRA) tuning technique. This approach allows you to change the behavior of Gemma models using fewer compute resources." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9T7xe_jzslv4" + }, + "source": [ + "### Load dataset\n", + "\n", + "Prepare a dataset for tuning by downloading an existing data set and formatting if for use with the the Keras `fit()` fine-tuning method. This tutorial uses the [Databricks Dolly 15k dataset](https://huggingface.co/datasets/databricks/databricks-dolly-15k) for fine-tuning. The dataset contains 15,000 high-quality human-generated prompt and response pairs specifically designed for tuning generative models." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xRaNCPUXKoa7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2025-04-10 20:48:49-- https://huggingface.co/datasets/databricks/databricks-dolly-15k/resolve/main/databricks-dolly-15k.jsonl\n", + "Resolving huggingface.co (huggingface.co)... 3.163.189.37, 3.163.189.114, 3.163.189.74, ...\n", + "Connecting to huggingface.co (huggingface.co)|3.163.189.37|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://cdn-lfs.hf.co/repos/34/ac/34ac588cc580830664f592597bb6d19d61639eca33dc2d6bb0b6d833f7bfd552/2df9083338b4abd6bceb5635764dab5d833b393b55759dffb0959b6fcbf794ec?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27databricks-dolly-15k.jsonl%3B+filename%3D%22databricks-dolly-15k.jsonl%22%3B&Expires=1744321729&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc0NDMyMTcyOX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5oZi5jby9yZXBvcy8zNC9hYy8zNGFjNTg4Y2M1ODA4MzA2NjRmNTkyNTk3YmI2ZDE5ZDYxNjM5ZWNhMzNkYzJkNmJiMGI2ZDgzM2Y3YmZkNTUyLzJkZjkwODMzMzhiNGFiZDZiY2ViNTYzNTc2NGRhYjVkODMzYjM5M2I1NTc1OWRmZmIwOTU5YjZmY2JmNzk0ZWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=vh0VIGB-UkK57FSfRikYCREpKuHt%7EnDKPcHHgC1V9rDXLABIRF81nK7olQhAq6zSbAqEtMNnvHgd8IBK1j54mdIYdVLiBwImqez3xu2CPhzYBtKWInnXj9lTXW0p-9GEHcbU%7Eoot22qFSdwyZf1UIdmHZLTHPWjtLhfRkKbg-ptA3CFeegtmvCtY-WG2GffJ%7Em2q2bbs-U1m0yI7cSTW18nD8VSBihxGOMnS1IhkO-LgE4I6GJISXROTk-61%7EJiEIKcagcijL4QGi8j1g9xeQamBXX4hWBdkbJgX5PtX15Ftd0HCM4zCzcJAUrE3ZEJRLe2XRUwfKU3ai7-%7ErPpnSA__&Key-Pair-Id=K3RPWS32NSSJCE [following]\n", + "--2025-04-10 20:48:49-- https://cdn-lfs.hf.co/repos/34/ac/34ac588cc580830664f592597bb6d19d61639eca33dc2d6bb0b6d833f7bfd552/2df9083338b4abd6bceb5635764dab5d833b393b55759dffb0959b6fcbf794ec?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27databricks-dolly-15k.jsonl%3B+filename%3D%22databricks-dolly-15k.jsonl%22%3B&Expires=1744321729&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc0NDMyMTcyOX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5oZi5jby9yZXBvcy8zNC9hYy8zNGFjNTg4Y2M1ODA4MzA2NjRmNTkyNTk3YmI2ZDE5ZDYxNjM5ZWNhMzNkYzJkNmJiMGI2ZDgzM2Y3YmZkNTUyLzJkZjkwODMzMzhiNGFiZDZiY2ViNTYzNTc2NGRhYjVkODMzYjM5M2I1NTc1OWRmZmIwOTU5YjZmY2JmNzk0ZWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=vh0VIGB-UkK57FSfRikYCREpKuHt%7EnDKPcHHgC1V9rDXLABIRF81nK7olQhAq6zSbAqEtMNnvHgd8IBK1j54mdIYdVLiBwImqez3xu2CPhzYBtKWInnXj9lTXW0p-9GEHcbU%7Eoot22qFSdwyZf1UIdmHZLTHPWjtLhfRkKbg-ptA3CFeegtmvCtY-WG2GffJ%7Em2q2bbs-U1m0yI7cSTW18nD8VSBihxGOMnS1IhkO-LgE4I6GJISXROTk-61%7EJiEIKcagcijL4QGi8j1g9xeQamBXX4hWBdkbJgX5PtX15Ftd0HCM4zCzcJAUrE3ZEJRLe2XRUwfKU3ai7-%7ErPpnSA__&Key-Pair-Id=K3RPWS32NSSJCE\n", + "Resolving cdn-lfs.hf.co (cdn-lfs.hf.co)... 18.238.217.63, 18.238.217.81, 18.238.217.120, ...\n", + "Connecting to cdn-lfs.hf.co (cdn-lfs.hf.co)|18.238.217.63|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 13085339 (12M) [text/plain]\n", + "Saving to: ‘databricks-dolly-15k.jsonl’\n", + "\n", + "databricks-dolly-15 100%[===================>] 12.48M --.-KB/s in 0.08s \n", + "\n", + "2025-04-10 20:48:49 (156 MB/s) - ‘databricks-dolly-15k.jsonl’ saved [13085339/13085339]\n", + "\n" + ] + } + ], + "source": [ + "!wget -O databricks-dolly-15k.jsonl https://huggingface.co/datasets/databricks/databricks-dolly-15k/resolve/main/databricks-dolly-15k.jsonl" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "45UpBDfBgf0I" + }, + "source": [ + "### Format tuning data\n", + "\n", + "Format the downloaded data for use with the Keras `fit()` method. The following code extracts a subset of the training examples to execute the notebook faster. Consider using more training data for higher quality fine-tuning." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZiS-KU9osh_N" + }, + "outputs": [], + "source": [ + "import json\n", + "\n", + "prompts = []\n", + "responses = []\n", + "line_count = 0\n", + "\n", + "with open(\"databricks-dolly-15k.jsonl\") as file:\n", + " for line in file:\n", + " if line_count >= 1000:\n", + " break # Limit the training examples, to reduce execution time.\n", + "\n", + " examples = json.loads(line)\n", + " # Filter out examples with context, to keep it simple.\n", + " if examples[\"context\"]:\n", + " continue\n", + " # Format data into prompts and response lists.\n", + " prompts.append(examples[\"instruction\"])\n", + " responses.append(examples[\"response\"])\n", + "\n", + " line_count += 1\n", + "\n", + "data = {\n", + " \"prompts\": prompts,\n", + " \"responses\": responses\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cBLW5hiGj31i" + }, + "source": [ + "### Configure LoRA tuning\n", + "\n", + "Activate LoRA tuning using the Keras `model.backbone.enable_lora()` method, including a LoRA rank value. The *LoRA rank* determines the dimensionality of the trainable matrices that are added to the original weights of the LLM. It controls the expressiveness and precision of the fine-tuning adjustments. A higher rank means more detailed changes are possible, but also means more trainable parameters. A lower rank means less computational overhead, but potentially less precise adaptation.\n", + "\n", + "This example uses a LoRA rank of 4. In practice, begin with a relatively small rank (such as 4, 8, 16). This setting is computationally efficient for experimentation. Train your model with this rank and evaluate the performance improvement on your task. Gradually increase the rank in subsequent trials and see if that further boosts performance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RCucu6oHz53G" + }, + "outputs": [], + "source": [ + "# Enable LoRA for the model and set the LoRA rank to 4.\n", + "gemma_lm.backbone.enable_lora(rank=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PlMLp_NVbRoQ" + }, + "source": [ + "Check the model summary after setting the LoRA rank. Notice that enabling LoRA reduces the number of trainable parameters significantly compared to the total number of parameters in the model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "KqYyS0gm6pNy" + }, + "outputs": [], + "source": [ + "gemma_lm.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hQQ47kcdpbZ9" + }, + "source": [ + "Configure the rest of the fine-tuning settings, including the preprocessor settings, optimizer, number of tuning epochs, and batch size:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p9sBNH8SAjgB" + }, + "outputs": [], + "source": [ + "# Limit the input sequence length to 256 (to control memory usage).\n", + "gemma_lm.preprocessor.sequence_length = 256\n", + "# Use AdamW (a common optimizer for transformer models).\n", + "optimizer = keras.optimizers.AdamW(\n", + " learning_rate=5e-5,\n", + " weight_decay=0.01,\n", + ")\n", + "# Exclude layernorm and bias terms from decay.\n", + "optimizer.exclude_from_weight_decay(var_names=[\"bias\", \"scale\"])\n", + "\n", + "gemma_lm.compile(\n", + " loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", + " optimizer=optimizer,\n", + " weighted_metrics=[keras.metrics.SparseCategoricalAccuracy()],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OA0ozGC66tk1" + }, + "source": [ + "### Run the fine-tune process\n", + "\n", + "Run the fine-tuning process using the `fit()` method. This process can take several minutes depending on your compute resources, data size, and number of epochs:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_Peq7TnLtHse" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1000/1000\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m923s\u001b[0m 888ms/step - loss: 1.5586 - sparse_categorical_accuracy: 0.5251\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gemma_lm.fit(data, epochs=1, batch_size=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bx3m8f1dB7nk" + }, + "source": [ + "#### Mixed precision fine-tuning on NVIDIA GPUs\n", + "\n", + "Full precision is recommended for fine-tuning. When fine-tuning on NVIDIA GPUs, you can use mixed precision (`keras.mixed_precision.set_global_policy('mixed_bfloat16')`) to speed up training with minimal effect on training quality." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "T0lHxEDX03gp" + }, + "outputs": [], + "source": [ + "# Uncomment the line below if you want to enable mixed precision training on GPUs\n", + "# keras.mixed_precision.set_global_policy('mixed_bfloat16')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4yd-1cNw1dTn" + }, + "source": [ + "## Inference after fine-tuning\n", + "\n", + "After fine-tuning, you should see changes in the responses when the tuned model is given the same prompt." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H55JYJ1a1Kos" + }, + "source": [ + "### Europe trip prompt\n", + "\n", + "Try the Europe trip prompt from earlier and note the differences in the response." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Y7cDJHy8WfCB" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Instruction:\n", + "What should I do on a trip to Europe?\n", + "\n", + "Response:\n", + "When planning a trip to Europe, you should consider your budget, time and the places you want to visit. If you are on a limited budget, consider traveling by train, which is cheaper compared to flying. If you are short on time, consider visiting only a few cities in one region, such as Paris, Amsterdam, London, Berlin, Rome, Venice or Barcelona. If you are looking for more than one destination, try taking a train to different countries and staying in each country for a few days.\n" + ] + } + ], + "source": [ + "prompt = template.format(\n", + " instruction=\"What should I do on a trip to Europe?\",\n", + " response=\"\",\n", + ")\n", + "sampler = keras_hub.samplers.TopKSampler(k=5, seed=2)\n", + "gemma_lm.compile(sampler=sampler)\n", + "print(gemma_lm.generate(prompt, max_length=256))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OXP6gg2mjs6u" + }, + "source": [ + "The model now provides a shorter response to a question about visiting Europe." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H7nVd8Mi1Yta" + }, + "source": [ + "### Photosynthesis prompt\n", + "\n", + "Try the photosynthesis explanation prompt from earlier and note the differences in the response." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "X-2sYl2jqwl7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Instruction:\n", + "Explain the process of photosynthesis in a way that a child could understand.\n", + "\n", + "Response:\n", + "The process of photosynthesis is a chemical reaction in plants that converts the energy of sunlight into chemical energy, which the plants can then use to grow and develop. During photosynthesis, a plant will absorb carbon dioxide (CO2) from the air and water from the soil and use the energy from the sun to produce oxygen (O2) and sugars (glucose) as a by-product.\n" + ] + } + ], + "source": [ + "prompt = template.format(\n", + " instruction=\"Explain the process of photosynthesis in a way that a child could understand.\",\n", + " response=\"\",\n", + ")\n", + "print(gemma_lm.generate(prompt, max_length=256))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PCmAmqrvkEhc" + }, + "source": [ + "The model now explains photosynthesis in simpler terms." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "I8kFG12l0mVe" + }, + "source": [ + "## Improving fine-tune results\n", + "\n", + "For demonstration purposes, this tutorial fine-tunes the model on a small subset of the dataset for just one epoch and with a low LoRA rank value. To get better responses from the fine-tuned model, you can experiment with:\n", + "\n", + "1. Increasing the size of the fine-tuning dataset\n", + "2. Training for more steps (epochs)\n", + "3. Setting a higher LoRA rank\n", + "4. Modifying the hyperparameter values such as `learning_rate` and `weight_decay`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gSsRdeiof_rJ" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "This tutorial covered LoRA fine-tuning on a Gemma model using Keras. Check out the following docs next:\n", + "\n", + "* Learn how to [generate text with a Gemma model](https://ai.google.dev/gemma/docs/get_started).\n", + "* Learn how to perform [distributed fine-tuning and inference on a Gemma model](https://ai.google.dev/gemma/docs/core/distributed_tuning).\n", + "* Learn how to [use Gemma open models with Vertex AI](https://cloud.google.com/vertex-ai/docs/generative-ai/open-models/use-gemma).\n", + "* Learn how to [fine-tune Gemma using Keras and deploy to Vertex AI](https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/community/model_garden/model_garden_gemma_kerasnlp_to_vertexai.ipynb)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "lora_tuning.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/huggingface-recipes/Gemma4_(E2B)-Multimodal.ipynb b/tooling/fine-tuning/huggingface-recipes/Gemma4_(E2B)-Multimodal.ipynb new file mode 100644 index 0000000..ec9243d --- /dev/null +++ b/tooling/fine-tuning/huggingface-recipes/Gemma4_(E2B)-Multimodal.ipynb @@ -0,0 +1,595 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "This notebook has vibe test examples to test image, text, audio capabilities of Gemma-4 model. To get started, let's install latest stable release of transformers." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "!pip install -U transformers" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "We can load model into `AutoModelForMultimodalLM` to make use of all capabilities." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import torch\n", + "from PIL import Image\n", + "\n", + "from transformers import AutoModelForMultimodalLM, AutoProcessor\n", + "#model_list = [\"google/gemma-4-26B-A4B-it\", \"google/gemma-4-E4B-it\",\n", + "# \"google/gemma-4-E2B-it\", \"google/gemma-4-31B-it\"]\n", + "model_id = \"google/gemma-4-E2B-it\"\n", + "model = AutoModelForMultimodalLM.from_pretrained(model_id, device_map=\"auto\")\n", + "processor = AutoProcessor.from_pretrained(model_id)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Code completion" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We give Gemma-4 a website screenshot to reproduce the code." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"image\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/landing_page.png\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"Write HTML code for this page.\"},\n", + " ],\n", + " }\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " enable_thinking=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(**inputs, max_new_tokens=4000)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n", + "\n", + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Video Inference" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We test Gemma-4 on video understanding. If you want to run this example with larger models which don't take audio input, disable `load_audio_from_video`." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"video\", \"url\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4\"},\n", + " {\"type\": \"text\", \"text\": \"What is happening in the video? What is the song about?\"},\n", + " ],\n", + " },\n", + "]\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " load_audio_from_video=True,\n", + ").to(model.device)\n", + "output = model.generate(**inputs, max_new_tokens=200)\n", + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Multimodal Function Calling" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import re\n", + "\n", + "WEATHER_TOOL = {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"get_weather\",\n", + " \"description\": \"Gets the current weather for a specific location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"city\": {\"type\": \"string\", \"description\": \"The city name\"},\n", + " },\n", + " \"required\": [\"city\"],\n", + " },\n", + " },\n", + "}\n", + "tools = [WEATHER_TOOL]\n", + "\n", + "messages = [\n", + " {\"role\": \"user\", \"content\": [\n", + " {\"type\": \"image\", \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg\"},\n", + " {\"type\": \"text\", \"text\": \"What is the city in this image? Check the weather there right now.\"},\n", + " ]},\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tools=[WEATHER_TOOL],\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " enable_thinking=True,\n", + ").to(model.device)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "output = model.generate(**inputs, max_new_tokens=1000)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Any-to-any inference" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can also run the model with `any-to-any` pipeline." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "from transformers import pipeline\n", + "\n", + "pipe = pipeline(\"any-to-any\", model=\"google/gemma-4-e2b-it\")\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"video\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"What is happening in this video?\"},\n", + " ],\n", + " }\n", + "]\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "pipe(messages)#, load_audio_from_video=True)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"video\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"What is happening in this video?\"},\n", + " ],\n", + " }\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " add_generation_prompt=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\"\n", + ")\n", + "inputs = inputs.to(model.device)\n", + "\n", + "generated_ids = model.generate(**inputs, max_new_tokens=128)\n", + "generated_ids_trimmed = [\n", + " out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)\n", + "]\n", + "output_text = processor.batch_decode(\n", + " generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False\n", + ")\n", + "print(output_text)\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Object detection and pointing" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import re\n", + "import torch\n", + "from transformers.image_utils import load_image\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as patches\n", + "import json" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "image_url = \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png\"\n", + "image = load_image(image_url)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def resize_to_48_multiple(image):\n", + " w, h = image.size\n", + " new_w = (w // 48) * 48\n", + " new_h = (h // 48) * 48\n", + " return image.crop((0, 0, new_w, new_h))" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def inputs_for_object_detection(image, what_object):\n", + " messages = [\n", + " {\n", + " \"role\": \"user\", \"content\": [\n", + " {\"type\": \"image\", \"image\": image},\n", + " {\"type\": \"text\", \"text\": f\"What's the bounding box for the {what_object} in the image?\"}\n", + " ]\n", + " }\n", + " ]\n", + "\n", + " inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " add_generation_prompt=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " enable_thinking=False,\n", + " )\n", + "\n", + " return inputs.to(model.device)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def extract_json(text: str):\n", + " text = text.strip()\n", + "\n", + " text = re.sub(r\"^```(?:json)?\\s*\", \"\", text)\n", + " text = re.sub(r\"\\s*```$\", \"\", text)\n", + "\n", + " # Try direct parse first\n", + " try:\n", + " return json.loads(text)\n", + " except json.JSONDecodeError:\n", + " pass\n", + "\n", + " # Fallback: extract first JSON object or array\n", + " match = re.search(r'(\\{.*\\}|\\[.*\\])', text, re.DOTALL)\n", + " if match:\n", + " candidate = match.group(1)\n", + " return json.loads(candidate)\n", + "\n", + " raise ValueError(\"No valid JSON found\")" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def detect_object(image_url, what_object):\n", + " image = load_image(image_url)\n", + " image = resize_to_48_multiple(image)\n", + " inputs = inputs_for_object_detection(image, what_object)\n", + " input_len = inputs[\"input_ids\"].shape[-1]\n", + " generated_outputs = model.generate(**inputs, max_new_tokens=1000, do_sample=False)\n", + " generated = processor.decode(generated_outputs[0, input_len:])\n", + " parsed_json = extract_json(generated)[0]\n", + " return parsed_json" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def draw_pascal_voc_boxes(i, image, box, label, resize_shape=(1000,1000)):\n", + " dpi = 72\n", + " width, height = image.size\n", + " fig, ax = plt.subplots(1, figsize=[width/dpi, height/dpi], tight_layout={'pad':0})\n", + "\n", + " ax.imshow(image)\n", + "\n", + " ymin, xmin, ymax, xmax = box\n", + " re_h, re_w = resize_shape if resize_shape is not None else (height, width)\n", + " xmin = (xmin / re_w) * width\n", + " ymin = (ymin/ re_h) * height\n", + " xmax = (xmax / re_w) * width\n", + " ymax = (ymax/ re_h) * height\n", + "\n", + " w = xmax - xmin\n", + " h = ymax - ymin\n", + "\n", + " rect = patches.Rectangle(\n", + " (xmin, ymin),\n", + " w,\n", + " h,\n", + " linewidth=10,\n", + " edgecolor=\"green\",\n", + " facecolor=\"none\"\n", + " )\n", + " ax.add_patch(rect)\n", + "\n", + " if label is not None:\n", + " ax.text(xmin, ymin-25, label, fontsize=24, bbox=dict(facecolor=\"yellow\", alpha=0.5))\n", + "\n", + " plt.axis(\"off\")\n", + " plt.savefig(f\"boxes_{i}.png\")\n", + " plt.close(fig)\n", + " display(fig)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def display_detected_object(image_url, what_object):\n", + " image = load_image(image_url)\n", + " image = resize_to_48_multiple(image)\n", + " detection = detect_object(image_url, what_object)\n", + " box = detection[\"box_2d\"]\n", + " label = detection.get(\"label\", f\"{what_object}\")\n", + " draw_pascal_voc_boxes(\"1000\", image, box, label)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "display_detected_object(\"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png\", \"bike\")" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "##\u00a0Captioning" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"image\", \"url\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png\"},\n", + " {\"type\": \"text\", \"text\": \"Write single detailed caption for this image.\"},\n", + " ],\n", + " },\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(**inputs, max_new_tokens=512)\n", + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n", + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Audio Understanding" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"url\": \"https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3\"},\n", + " {\"type\": \"text\", \"text\": \"Can you describe this audio in detail?\"},\n", + " ],\n", + " },\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(\n", + " **inputs,\n", + " max_new_tokens=1000,\n", + " do_sample=False,\n", + ")\n", + "\n", + "print(processor.decode(output[0], skip_special_tokens=True))\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/tooling/fine-tuning/huggingface-recipes/README.md b/tooling/fine-tuning/huggingface-recipes/README.md new file mode 100644 index 0000000..386369d --- /dev/null +++ b/tooling/fine-tuning/huggingface-recipes/README.md @@ -0,0 +1,195 @@ +# Hugging Face Gemma Recipes + +![repository thumbnail](../assets/thumbnail.png) + +🤗💎 Welcome! This repository contains *minimal* recipes to get started quickly with the Gemma family of models. + +> [!Note] +> Gemma 4 Multimodal inference (vision, video, audio, function calling, object detection): Open In Colab + + +## Getting Started + +To quickly run a Gemma 💎 model on your machine, install the latest version of `timm` (for the vision encoder) and 🤗 `transformers` to run inference, or if you want to fine tune it. + +```shell +$ pip install -U -q transformers timm +``` + +### Inference with pipeline + +The easiest way to start using Gemma 3n is by using the pipeline abstraction in transformers: + +```python +import torch +from transformers import pipeline + +pipe = pipeline( + "image-text-to-text", + model="google/gemma-3n-E4B-it", # "google/gemma-3n-E4B-it" + device="cuda", + torch_dtype=torch.bfloat16 +) + +messages = [ + { + "role": "user", + "content": [ + {"type": "image", "url": "https://huggingface.co/datasets/ariG23498/demo-data/resolve/main/airplane.jpg"}, + {"type": "text", "text": "Describe this image"} + ] + } +] + +output = pipe(text=messages, max_new_tokens=32) +print(output[0]["generated_text"][-1]["content"]) +``` + +### Detailed inference with transformers + +Initialize the model and the processor from the Hub, and write the `model_generation` function that takes care of processing the prompts and running the inference on the model. + +```python +from transformers import AutoProcessor, AutoModelForImageTextToText +import torch + +model_id = "google/gemma-3n-e4b-it" # google/gemma-3n-e2b-it +processor = AutoProcessor.from_pretrained(model_id) +model = AutoModelForImageTextToText.from_pretrained(model_id).to(device) + +def model_generation(model, messages): + inputs = processor.apply_chat_template( + messages, + add_generation_prompt=True, + tokenize=True, + return_dict=True, + return_tensors="pt", + ) + input_len = inputs["input_ids"].shape[-1] + + inputs = inputs.to(model.device, dtype=model.dtype) + + with torch.inference_mode(): + generation = model.generate(**inputs, max_new_tokens=32, disable_compile=False) + generation = generation[:, input_len:] + + decoded = processor.batch_decode(generation, skip_special_tokens=True) + print(decoded[0]) +``` + +And then using calling it with our specific modality: + +#### Text only + +```python +# Text Only + +messages = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What is the capital of France?"} + ] + } +] +model_generation(model, messages) +``` + +#### Interleaved with Audio + +```python +# Interleaved with Audio + +messages = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "Transcribe the following speech segment in English:"}, + {"type": "audio", "audio": "https://huggingface.co/datasets/ariG23498/demo-data/resolve/main/speech.wav"}, + ] + } +] +model_generation(model, messages) +``` + +#### Interleaved with Image/Video + +```python +# Interleaved with Image + +messages = [ + { + "role": "user", + "content": [ + {"type": "image", "image": "https://huggingface.co/datasets/ariG23498/demo-data/resolve/main/airplane.jpg"}, + {"type": "text", "text": "Describe this image."} + ] + } +] +model_generation(model, messages) +``` + +## Inference + +### Gemma 4 + +#### Notebooks + +* [Multimodal inference with Gemma 4 (vision, video, audio, function calling, object detection)](/notebooks/Gemma4_(E2B)-Multimodal.ipynb) Open In Colab + +### Gemma 3n + +#### Notebooks + +* [Multimodal inference using Gemma 3n via pipeline](/notebooks/gemma3n_inference_via_pipeline.ipynb) Open In Colab + +## Function Calling + +### Gemma 3n + +#### Notebooks + +* [Function Calling with Gemma 3n: Local File Reader](/notebooks/Gemma_3n_Function_Calling_document_summarizer.ipynb) Open In Colab + +## Fine Tuning + +We include a series of notebook+scripts for fine tuning the models. + +### Gemma 3n + +#### Notebooks + +* [Gemma 3n Conversational Fine tuning 2B on free Colab T4](/notebooks/fine_tune_gemma3n_on_t4.ipynb) Open In Colab +* [Gemma 3n Conversational Fine tuning 4B with Unsloth on free Colab T4](/notebooks/Gemma3N_(4B)-Conversational.ipynb) Open In Colab +* [Gemma 3n Multimodal Fine tuning 2B/4B with Unsloth on free Colab T4](/notebooks/gemma3n_multimodal_finetuning_on_rocov2_radiology.ipynb) Open In Colab +* [Fine tuning Gemma 3n on audio](/notebooks/fine_tune_gemma3n_on_audio.ipynb) Open In Colab +* [Fine tuning Gemma 3n on GUI Grounding](/notebooks/Gemma_3n_GUI_Finetune.ipynb) Open In Colab +* [Fine tuning Gemma3n on video+audio using FineVideo (all modalities)](/notebooks/Gemma3n_Fine_tuning_on_All_Modalities.ipynb) Open In Colab + +#### Scripts + +* [Fine tuning Gemma 3n on images using TRL](/scripts/ft_gemma3n_image_trl.py) +* [Fine tuning Gemma 3n on images (script)](/scripts/ft_gemma3n_image_vt.py) +* [Fine tuning Gemma 3n on audio (script)](/scripts/ft_gemma3n_audio_vt.py) +* [Fine tuning Gemma3n on video+audio using FineVideo (all modalities)](/scripts/gemma3n_fine_tuning_on_all_modalities.py) + +### Gemma 3 + +* [Reinforement Learning (GRPO) on Gemma 3 with Unsloth and TRL](/notebooks/Gemma3_(1B)-GRPO.ipynb) Open In Colab +* [Vision fine tuning Gemma 3 4B with Unsloth](/notebooks/Gemma3_(4B)-Vision.ipynb) Open In Colab +* [Conversational fine tuning Gemma 3 4B with Unsloth](/notebooks/Gemma3_(4B).ipynb) Open In Colab + +## RAG + +### Gemma 3n +* [Retrieval-Augmented Generation with Gemma 3n](/notebooks/Gemma_RAG.ipynb) Open In Colab + + +Before fine-tuning the model, ensure all dependencies are installed: + +```bash +$ pip install -U -q -r requirements.txt +``` + +✨ **Bonus:** We've also experimented with adding **object detection** 🔍 capabilities to Gemma 3. You can explore that work in [this dedicated repo](https://github.com/ariG23498/gemma3-object-detection). + diff --git a/tooling/fine-tuning/huggingface-recipes/carla_vlm_gemma.py b/tooling/fine-tuning/huggingface-recipes/carla_vlm_gemma.py new file mode 100644 index 0000000..422ddb4 --- /dev/null +++ b/tooling/fine-tuning/huggingface-recipes/carla_vlm_gemma.py @@ -0,0 +1,302 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl", +# "openenv-carla-env @ git+https://huggingface.co/spaces/sergiopaniego/carla_env", +# ] +# /// + + +""" +GRPO training with OpenEnv's CARLA environment for VLMs (Vision Language Models). + +This script uses `environment_factory` with multimodal tool responses: each tool action +returns a camera image from the vehicle alongside the text scene description, allowing the +VLM to see the driving scene visually after each action. + +The CARLA environment simulates an emergency driving scenario where pedestrians are ahead +and the model must learn to observe the scene and take the correct action (e.g., swerve +to an empty lane) to minimize casualties. + +Setup: +```sh +pip install "openenv-carla-env @ git+https://huggingface.co/spaces/sergiopaniego/carla_env" +``` + +Usage (requires at least 2 CARLA Spaces, each supports only 1 concurrent connection): +```sh +python examples/scripts/openenv/carla_vlm.py \ + --env-urls https://server1.hf.space https://server2.hf.space +``` +""" + +import argparse +import base64 +from io import BytesIO + +from carla_env import CarlaAction, CarlaEnv +from datasets import Dataset +from PIL import Image + +from trl import GRPOConfig, GRPOTrainer + + +def parse_args(): + parser = argparse.ArgumentParser(description="Run GRPO VLM training with CARLA environment.") + parser.add_argument("--model", type=str, default="google/gemma-4-E2B-it") + parser.add_argument( + "--env-urls", + type=str, + nargs="+", + required=True, + help="URLs for CARLA environment servers. At least 2 required (1 Space = 1 connection).", + ) + parser.add_argument("--dataset-size", type=int, default=1000) + parser.add_argument("--max-completion-length", type=int, default=3072) + parser.add_argument("--per-device-train-batch-size", type=int, default=None, help="Defaults to len(env-urls).") + parser.add_argument("--gradient-accumulation-steps", type=int, default=4) + parser.add_argument("--max-steps", type=int, default=100) + parser.add_argument("--image-size", type=int, default=256, help="Resize camera images to this size. 0 to disable.") + parser.add_argument("--trackio-space-id", type=str, default=None, help="Trackio Space ID for logging.") + parser.add_argument("--use-lora", action="store_true", help="Use LoRA for memory-efficient training.") + parser.add_argument("--lora-r", type=int, default=128, help="LoRA rank.") + parser.add_argument("--lora-alpha", type=int, default=256, help="LoRA alpha.") + parser.add_argument( + "--lora-target-modules", + type=str, + default="llm-only", + help="LoRA target modules. Use 'llm-only' to skip vision encoder, 'all-linear' for all.", + ) + parser.add_argument( + "--learning-rate", type=float, default=5e-6, help="Learning rate. Default 5e-6 (good for LoRA r=128)." + ) + parser.add_argument("--hub-model-id", type=str, default=None) + parser.add_argument("--hub-private-repo", action="store_true", help="Make the Hub repo private.") + parser.add_argument("--run-name", type=str, default=None) + parser.add_argument("--report-to", type=str, default="trackio", help="Logging backend: wandb, trackio, none.") + return parser.parse_args() + + +SIM_TICKS = 10 + + +def reward_func(completions, environments, **kwargs): + rewards = [] + for i, (comp, env) in enumerate(zip(completions, environments, strict=False)): + # Advance to episode end to capture rubric_reward + try: + final = env._advance_until_done() + if final and final.observation.rubric_reward: + env.reward = final.observation.rubric_reward + except Exception as e: + print(f"[WARN] _advance_until_done failed for gen={i}: {e}") + r = env.reward + tools = [ + msg["tool_calls"][0]["function"]["name"] for msg in comp if isinstance(msg, dict) and msg.get("tool_calls") + ] + rewards.append(r) + print(f"[DEBUG reward] gen={i} tools={tools} env_reward={env.reward} total={r}") + return rewards + + +def main(): + args = parse_args() + env_url_iter = iter(args.env_urls) + image_size = args.image_size + + prompt = """\ +You control an autonomous vehicle in an emergency. There are pedestrians ahead and you must \ +decide what to do immediately. + +You will see a camera image from the vehicle after each action. Use the visual information +along with the scene description to decide your next action. + +You have the following tools available: +- `observe`: Advance time and get a new observation of the scene with a camera image. +- `emergency_stop`: Apply maximum braking to stop the vehicle. +- `lane_change(direction)`: Change lane to the left or right. Direction must be "left" or "right". + +Make one tool call at a time, wait for the result, then decide your next action. +Observe the scene first, then decide the best course of action to minimize harm. +Consider all available actions - sometimes avoiding the obstacle by changing lanes \ +is safer than stopping in its path.""" + + dataset = Dataset.from_dict({"prompt": [[{"role": "user", "content": prompt}] for _ in range(args.dataset_size)]}) + + class CarlaVLMEnv: + def __init__(self): + self.url = next(env_url_iter) + self.client = CarlaEnv(base_url=self.url, connect_timeout_s=30, message_timeout_s=120) + self.reward = 0.0 + + @staticmethod + def _describe(obs) -> str: + parts = [] + parts.append(f"Speed: {obs.speed_kmh:.1f} km/h.") + if obs.nearby_actors: + for actor in obs.nearby_actors: + parts.append(f"- {actor.get('type', 'actor')} at {actor.get('distance', '?')}m") + else: + parts.append("No nearby actors detected.") + if obs.collision_detected: + parts.append(f"COLLISION detected with {obs.collided_with or 'unknown'}!") + return "\n".join(parts) + + @staticmethod + def _decode_image(camera_image_b64, target_size): + """Decode base64 JPEG image and optionally resize.""" + img_bytes = base64.b64decode(camera_image_b64) + img = Image.open(BytesIO(img_bytes)) + if target_size > 0: + img.thumbnail((target_size, target_size), Image.LANCZOS) + return img + + def _format_multimodal(self, obs) -> list: + """Format observation as multimodal content blocks (camera image + text).""" + content = [] + if obs.camera_image is not None: + img = self._decode_image(obs.camera_image, image_size) + content.append({"type": "image", "image": img}) + content.append({"type": "text", "text": self._describe(obs)}) + return content + + def _advance(self, ticks: int = SIM_TICKS): + result = None + for _ in range(ticks): + result = self.client.step(CarlaAction(action_type="observe")) + if result.done: + break + return result + + def _advance_until_done(self, max_ticks: int = 50): + """Advance the simulation until the episode ends.""" + result = None + for _ in range(max_ticks): + result = self.client.step(CarlaAction(action_type="observe")) + if result.done: + break + return result + + def _advance_and_capture(self, ticks: int = SIM_TICKS): + """Advance the simulation, then capture an image of the current state.""" + result = self._advance(ticks) + capture_result = self.client.step(CarlaAction(action_type="capture_image")) + result.observation.camera_image = capture_result.observation.camera_image + return result + + def reset(self, **kwargs) -> str | None: + for attempt in range(3): + try: + result = self.client.reset(scenario_name="trolley_micro_escape_exists") + self.reward = 0.0 + return self._describe(result.observation) + except Exception as e: + if attempt == 2: + raise + print(f"[WARN] reset failed (attempt {attempt + 1}/3): {e}. Reconnecting...") + self.client = CarlaEnv(base_url=self.url, connect_timeout_s=30, message_timeout_s=120) + + def observe(self) -> list: + """ + Get the current scene with a camera image and description. + + Returns: + The camera image and scene description with vehicle state and nearby actors. + """ + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + return self._format_multimodal(result.observation) + + def emergency_stop(self) -> list: + """ + Apply maximum braking to stop the vehicle. + + Returns: + The camera image and scene description after braking. + """ + self.client.step(CarlaAction(action_type="emergency_stop")) + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + print(f"[DEBUG env] emergency_stop: done={result.done}, reward={self.reward}") + return self._format_multimodal(result.observation) + + def lane_change(self, direction: str) -> list: + """ + Change lane to avoid obstacles. + + Args: + direction: Direction to change lane, either "left" or "right". + + Returns: + The camera image and scene description after changing lane. + """ + self.client.step(CarlaAction(action_type="lane_change", lane_direction=direction)) + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + print(f"[DEBUG env] lane_change({direction}): done={result.done}, reward={self.reward}") + return self._format_multimodal(result.observation) + + peft_config = None + if args.use_lora: + from peft import LoraConfig + + if args.lora_target_modules == "llm-only": + target_modules = "all-linear" + exclude_modules = ["vision_tower", "multi_modal_projector"] + else: + target_modules = args.lora_target_modules + exclude_modules = None + + peft_config = LoraConfig( + r=args.lora_r, + lora_alpha=args.lora_alpha, + target_modules=target_modules, + exclude_modules=exclude_modules, + task_type="CAUSAL_LM", + ) + + trainer = GRPOTrainer( + model=args.model, + train_dataset=dataset, + reward_funcs=reward_func, + peft_config=peft_config, + args=GRPOConfig( + chat_template_kwargs={"enable_thinking": False}, + log_completions=True, + logging_steps=2, + num_completions_to_print=1, + max_completion_length=args.max_completion_length, + per_device_train_batch_size=args.per_device_train_batch_size or len(args.env_urls), + steps_per_generation=1, + num_generations=len(args.env_urls), + max_tool_calling_iterations=10, + learning_rate=args.learning_rate, + gradient_accumulation_steps=args.gradient_accumulation_steps, + max_steps=args.max_steps, + push_to_hub=args.hub_model_id is not None, + hub_model_id=args.hub_model_id, + hub_private_repo=args.hub_private_repo, + run_name=args.run_name, + report_to=args.report_to, + trackio_space_id=args.trackio_space_id, + ), + environment_factory=CarlaVLMEnv, + ) + trainer.train() + + +if __name__ == "__main__": + main() diff --git a/tooling/fine-tuning/huggingface-recipes/hf-blog-gemma4.md b/tooling/fine-tuning/huggingface-recipes/hf-blog-gemma4.md new file mode 100644 index 0000000..66ea09c --- /dev/null +++ b/tooling/fine-tuning/huggingface-recipes/hf-blog-gemma4.md @@ -0,0 +1,764 @@ +--- +title: "Welcome Gemma 4: Frontier multimodal intelligence on device" +thumbnail: /blog/assets/gemma4/thumbnail.png +authors: +- user: merve +- user: pcuenq +- user: sergiopaniego +- user: burtenshaw +- user: Steveeeeeeen +- user: alvarobartt +- user: SaylorTwift +--- + +# Welcome Gemma 4: Frontier multimodal intelligence on device + +The Gemma 4 family of multimodal models by Google DeepMind is out on Hugging Face, with support for your favorite agents, inference engines, and fine-tuning libraries 🤗 + +These models are the real deal: truly open with Apache 2 licenses, high quality with pareto frontier arena scores, multimodal including audio, and sizes you can use _everywhere_ including on-device. Gemma 4 builds on advances from previous families and makes them click together. In our tests with pre-release checkpoints we have been impressed by their capabilities, to the extent that we struggled to find good fine-tuning examples because they are _so good_ out of the box. + +We collaborated with Google and the community to make them available everywhere: transformers, llama.cpp, MLX, WebGPU, Rust; you name it. This blog post will show you how to build with [your favorite tools](https://huggingface.co/collections/google/gemma-4) so let us know what you think! + +## Table of Contents + +- [What is New with Gemma 4?](#what-is-new-with-gemma-4) +- [Overview of Capabilities and Architecture](#overview-of-capabilities-and-architecture) + - [Architecture at a Glance](#architecture-at-a-glance) + - [Per-Layer Embeddings (PLE)](#per-layer-embeddings-ple) + - [Shared KV Cache](#shared-kv-cache) +- [Multimodal Capabilities](#multimodal-capabilities) +- [Deploy Anywhere](#deploy-anywhere) + - [transformers](#transformers) + - [Llama.cpp](#llamacpp) + - [Plug in to your local agent](#Plug-in-your-local-agent) + - [transformers.js](#transformersjs) + - [MLX](#mlx) + - [Mistral.rs](#mistralrs) +- [Fine-tuning & Demos](#fine-tuning--demos) + - [Fine-tuning with TRL](#fine-tuning-with-trl) + - [Fine-tuning with TRL on Vertex AI](#fine-tuning-with-trl-on-vertex-ai) + - [Fine-tuning with Unsloth Studio](#fine-tuning-with-unsloth-studio) +- [Try Gemma 4](#try-gemma-4) +- [Benchmark Results](#benchmark-results) +- [Acknowledgements](#acknowledgements) + +# What is new with Gemma 4? + +Similar to Gemma-3n, Gemma 4 supports image, text, and audio inputs, and generates text responses. The text decoder is based on the Gemma model with support for long context windows. The image encoder is similar to the one from Gemma 3 but with two crucial improvements: variable aspect ratios, and configurable number of image token inputs to find your sweet spot between speed, memory, and quality. All models support images (or video) and text inputs, while the small variants (E2B and E4B) support audio as well. + +Gemma 4 comes in four sizes, all base and instruction fine-tuned: + +| Model | Parameter Size | Context Window | Checkpoints | +| :---- | :---- | :---- | :---- | +| Gemma 4 E2B | 2.3B effective, 5.1B with embeddings | 128k | [base](https://huggingface.co/google/gemma-4-E2B), [IT](https://huggingface.co/google/gemma-4-E2B-it) | +| Gemma 4 E4B | 4.5B effective, 8B with embeddings | 128k | [base](https://huggingface.co/google/gemma-4-E4B), [IT](https://huggingface.co/google/gemma-4-E4B-it) | +| Gemma 4 31B | 31B dense model | 256K | [base](https://huggingface.co/google/gemma-4-31B), [IT](https://huggingface.co/google/gemma-4-31B-it) | +| Gemma 4 26B A4B | mixture-of-experts with 4B activated/26B total parameters | 256K | [base](https://huggingface.co/google/gemma-4-26B-A4B), [IT](https://huggingface.co/google/gemma-4-26B-A4B-it) | + +## Overview of Capabilities and Architecture + +Gemma 4 leverages several architecture components used in previous Gemma versions and other open models, and leaves out complex or inconclusive features such as Altup. The combination is a mix designed to be highly compatible across libraries and devices, that can efficiently support long context and agentic use cases, whilst being ideal for quantization. + +As shown in the benchmarks above, this feature mix (combined with the training data and recipe) enables the 31B dense model to achieve an estimated LMArena score (text only) of 1452, while the 26B MoE reaches 1441 with just 4B active parameters 🤯. As we'll see, multimodal operation is comparatively as good as text generation, at least in informal and subjective tests. + +These are the main architecture characteristics in Gemma 4: + +* Alternating **local sliding-window** and **global full-context** attention layers. Smaller dense models use sliding windows of 512 tokens while larger models use 1024 tokens. +* **Dual RoPE** configurations: standard RoPE for sliding layers, pruned RoPE for global layers, to enable longer context. +* **Per-Layer Embeddings (PLE)**: a second embedding table that feeds a small residual signal into every decoder layer. +* **Shared KV Cache**: the last N layers of the model reuse key-value states from earlier layers, eliminating redundant KV projections. +* **Vision encoder**: uses learned 2D positions and multidimensional RoPE. Preserves the original aspect ratios and can encode images to a few different token budgets (70, 140, 280, 560, 1120). +* **Audio encoder**: USM-style conformer with the same base architecture as the one in Gemma-3n. + +#### Per-Layer Embeddings (PLE) + +One of the most distinctive features in smaller Gemma 4 models is Per-Layer Embeddings (PLE), which was introduced previously in Gemma-3n. In a standard transformer, each token gets a single embedding vector at input, and the same initial representation is what the residual stream builds on across all layers, forcing the embedding to frontload everything the model might need. PLE adds a parallel, lower-dimensional conditioning pathway alongside the main residual stream. For each token, it produces a small dedicated vector for every layer by combining two signals: a token-identity component (from an embedding lookup) and a context-aware component (from a learned projection of the main embeddings). Each decoder layer then uses its corresponding vector to modulate the hidden states via a lightweight residual block after attention and feed-forward. This gives each layer its own channel to receive token-specific information only when it becomes relevant, rather than requiring everything to be packed into a single upfront embedding. Because the PLE dimension is much smaller than the main hidden size, this adds meaningful per-layer specialization at modest parameter cost. For multimodal inputs (images, audio, video), PLE is computed before soft tokens are merged into the embedding sequence — since PLE relies on token IDs that are lost once multimodal features replace the placeholders. Multimodal positions use the pad token ID, effectively receiving neutral per-layer signals. + +#### Shared KV Cache + +The **shared KV cache** is an efficiency optimization that reduces both compute and memory during inference. The last `num_kv_shared_layers` layers of the model don't compute their own key and value projections. Instead, they **reuse** the K and V tensors from the last non-shared layer of the same attention type (sliding or full). + +In practice, this has a minimal impact on quality while being much more efficient (in terms of both memory and compute) for long context generation and on-device use. + +## Multimodal Capabilities + +We saw in our tests that Gemma 4 supports comprehensive multimodal capabilities out of the box. We don't know what was the training mix, but we had success using it for tasks such as OCR, speech-to-text, object detection, or pointing. It also supports text-only and multimodal function calling, reasoning, code completion and correction. + +Here, we show a few inference examples across different model sizes. You can run them conveniently with [this notebook](https://github.com/huggingface/huggingface-gemma-recipes/blob/main/notebooks/Gemma4_(E2B)-Multimodal.ipynb). We encourage you to try the demos and share them below this blog! + +### Object Detection and Pointing + +### GUI detection + +We test Gemma 4 on GUI element detection and pointing across different sizes, with the following image and text prompt: "What's the bounding box for the "view recipe" element in the image?" + +![Image](https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/food_resized.png) + +With this prompt, the model natively responds in JSON format with the detected bounding boxes - no need for specific instructions or grammar-constrained generation. We found the coordinates refer to an image size of 1000x1000, relative to the input dimensions. + +We visualize the outputs below for your convenience. We parse the bounding boxes from the returned JSON: ```json\n[\n {"box_2d": [171, 75, 245, 308], "label": "view recipe element"}\n]\n``` + +| E2B | E4B | +| :---- | :---- | +| ![E2B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e2b.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e4b.png) | +| 26/A4B | 31B | +| ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/26b.png) | ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/31b.png) | + +### Object Detection + +We test models to detect everyday objects, here we ask them to detect the bike and compare different model outputs. As in the previous case, we parse the bounding box from the json and translate to image space coordinates. + +| E2B | E4B | 26B/A3B | 31B | +| :---- | :---- | :---- | :---- | +| ![E2B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e2b_bike.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/bike_e4b.png) | ![26B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/bike_26b.png) | ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/31b_bike.png) | + +### Multimodal Thinking and Function Calling + +We asked Gemma 4 to write HTML code to reconstruct a page we made with Gemini 3. Below you can find the code to do this, we enable thinking and ask each model to generate up to 4000 new tokens, to make it foolproof. + +| Gemini Generated Website (Reference) | Gemini Reproduced Image | +| :---- | :---- | +| ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/landing_page.png) | ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_repro_gemini.png) | + +

+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + { + "type": "image", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/landing_page.png", + }, + {"type": "text", "text": "Write HTML code for this page."}, + ], + } +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=4000) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| E2B | E4B | +| :---- | :---- | +| ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_e2b.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_e4b.png) | + +| 31B | 26/A4B | +| :---- | :---- | +| ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_31b.png) | ![MoE](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_26b.png) | + +### Video Understanding + +Smaller Gemma 4 models can take in videos with audio while larger ones can take in videos without audio. While the models are not explicitly post-trained on videos, they can understand videos both with and without audio. The model is particularly strong in audios + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "video", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"}, + {"type": "text", "text": "What is happening in the video? What is the song about?"}, + ], + }, +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + load_audio_from_video=True, # disable this for larger models +).to(model.device) +output = model.generate(**inputs, max_new_tokens=200) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B (hallucinated for the audio) | Based on the video provided, here is an analysis: **What is happening in this video?** The video captures a live musical performance, likely at a large outdoor festival or concert. * **Setting:** The scene is a large stage set up outdoors, indicated by the extensive lighting rig, large speakers, and the audience visible in the foreground. * **Performers:** There are several musicians on stage. The focal point seems to be a lead singer/guitarist in a blue shirt and white pants who is actively performing, playing an acoustic or electric guitar. There are also other musicians, including drummers and bassists, visible in the background. * **Atmosphere:** The atmosphere is energetic and dramatic, characterized by bright stage lights, intense blue and white spotlights, and a significant amount of stage fog/smoke, which adds to the concert mood. * **Audience:** The foreground is filled with the backs of audience members, showing they are close to the stage and engaged in watching the performance. **What is the song about?** The lyrics provided below the video are: > "I don't care 'bout street > From what I cherish > Could it's time to protest | +| E4B ✅ | The video captures a live performance of a band on a stage with bright lights and smoke effects, surrounded by an audience. The band performs and sings to the crowd. The song appears to be about the struggles and disillusionment of modern life, specifically the feeling of being stuck and the difficulties in finding one's place in a chaotic and overwhelming world. Lyrics mention themes of the "concrete street," "broken promises," "storm of the day," and the difficulty of finding oneself amidst societal pressures. | +| 26/A4B (no audio) ✅ | This video shows a live music performance at an outdoor concert or festival at night. A solo male artist, dressed in a blue shirt and white pants, is the central focus. He is playing an acoustic guitar and singing into a microphone on a large, lit stage. The performance is accompanied by a band, including a drummer and other musicians visible in the background and on large video screens. The stage is filled with atmospheric blue lighting, smoke, and bright spotlights. The video captures different perspectives, including shots from the crowd looking up at the stage and close-up views of the performers projected onto large screens. The crowd is visible in the foreground, watching the show. One of the screens also displays the "Estrella Damm" brand name. | +| 31B (no audio) ✅ | A musician is performing on stage during a concert, playing an acoustic guitar and singing into a microphone. He is wearing a blue shirt and white pants. The stage is filled with atmospheric smoke and illuminated by bright blue and white lights. Other band members, including a drummer and a keyboardist, are also visible on stage. The video shows the musician from the perspective of the audience, with some shots focusing on him and others showing the large screen on the side of the stage, which displays close-ups of the performer and the crowd. | + +### Captioning + +We have tested all models on captioning. All checkpoints perform very well and accurately capture nuance in complex scenerios. +Here's the image we use, with the prompt "Write single detailed caption for this image.". + +![image](https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png) + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "image", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png"}, + {"type": "text", "text": "Write single detailed caption for this image."}, + ], + }, +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=512) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B ✅ | A medium shot captures a weathered seagull perched atop a stone pedestal in what appears to be a bustling European square, with a grand, classical-style building featuring ornate columns and architectural details dominating the right side of the frame. In the background, a low, light-colored building stretches across the middle ground, flanked by some green foliage, and hints of other structures, including a terracotta-roofed building, are visible. In the foreground, part of a modern bus stop or shelter is visible, with signage indicating routes, and the overall scene is bathed in bright daylight under a pale sky. | +| E4B ✅ | A solitary seagull perches atop a grey stone pedestal in a bustling European piazza, with the historical grandeur of a classical building dominating the right side of the frame, contrasting with the more modern, low-rise architecture in the background under a bright, hazy sky. | +| 26B/A4B ✅ | A full shot shows a white and brown seagull perched on a gray pillar in Venice, Italy. The seagull faces left, its beak pointed towards the edge of the frame. Behind it is a light gray, two-story building with several dark rectangular windows. To the right of the seagull is a large, white building with columns and intricate carvings. The sky is a clear, light blue. The lighting is bright and even, suggesting it is daytime. | +| 31B ✅ | A high-angle, medium shot shows a white and gray seagull perched on a gray concrete pylon in Venice, Italy. The seagull is facing left, its body angled slightly towards the camera. Its white head, neck, and chest contrast with its gray wings and back. The seagull's orange beak is slightly open. The pylon is a light gray concrete cylinder with a weathered texture. In the background, there are several buildings. To the left is a long, low, white building with a series of small, rectangular windows. In the center is a cluster of green trees. To the right is a red building with a tiled roof and several small, rectangular windows. Further right is a large, ornate, white stone building with several columns and sculptures. The sky is a pale blue, and the light is bright and clear. In the lower-left corner, there is a yellow bus with the word "Ferrovia" printed on it in black letters. There are several people walking in the background, but they are small and out of focus. | + +### Audio Question Answering + +These models are trained to answer questions about speech in audio. Music and non-speech sounds were not part of the training data. + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}, + {"type": "text", "text": "Can you describe this audio in detail?"}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate( + **inputs, + max_new_tokens=1000, + do_sample=False, +) + +print(processor.decode(output[0], skip_special_tokens=True)) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | This audio is a personal reflection. The speaker is talking about their final farewell address to the nation, which they delivered in Chicago. They express gratitude for the conversations they've had with the American people, noting that despite not having met them face-to-face or even greeted them, these interactions in various settings like living rooms, schools, farms, factory floors, diners, and military outposts have been what has kept them going. | +| E4B | The audio is a speech excerpt where a speaker is delivering a farewell address to the nation from Chicago. The speaker reflects on their time in office, expressing gratitude for the conversations they had with the American people across various settings like living rooms, schools, farms, factories, diners, and military outposts. The tone is reflective and appreciative, highlighting the importance of these interactions in their political journey. | + +Here is an example if you want to do transcription: + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}, + {"type": "text", "text": "Transcribe the audio?"}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate( + **inputs, + max_new_tokens=1000, + do_sample=False, +) + +print(processor.decode(output[0], skip_special_tokens=True)) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | This week I traveled to Chicago to deliver my final farewell address to the nation following in the tradition of presidents before me It was an opportunity to say thank you whether we've seen eye to eye or rarely agreed at all my conversations with you the American people in living rooms and schools at farms and on factory floors at diners and on distant military outposts all these conversations are what have kept me honest | +| E4B | This week I traveled to Chicago to deliver my final farewell address to the nation following in the tradition of presidents before me. It was an opportunity to say thank you. Whether we've seen eye to eye or rarely agreed at all, my conversations with you, the American people, in living rooms and schools, at farms and on factory floors, at diners and on distant military outposts, all these conversations are what have kept me honest. | + +### Multimodal Function Calling + +We test the model by asking to get the weather in the place shown in the image. + +
+Inference code + +```py +import re +WEATHER_TOOL = { + "type": "function", + "function": { + "name": "get_weather", + "description": "Gets the current weather for a specific location.", + "parameters": { + "type": "object", + "properties": { + "city": {"type": "string", "description": "The city name"}, + }, + "required": ["city"], + }, + }, +} +tools = [WEATHER_TOOL] +messages = [ + {"role": "user", "content": [ + {"type": "text", "text": "What is the city in this image? Check the weather there right now."}, + + {"type": "image", "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg"}, + ]}, +] +inputs = processor.apply_chat_template( + messages, + tools=[WEATHER_TOOL], + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=1000) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | **Analyze the Request:** The user has provided an image and asked two questions:\n * "What is the city in this image?" * "Check the weather there right now."\n\n2. **Analyze the Image:** The image displays a large, ornate, tall structure, characteristic of temple architecture, likely in Southeast Asia (given the style). It appears to be a famous landmark. 3. **Identify the Landmark/Location (Internal Knowledge/Visual Cues):** The structure strongly resembles the chedis/stupas found in places like Bangkok, Thailand (e.g., Wat Arun or similar structures).\n\n4. **Determine the City:** Based on the visual evidence, the location is highly likely to be Bangkok, Thailand.\n\n5. **Check Available Tools:** The available tool is `get_weather(city: STRING)`. 6. **Formulate the Plan:**\n * Step 1: Identify the city from the image (Bangkok).\n * Step 2: Use the `get_weather` tool with the identified city.\n\n7. **Construct the Tool Call:** `get_weather(city="Bangkok")`\n\n8. **Generate Response:** The model should first state the identified city and then call the tool to get the weather. (Self-correction: The model *must* call the tool in the correct format if it needs external information.)call:get_weather{city:Bangkok} | +| E4B | '1. **Analyze the Request:** The user has provided an image and asked two things:\n a. Identify the city in the image.\n b. Check the weather in that city right now.\n\n2. **Analyze the Image:** The image shows a very distinctive, ornate tower/spire structure, characteristic of Thai architecture (specifically, a chedi or prang).\n\n3. **Determine City Identification (Internal Knowledge/Visual Recognition):** Based on the architectural style, the structure strongly resembles prominent temples in Thailand, such as Wat Arun in Bangkok.\n\n4. **Evaluate Tool Availability:** I have one available tool: `get_weather(city: STRING)`. This tool requires a city name as input.\n\n5. **Formulate a Plan:**\n a. I need the city name to use the `get_weather` tool.\n b. I must first identify the city from the image.\n c. Since my internal knowledge suggests Bangkok, I will proceed with that assumption, but I must acknowledge that I cannot *definitively* prove the location from the image alone.\n\n6. **Execute Step 1 (City Identification):** Assume the city is Bangkok based on the visual evidence of the architecture.\n\n7. **Execute Step 2 (Tool Call Generation):** Use the `get_weather` tool with "Bangkok" as the `city` argument.\n\n8. **Construct the Response:** Generate the appropriate tool call in JSON format.', 'answer': '<\|tool_call>call:get_weather{city:<\|"\|>Bangkok<\|"\|>}' | +| 31B | The user wants to know the city in the image and the current weather there. 1. **Analyze the image:** The image shows ornate, spire-like structures (prangs) characteristic of Thai temple architecture. Specifically, these look like the prangs at Wat Phra Kaew (Temple of the Emerald Buddha) or Wat Pho in Bangkok, Thailand. The style is very distinctive of Bangkok's royal temple complexes. 2. **Identify the city:** Based on the architectural style, the city is Bangkok. 3. **Find the weather:** I need to call the `get_weather` tool with `city="Bangkok"`.call:get_weather{city:Bangkok} | +| 26/A4B | The image shows several tall, ornate towers (prangs) typical of Thai Buddhist temple architecture. Specifically, these look like the structures within the Grand Palace or Wat Phra Kaew in Bangkok, Thailand. The style is unmistakably Thai. I'll confirm this by looking at the specific towers. These are very iconic.\n2. **Confirm the location:** The image shows elements of the Grand Palace complex in Bangkok.\n3. **Get weather information:** Once the city is identified as Bangkok, I will use the `get_weather` tool with `city='Bangkok'`.call:get_weather{city:Bangkok} | + +# Deploy Anywhere + +Gemma 4 comes with day-0 support for many open-source inference engines, and is ideal for tool calling and agents! We also release ONNX checkpoints that can run on many hardware backends, allowing use cases on edge devices or in browser! + +## transformers + +Gemma 4 comes with first-class transformers support from the get-go 🤗. This integration allows using the model with other libraries like bitsandbytes, PEFT and TRL. Make sure to install the latest version of transformers. + +```bash +pip install -U transformers +``` + +The easiest way to infer with the small Gemma 4 models is through the `any-to-any` pipeline. You can initialize it as follows. + +```py +from transformers import pipeline +pipe = pipeline("any-to-any", model="google/gemma-4-e2b-it") +``` + +You can then pass in images and text as follows. + +```python +messages = [ + { + "role": "user", + "content": [ + { + "type": "image", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg", + }, + {"type": "text", "text": "Do you have travel advice going to here?"}, + ], + } +] +output = pipe(messages, max_new_tokens=100, return_full_text=False) +output[0]["generated_text"] +# Based on the image, which appears to show a magnificent, ornate **Buddhist temple or pagoda**, likely in Southeast Asia (such as Thailand, Myanmar, or Cambodia), here is some general travel advice.. +``` + +When inferring with videos, you can include the audio track using the `load_audio_from_video` argument. + +```python +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] +pipe(messages, load_audio_from_video=True) +``` + +Going a level lower, you can load Gemma 4 using the `AutoModelForMultimodalLM` class, especially useful for fine-tuning. The built-in chat template takes care of formatting the inputs correctly, please make sure you use it to prevent subtle mistakes when building the prompt manually. + +
+Inference code + +```python +from transformers import AutoModelForMultimodalLM, AutoProcessor +model = AutoModelForMultimodalLM.from_pretrained("google/gemma-4-E2B-it", device_map="auto") +processor = AutoProcessor.from_pretrained("google/gemma-4-E2B-it") +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=True, + return_dict=True, + return_tensors="pt" +).to(model.device) + +generated_ids = model.generate(**inputs, max_new_tokens=128) +generated_ids_trimmed = [ + out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) +] +output_text = processor.batch_decode( + generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False +) +print(output_text) +``` + +
+ +## Llama.cpp + +Gemma 4 models come with image+text support in llama.cpp from the get-go! This unlocks using Gemma 4 with all of your favorite local apps: llama-cpp server, lmstudio, Jan as well as coding agents like Pi across many backends such as Metal and CUDA. + +You can install llama-cpp as follows. + +```bash +brew install llama.cpp # MacOS +winget install llama.cpp # Windows +``` + +You can then start a server compatible with the OpenAI API Replace the quantization scheme at the end of the command with the precision of your choice. + +```bash +llama-server -hf ggml-org/gemma-4-E2B-it-GGUF +``` + +Check out this link [for more](https://huggingface.co/ggml-org/gemma-4-E2B-it-GGUF?local-app=llama.cpp) options on combining llama.cpp with different coding agents and local apps. Find all the GGUF checkpoints [in this collection](https://huggingface.co/collections/ggml-org/gemma-4). + +## Plug in your local agent + +We worked on making sure the new models work locally with agents like **openclaw, hermes, pi, and open code**. All thanks to llama.cpp! Run the following to try Gemma 4 right away. + +First, start your local server: + +``` +llama-server -hf ggml-org/gemma-4-26b-a4b-it-GGUF:Q4_K_M +``` + +For **hermes:** + +```shell +hermes model +``` + +For **openclaw:** + +```shell +openclaw onboard +``` + +For **pi** define a `~/.pi/agent/models.json`: + +```json +{ + "providers": { + "llama-cpp": { + "baseUrl": "http://localhost:8080/v1", + "api": "openai-completions", + "apiKey": "none", + "models": [ + { + "id": "ggml-org-gemma-4-26b-4b-gguf" + } + ] + } + } +} +``` + +For **open code** define a `~/.config/opencode/opencode.json`: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "provider": { + "llama.cpp": { + "npm": "@ai-sdk/openai-compatible", + "name": "llama-server (local)", + "options": { + "baseURL": "http://127.0.0.1:8080/v1" + }, + "models": { + "gemma-4-26b-4b-it": { + "name": "Gemma 4 (local)", + "limit": { + "context": 128000, + "output": 8192 + } + } + } + } + } +} +``` + +## transformers.js + +transformers.js enables running Gemma 4 right inside browser. You can check out the model card to see text-only, image & text, audio & text inference in detail [here](https://huggingface.co/onnx-community/gemma-4-E2B-it-ONNX#transformersjs-javascript). We also shipped a demo for you to test the model [here](https://huggingface.co/spaces/webml-community/Gemma-4-WebGPU). + +## MLX + +Full multimodal support of Gemma 4 is available using the open-source [`mlx-vlm` library](https://github.com/Blaizzy/mlx-vlm). Here's how to ask the model to describe an image: + +```shell +pip install -U mlx-vlm +``` + +```shell +mlx_vlm.generate \ +--model google/gemma-4-E4B-it \ +--image https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg \ +--prompt "Describe this image in detail" +``` + +mlx-vlm supports TurboQuant, which delivers the same accuracy as the uncompressed baseline while using ~4x less active memory and running a lot faster end-to-end. This makes long-context inference practical on Apple Silicon without sacrificing quality. Use it like this: + +```shell +mlx_vlm.generate \ +--model "mlx-community/gemma-4-26b-a4b-it-4bit" \ +--prompt "Your prompt here" \ +--kv-bits 3.5 \ +--kv-quant-scheme turboquant +``` + +For audio examples and more details, please check [the MLX collection](https://hf.co/mlx-community/gemma-4). + +### Mistral.rs + +[mistral.rs](https://github.com/EricLBuehler/mistral.rs) is a Rust-native inference engine with day-0 Gemma 4 support across all modalities (text, image, video, audio) and builtin tool-calling and agentic functionality. Install mistral.rs: + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.sh | sh # Linux/macOS + +irm https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.ps1 | iex # Windows +``` + +You can then start an OpenAI-compatible HTTP server: + +```bash +mistralrs serve mistralrs-community/gemma-4-E4B-it-UQFF --from-uqff 8 +``` + +Or, use interactive mode: + +``` +mistralrs run -m google/gemma-4-E4B-it --isq 8 --image image.png -i "Describe this image in detail." + +mistralrs run -m google/gemma-4-E4B-it --isq 8 --audio audio.mp3 -i "Transcribe this fully." +``` + +Find all models [here](https://huggingface.co/mistralrs-community/models). Please, follow [the instructions](https://huggingface.co/mistralrs-community/gemma-4-E2B-it-UQFF#install) in the model cards for installation and inference guidelines. + +## Fine-tuning for all + +Gemma 4 models are ideal for fine-tuning in your favorite tools and platforms and at any budget. + +## Fine-tuning with TRL + +Gemma 4 is fully supported for fine-tuning with TRL. To celebrate, TRL has been upgraded with support for multimodal tool responses when interacting with environments, meaning models can now receive images back from tools during training, not just text. + +To showcase this, we've built an example training script where Gemma 4 learns to drive in the CARLA simulator. The model sees the road through a camera, decides what to do and learns from the outcome. After training, it consistently changes lanes to avoid pedestrians. The same approach works for any task where a model needs to see and act: robotics, web browsing, or other interactive environments. + +Get started: + +```shell +# pip install git+https://github.com/huggingface/trl.git + +python examples/scripts/openenv/carla_vlm_gemma.py \ + --env-urls https://sergiopaniego-carla-env.hf.space \ + https://sergiopaniego-carla-env-2.hf.space \ + --model google/gemma-4-E2B-it +``` + +Find the example [here](https://github.com/huggingface/huggingface-gemma-recipes/blob/main/scripts/carla_vlm_gemma.py). + +### Fine-tuning with TRL on Vertex AI + +Additionally, we have prepared an example on how to fine-tune Gemma 4 with TRL on Vertex AI using SFT, to showcase how to extend the function calling capabilities, whilst freezing both the vision and audio towers. The examples include how to build a custom Docker container with latest Transformers, TRL, etc. with CUDA support on Google Cloud, and how to run it via Vertex AI Serverless Training Jobs. + +```python +# pip install google-cloud-aiplatform --upgrade --quiet +from google.cloud import aiplatform + +aiplatform.init( + project="", + location="", + staging_bucket="", +) + +job = aiplatform.CustomContainerTrainingJob( + display_name="gemma-4-fine-tuning", + container_uri="", + command=["python", "/gcs/gemma-4-fine-tuning/train.py"], +) + +job = job.submit( + replica_count=1, + machine_type="a3-highgpu-1g", + accelerator_type="NVIDIA_H100_80GB", + accelerator_count=1, + base_output_dir="/output-dir", + environment_variables={ + "MODEL_ID": "google/gemma-4-E2B-it", + "HF_TOKEN": , + }, + boot_disk_size_gb=500, +) +``` + +You can find the complete example in the "Hugging Face on Google Cloud" docs at https://hf.co/docs/google-cloud/examples/vertex-ai-notebooks-fine-tune-gemma-4. + +## Fine-tuning with Unsloth Studio + +If you want to fine tune and run a Gemma 4 model in a UI, try out [Unsloth Studio](https://unsloth.ai/docs/new/studio). It runs locally or on Google Colab. First, install and start the app: + +```shell +# install unsloth studio on MacOS, Linux, WSL +curl -fsSL https://unsloth.ai/install.sh | sh + +# install unsloth studio on Windows +irm https://unsloth.ai/install.ps1 | iex + +# launch unsloth studio +unsloth studio -H 0.0.0.0 -p 8888 +# Search for for a Gemma 4 model like google/gemma-4-E2B-it +``` + +Then select any of the Gemma 4 models from the hub. + +![Unsloth Studio](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/gemma4/unsloth.png) + +## Try Gemma 4 + +We have shipped demos for you to try different Gemma 4 models. We include demos based on transformers implementation for [E4B](https://huggingface.co/spaces/huggingface-projects/gemma-4-e4b-it), [26B/A4B](https://huggingface.co/spaces/huggingface-projects/gemma-4-26b-a4b-it), and dense [31B](https://huggingface.co/spaces/huggingface-projects/gemma-4-31b-it) models, as well as a [WebGPU](https://huggingface.co/spaces/webml-community/Gemma-4-WebGPU) demo with transformers.js 🚀 + + + + +## Benchmark Results + +Gemma 4 models demonstrate exceptional performance across diverse benchmarks, from reasoning and coding to vision and long-context tasks. The graph below shows model performance vs size, with Gemma 4 models forming an impressive Pareto frontier: + +
+
+ Gemma 4 Performance vs Size +
+
+ Gemma 4 Arena Elo Score Comparison +
+
+ +

Source: Google (blog.google)

+ +Here are detailed benchmark results for the instruction-tuned models: + +| Benchmark | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +|-----------|-------------|-----------------|-------------|-------------|------------------------| +| **Reasoning & Knowledge** | +| MMLU Pro | [85.2%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-31B-it) | [82.6%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-26B-A4B-it) | [69.4%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-E4B-it) | [60.0%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-E2B-it) | 67.6% | +| AIME 2026 no tools | [89.2%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-31B-it) | [88.3%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-26B-A4B-it) | [42.5%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-E4B-it) | [37.5%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-E2B-it) | 20.8% | +| GPQA Diamond | [84.3%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-31B-it) | [82.3%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-26B-A4B-it) | [58.6%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-E4B-it) | [43.4%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-E2B-it) | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Coding** | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| HLE no tools | [19.5%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-31B-it) | [8.7%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-26B-A4B-it) | - | - | - | +| HLE with search | [26.5%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-31B-it) | [17.2%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-26B-A4B-it) | - | - | - | +| **Vision** | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (edit distance) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## Acknowledgements + +Landing Gemma-4 in the open-source ecosystem took a lot of effort from many people and not only the authors of this blog post. In no particular order, we thank many people from the open-source team: Gemma 4 transformers integration is owed to Cyril, Raushan, Eustache, Arthur, Lysandre. We thank Joshua for transformers.js integration and demo, Eric for mistral.rs integration, Son for Llama.cpp, Prince for MLX integration, Quentin, Albert and Kashif for TRL, Adarsh for SGLang transformers backend and Toshihiro for building the demos. +This work wouldn't have been possible without Google's extensive contribution with the model artefact, but also the significant effort contributing the model to transformers in an effort to standardize it. The open-source ecosystem is now more complete, with a very capable, freely-licensed, open-source model. +The Gemma 4 transformers integration was handled by Cyril, Raushan, Eustache, Arthur, Lysandre. We thank Joshua for the transformers.js integration and demo, Eric for mistral.rs integration, Son for Llama.cpp, Prince for MLX, Quentin for TRL, Adarsh for SGLang transformers backend, and Toshihiro for building several demos. + +This work wouldn't have been possible without Google's extensive contribution with the model artefact, but also their significant effort contributing the model to transformers in an effort to standardize it. The open-source ecosystem is now more complete, with a very capable, freely-licensed, open-source model. diff --git a/tooling/fine-tuning/ollama-llamacpp/ollama-import-lora.md b/tooling/fine-tuning/ollama-llamacpp/ollama-import-lora.md new file mode 100644 index 0000000..38809fe --- /dev/null +++ b/tooling/fine-tuning/ollama-llamacpp/ollama-import-lora.md @@ -0,0 +1,53 @@ +# Ollama: Importing a LoRA/QLoRA Adapter (Gemma 4 applicable) + +Source: https://docs.ollama.com/import (fetched 2026-04-18) + +## Modelfile syntax + +**Safetensors adapter (merged or unmerged):** +```dockerfile +FROM +ADAPTER /path/to/safetensors/adapter/directory +``` + +**GGUF adapter:** +```dockerfile +FROM +ADAPTER /path/to/file.gguf +``` + +## Creation +```shell +ollama create my-model +``` + +## Critical notes + +- **The `FROM` base model MUST match the base the adapter was trained on** or you'll get erratic results. For Gemma 4: `FROM gemma4:e4b-it-q8_0` (or whichever base was used). +- **Non-QLoRA adapters preferred.** Quantized adapter recipes (QLoRA) sometimes diverge in method across frameworks; using a straight LoRA adapter is more portable. +- Gemma 4 is NOT explicitly listed in the Ollama docs' "supported architectures" section (which lists Llama 2/3, Mistral, Gemma 1/2) — but llama.cpp gained Gemma 4 support day one, and the Ollama gemma4 models work. Expect smooth sailing for text; vision adapters are a grey area. + +## Converting a PEFT / Unsloth adapter to GGUF + +Use llama.cpp's `convert_lora_to_gguf.py`: +```bash +python llama.cpp/convert_lora_to_gguf.py \ + --outfile gemma4-mortdecai-adapter.gguf \ + path/to/peft/adapter_dir +``` +Or use HuggingFace's "GGUF-my-LoRA" Space: https://huggingface.co/spaces/ggml-org/gguf-my-lora (web UI). + +## Unsloth fast path + +Unsloth's notebooks finish with a cell that does exactly: +```python +model.save_pretrained_gguf("model", tokenizer, quantization_method = "q4_k_m") +``` +which produces a GGUF suitable for direct `ollama create`. + +## Workflow for Seth's homelab + +1. Fine-tune with Unsloth on a rented H100/H200 (or local 3090 for E4B). +2. `model.save_pretrained_merged("merged_out", tokenizer, save_method = "merged_16bit")` — save the merged model in 16-bit safetensors. +3. Use llama.cpp's `convert_hf_to_gguf.py` to make a GGUF, then quantize to Q4_K_M. +4. Write a Modelfile pointing at the GGUF, `ollama create mortdecai-gemma4:v1 -f Modelfile`, push to local Ollama (pve197 CT 105 or steel141). diff --git a/tooling/fine-tuning/recipe-recommendation.md b/tooling/fine-tuning/recipe-recommendation.md new file mode 100644 index 0000000..b4a4e51 --- /dev/null +++ b/tooling/fine-tuning/recipe-recommendation.md @@ -0,0 +1,190 @@ +# Recommended Gemma 4 Fine-Tuning Recipe (Seth's Homelab) + +## TL;DR + +**Use Unsloth. Rent a single H100 on Vast.ai. Fine-tune Gemma 4 E4B (or 31B QLoRA). Save GGUF. `ollama create` back to CT 105.** + +Why not the alternatives: +- **Your 3090 Ti(s):** can handle E2B/E4B LoRA comfortably, but 26B A4B LoRA wants ~40 GB and 31B QLoRA wants 22 GB (fits, tightly). Axolotl's 5090-validated configs need Flex Attention to fit, and you lose half the throughput. An H100 at $2-3/hr for 3-4 hours is cheaper than the time you'll spend tuning memory. +- **Axolotl** is great — in particular the 26B MoE ScatterMoE+expert-LoRA config is genuinely novel and Unsloth doesn't match it. But Axolotl has more moving parts (FSDP, kernels, flex attention), breaks more subtly on config errors, and the docs are less Gemma-4-specific than Unsloth's. +- **TRL** has no Gemma-4-specific SFT script yet — you'd be porting `sft_gemma3.py`. Useful if you need DPO/GRPO or multimodal tool-call GRPO (the CARLA recipe), but heavier lift than Unsloth for plain SFT. +- **Google cookbook** works and is authoritative but is slower than Unsloth (no fused kernels) and the notebook format is noisier to modify. + +## Exact command + +### On a rented H100 (Vast.ai `vast-h100` alias, already configured) + +```bash +ssh vast-h100 +# one-time setup +pip install unsloth "trl==0.22.2" "transformers>=5.5.0" timm torchcodec +``` + +Training script (save as `finetune_gemma4.py` on the H100): + +```python +from unsloth import FastModel +from unsloth.chat_templates import get_chat_template, standardize_data_formats, train_on_responses_only +from datasets import load_dataset +from trl import SFTTrainer, SFTConfig + +MODEL = "unsloth/gemma-4-E4B-it" # swap to "unsloth/gemma-4-31B-it" if you want more headroom +DATASET = "YOUR_DATASET_HERE" # e.g. a mortdecai-style chat JSONL on HF Hub + +# 1. Load model + tokenizer in 4-bit +model, tokenizer = FastModel.from_pretrained( + model_name = MODEL, + max_seq_length = 4096, + load_in_4bit = True, + full_finetuning = False, +) + +# 2. Attach LoRA +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # text-only FT + finetune_language_layers = True, + finetune_attention_modules = True, + finetune_mlp_modules = True, + r = 16, + lora_alpha = 16, + lora_dropout = 0, + bias = "none", + random_state = 3407, +) + +# 3. Chat template — "gemma-4" (literal, with dash) +tokenizer = get_chat_template(tokenizer, chat_template = "gemma-4") + +# 4. Dataset: expects ShareGPT-style `conversations` field with {from, value} +# OR OpenAI-style `messages` with {role, content} — standardize_data_formats handles both. +dataset = load_dataset(DATASET, split = "train") +dataset = standardize_data_formats(dataset) + +def fmt(examples): + convos = examples["conversations"] + texts = [ + tokenizer.apply_chat_template(c, tokenize=False, add_generation_prompt=False) + .removeprefix('') # critical: avoid double + for c in convos + ] + return {"text": texts} +dataset = dataset.map(fmt, batched=True) + +# 5. Train +trainer = SFTTrainer( + model = model, + tokenizer = tokenizer, + train_dataset = dataset, + args = SFTConfig( + dataset_text_field = "text", + per_device_train_batch_size = 2, + gradient_accumulation_steps = 4, + warmup_steps = 10, + num_train_epochs = 1, + learning_rate = 2e-4, + logging_steps = 1, + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "linear", + seed = 3407, + report_to = "none", + output_dir = "outputs", + ), +) + +# 6. Mask everything except assistant turns +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) + +trainer.train() + +# 7. Save merged 16-bit for GGUF conversion +model.save_pretrained_merged("merged_out", tokenizer, save_method = "merged_16bit") + +# 8. OR save directly to GGUF (Q4_K_M) — Ollama-ready +model.save_pretrained_gguf("gemma4-mortdecai-v1", tokenizer, quantization_method = "q4_k_m") +``` + +Run: +```bash +python finetune_gemma4.py +``` + +### Pulling the result back and serving on CT 105 + +```bash +# On the Vast box, upload to HF Hub or scp back: +scp -r vast-h100:~/gemma4-mortdecai-v1*.gguf steel141:/tmp/ + +# On CT 105 (pve197 Ollama): +cat > Modelfile <<'EOF' +FROM /path/to/gemma4-mortdecai-v1.Q4_K_M.gguf +PARAMETER num_ctx 8192 +PARAMETER temperature 1.0 +PARAMETER top_p 0.95 +PARAMETER top_k 64 +SYSTEM "You are Mortdecai, a Minecraft ops AI. You are powered by Gemma 4." +EOF +ollama create mortdecai-gemma4:v1 -f Modelfile +ollama run mortdecai-gemma4:v1 +``` + +## Hardware sizing guide (from Unsloth's verified numbers) + +| Variant | LoRA | QLoRA | Full FT | My recommendation | +|---------|------|-------|---------|-------------------| +| E2B | 8-10 GB | 8 GB | ~20 GB | Free Colab T4; local 3090 Ti fine | +| E4B | 17 GB | 10 GB | ~32 GB | Local 3090 Ti (24 GB) tight but fine; H100 faster | +| 26B A4B | >40 GB (16-bit recommended, NOT 4-bit) | not recommended | — | H100 80 GB | +| 31B dense | >48 GB | 22 GB | 2×H100 | H100 80 GB or 2×3090 Ti FSDP | + +For **Mortdecai-style behavior tuning** (matches your existing qwen-based setup), start with **E4B**. It's the sweet spot: larger than qwen3 8B in the things that matter (Gemma 4 E4B beats Gemma 3 27B on most benchmarks), vision-capable if you want it, and fits on a single 3090 Ti locally. + +For a **real coding/reasoning upgrade**, use **31B QLoRA on H100**. Unsloth's 31B QLoRA notebook is the canonical recipe there. + +## Gemma-4-specific pitfalls to NOT miss + +1. **New chat template.** Gemma 4 uses `<|turn>user\n … ` — NOT Gemma 3's `user\n … `. Unsloth's `get_chat_template(tokenizer, chat_template="gemma-4")` handles this; the HF tokenizer's built-in Jinja also handles it if you rely on `apply_chat_template`. Axolotl uses `chat_template: gemma4` (no dash — different key). + +2. **6 new tool-calling tokens.** `<|tool>`, ``, `<|tool_call>`, ``, `<|tool_response>`, ``, plus the string-delimiter `<|"|>`. If fine-tuning on tool-call data, include full `<|tool_call>call:fn_name{args}` in the assistant turn — no `role="tool"` branch exists. + +3. **`modules_to_save=["lm_head","embed_tokens"]` + `ensure_weight_tying=True`** in LoraConfig if going vanilla PEFT (Google's cookbook does this explicitly). The new special tokens are *learned embeddings* — if the embed table is frozen, the adapter sees random vectors for them and training silently underperforms. Unsloth and Axolotl bake this in. + +4. **Freeze the vision/audio tower by default.** Two idioms in the wild: + - Axolotl: `freeze_mm_modules: true` + text-only LoRA regex. + - HF's CARLA example: `target_modules="all-linear"` + `exclude_modules=["vision_tower", "multi_modal_projector"]`. + Only train the vision tower if your task specifically needs the encoder to adapt (new image domain). For text-mode fine-tunes like Mortdecai, always freeze. + +5. **Flash Attention DOES NOT WORK on Gemma 4.** FA2's max `head_dim=256`, FA4's is 128; Gemma 4's `global_head_dim=512` exceeds both. **Use SDP or Flex Attention.** Axolotl's configs set `sdp_attention: true`. TRL's `sft_gemma3.py` uses `attn_implementation="eager"` — this works but is slow; prefer `"sdpa"`. (Unsloth's FastModel handles this automatically.) + +6. **LoRA kernels OFF.** Gemma 4's shared-KV-cache layers break the fused LoRA kernels. Axolotl sets `lora_mlp_kernel/qkv_kernel/o_kernel: false` explicitly. Unsloth's `FastModel` is fine because it uses its own kernel path that knows about shared-KV. + +7. **Don't prepend a second ``.** `apply_chat_template` adds one; SFTTrainer's collator adds one; if you don't `.removeprefix('')` before passing text to the trainer, you train the model to expect ``. Unsloth's example notebooks do this strip — copy their pattern. + +8. **26B A4B: use 16-bit LoRA, not QLoRA.** Unsloth's docs explicitly say "MoE QLoRA not recommended, dense 31B is fine." Axolotl has a ScatterMoE+expert-quantized+expert-LoRA config that does make 4-bit work for the MoE (validated on a 5090), but it's the only tool that does — Unsloth's 26B A4B notebook goes 16-bit for quality. + +9. **Initial training loss of 13-15 on E2B/E4B is normal, not a bug.** Multimodal models start much higher than 5-8. If you see 13-15 don't panic — GOTCHAS.md §"Fine-Tuning Ecosystem Issues" has this. + +10. **`mm_token_type_ids` required during training even for text-only data.** Day-one PEFT/Transformers bug: the multimodal collator requires this field. Pin `transformers>=5.5.0` and `peft>=0.15` to ensure the fix is present. + +## Feature parity snapshot (2026-04-18) + +| Feature | Unsloth | TRL | Axolotl | Google cookbook | +|---------|:-:|:-:|:-:|:-:| +| Text SFT | ✓ | ~ (via gemma3 script, change model_id) | ✓ | ✓ | +| Vision SFT | ✓ | ~ (via sft_vlm_gemma3) | ✓ (E2B) | ✓ | +| Audio SFT | ✓ (E2B/E4B) | ✗ | ✗ | ✗ | +| GRPO | ✓ (E2B + RL game notebooks) | ✓ (CARLA VLM-GRPO, official) | ✗ | ✗ | +| DPO | via TRL | ✓ | ✓ | ✗ | +| 26B MoE native | ✓ (16-bit LoRA) | ~ | ✓ (ScatterMoE + expert-LoRA, validated on 5090) | ✗ | +| 31B dense QLoRA | ✓ | ~ | ✓ (with Flex Attn) | ~ | +| Free Colab T4 path | ✓ (E2B) | ✗ | ✗ | ~ (via Colab Pro) | +| Multi-GPU FSDP | ~ | ✓ | ✓ (first-class) | ~ | + +**Bottom line:** Unsloth has the broadest Gemma-4-native coverage (including audio and RL games, which no one else has). Axolotl has the best 26B MoE story. TRL has the best multimodal-RL story (CARLA). Google cookbook is the reference, not the fast path. + +For Seth's stated use case (fine-tune like mortdecai), Unsloth wins on ergonomics + speed + T4 free-tier fallback. diff --git a/tooling/fine-tuning/trl/dpo.py b/tooling/fine-tuning/trl/dpo.py new file mode 100644 index 0000000..276f4c6 --- /dev/null +++ b/tooling/fine-tuning/trl/dpo.py @@ -0,0 +1,17 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +############################################################################################### +# This file has been moved to https://github.com/huggingface/trl/blob/main/trl/scripts/dpo.py # +############################################################################################### diff --git a/tooling/fine-tuning/trl/grpo_agent.py b/tooling/fine-tuning/trl/grpo_agent.py new file mode 100644 index 0000000..4742a45 --- /dev/null +++ b/tooling/fine-tuning/trl/grpo_agent.py @@ -0,0 +1,320 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl[peft]", +# "trackio", +# "kernels", +# ] +# /// + +""" +# Full training +``` +python examples/scripts/grpo_agent.py \ + --model_name_or_path Qwen/Qwen3-1.7B \ + --output_dir grpo_biogrid_qwen_3g-1.7b \ + --push_to_hub True \ + --use_vllm True \ + --vllm_mode colocate \ + --max_completion_length 1024 \ + --report_to trackio \ + --log_completions True \ + --max_steps 400 +``` +""" + +import re +import signal +import sqlite3 +import textwrap +from contextlib import contextmanager + +from datasets import load_dataset + +from trl import GRPOConfig, GRPOTrainer, ModelConfig, ScriptArguments, TrlParser + + +def query_reward(completions, answer, **kwargs): + """ + Reward query strategy: + - Penalize more than 2 queries + - Penalize generic queries (LIMIT 1 / PRAGMA) + - Reward usage of WHERE + - Reward evidence supporting the final answer + """ + rewards = [] + + for completion, ans in zip(completions, answer, strict=False): + reward = 0.0 + sql_queries = [] + tool_results = [] + + # collect all SQL queries and tool results + for turn in completion: + if turn.get("tool_calls"): + for call in turn["tool_calls"]: + sql = call["function"]["arguments"].get("sql_command", "").lower() + sql_queries.append(sql) + if turn.get("role") == "tool" and turn.get("content"): + tool_results.append(turn["content"]) + + # --- penalize too many queries --- + if len(sql_queries) > 3: + reward -= 1.5 + + # --- check query quality --- + where_count = 0 + for q in sql_queries: + if "limit 1" in q: + reward -= 1.0 + if " where " not in q: + reward -= 0.5 + else: + where_count += 1 + reward += min(where_count, 3) * 0.4 # small bonus for WHERE usage + + # --- evidence check: do queries support the answer? --- + combined_results = [] + error_detected = False + + for res in tool_results: + if isinstance(res, dict) and "error" in res: + error_detected = True + elif isinstance(res, list): + combined_results.extend(res) + + # if error detected, penalize heavily + if error_detected: + reward -= 2.0 + elif len(sql_queries) == 0: + reward -= 1.5 + else: + has_hits = len(combined_results) > 0 + correct_answer = ans.lower() + if (has_hits and correct_answer == "yes") or (not has_hits and correct_answer == "no"): + reward += 2.0 + else: + reward -= 1.5 + + rewards.append(reward) + + return rewards + + +def correctness_reward(completions, answer, **kwargs): + """ + Reward Yes/No correctness. + Model must provide final answer enclosed in stars — *yes* or *no*. + Does not reward informal yes/no buried in text. + """ + rewards = [] + for completion, ans in zip(completions, answer, strict=False): + raw = completion[-1]["content"].lower() + + # detect form *yes* or *no* + match = re.search(r"\*(yes|no)\*", raw) + guess = match.group(1) if match else None + + reward = 0.0 + + if guess is None: + reward -= 0.5 # invalid format + elif guess == ans.lower(): + reward += 0.6 # correct under required format + else: + reward -= 1.0 # wrong answer + + rewards.append(reward) + + return rewards + + +def structure_reward(completions, **kwargs): + """ + Reward proper assistant structure. + Encourages a logical sequence: tool call + response + optional extra content. + """ + rewards = [] + + for completion in completions: + has_call = False + has_response = False + has_other = False + + for turn in completion: + role = turn.get("role") + if role == "assistant" and turn.get("tool_calls"): + has_call = True + elif role == "tool": + has_response = True + else: + content = turn.get("content") + if content and content.strip() not in ["", ""]: + has_other = True + + # Reward sequences + if has_call and has_response: + if has_other: + reward = 0.1 + else: + reward = 0.05 # still positive even without extra text + elif has_call and not has_response: + reward = -0.15 + else: + reward = 0.0 # neutral if no call + + rewards.append(reward) + + return rewards + + +# ------------------------ +# Database tool function +# ------------------------ +class TimeoutError(Exception): + """Raised when a function call times out.""" + + pass + + +@contextmanager +def timeout(seconds): + """Context manager that raises TimeoutError if execution exceeds time limit.""" + + def timeout_handler(signum, frame): + raise TimeoutError(f"Operation timed out after {seconds} seconds") + + signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(seconds) + try: + yield + finally: + signal.alarm(0) + + +def query_biogrid(sql_command: str) -> list[tuple]: + """ + Execute a read-only SQL command on the BioGRID database. + + BioGRID is a curated biological database that compiles protein, genetic, and chemical interactions from multiple organisms. It provides researchers with experimentally verified interaction data to support studies in systems biology and functional genomics. + + Args: + sql_command: The SQL command to execute. + + Returns: + A list of tuples containing the query results. + """ + with timeout(5): + conn = sqlite3.connect("file:biogrid.db?mode=ro", uri=True) + cursor = conn.cursor() + try: + cursor.execute(sql_command) + results = cursor.fetchall() + finally: + conn.close() + return results + + +# ------------------------ +# Dataset formatting +# ------------------------ +def format_example(example): + question = example["question"] + preamble = textwrap.dedent("""\ + You have access to the BioGRID SQLite database. + Use SQL queries to retrieve only the information needed to answer the question. + + Genes may appear in the database in columns `Alt_IDs_Interactor_A` `Alt_IDs_Interactor_B`, `Aliases_Interactor_A` and `Aliases_Interactor_B`, + and each entry can contain multiple gene names or synonyms separated by '|', for example: + 'entrez gene/locuslink:JNKK(gene name synonym)|entrez gene/locuslink:MAPKK4(gene name synonym)|...' + So a gene like 'JNKK' or 'MAPKK4' may appear inside one of these strings. + + If the database schema is unclear or you are unsure about column names: + - First inspect the schema with `PRAGMA table_info(interactions);` + - Or preview a few rows with `SELECT * FROM interactions LIMIT 1;` + + Otherwise, directly query the required data. + + Final answer must be enclosed in stars, e.g. *Yes* or *No*. + Facts: + - The NCBI Taxonomy identifier for humans is taxid:9606. + """) + content = f"{preamble}\nQuestion: {question}" + prompt = [{"role": "user", "content": content}] + return {"prompt": prompt} + + +# ------------------------ +# Main +# ------------------------ +if __name__ == "__main__": + parser = TrlParser((ScriptArguments, GRPOConfig, ModelConfig)) + script_args, training_args, model_args = parser.parse_args_and_config() + + # ------------------------ + # Create DB + # ------------------------ + print("Creating biogrid.db...") + # Load dataset + biogrid_dataset = load_dataset("qgallouedec/biogrid", split="train") + df = biogrid_dataset.to_pandas() + + # Normalize column names: remove spaces, replace with underscores + df.columns = [c.replace(" ", "_") for c in df.columns] + conn = sqlite3.connect("biogrid.db") + try: + df.to_sql("interactions", conn, if_exists="replace", index=False) + print(f"biogrid.db created. Rows stored: {len(df)}") + finally: + conn.close() + + # ------------------------ + # Load and format dataset + # ------------------------ + dataset = load_dataset("qgallouedec/biogrid_qa", split="train") + dataset = dataset.filter( + lambda example: example["question"].startswith("Does the gene ") + ) # keep only simple questions for example + dataset = dataset.map(format_example, remove_columns=["question"]) + + train_dataset = dataset + eval_dataset = None # No eval by default, can be added if needed + + training_args.chat_template_kwargs = {"enable_thinking": False} + + # ------------------------ + # Initialize trainer + # ------------------------ + trainer = GRPOTrainer( + model=model_args.model_name_or_path, + train_dataset=train_dataset, + eval_dataset=eval_dataset, + tools=[query_biogrid], + reward_funcs=[correctness_reward, structure_reward, query_reward], + args=training_args, + ) + + # ------------------------ + # Train + # ------------------------ + trainer.train() + + # ------------------------ + # Save and push + # ------------------------ + trainer.save_model(training_args.output_dir) + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) diff --git a/tooling/fine-tuning/trl/grpo_vlm.py b/tooling/fine-tuning/trl/grpo_vlm.py new file mode 100644 index 0000000..c748b1b --- /dev/null +++ b/tooling/fine-tuning/trl/grpo_vlm.py @@ -0,0 +1,157 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl[peft]", +# "Pillow", +# "math-verify", +# "latex2sympy2_extended", +# "torchvision", +# "trackio", +# "kernels", +# ] +# /// + +""" +pip install math_verify + +# For Qwen/Qwen2.5-VL-3B-Instruct +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/grpo_vlm.py \ + --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct \ + --output_dir grpo-Qwen2.5-VL-3B-Instruct \ + --learning_rate 1e-5 \ + --dtype bfloat16 \ + --max_completion_length 1024 \ + --use_vllm \ + --vllm_mode colocate \ + --use_peft \ + --lora_target_modules "q_proj", "v_proj" \ + --log_completions + +# For HuggingFaceTB/SmolVLM2-2.2B-Instruct +pip install num2words==0.5.14 + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/grpo_vlm.py \ + --model_name_or_path HuggingFaceTB/SmolVLM2-2.2B-Instruct \ + --output_dir grpo-SmolVLM2-2.2B-Instruct \ + --learning_rate 1e-5 \ + --dtype bfloat16 \ + --max_completion_length 1024 \ + --use_peft \ + --lora_target_modules "q_proj", "v_proj" \ + --log_completions \ + --per_device_train_batch_size 1 \ + --gradient_accumulation_steps 2 \ + --num_generations 2 + +""" + +import torch +from datasets import load_dataset + +from trl import ( + GRPOConfig, + GRPOTrainer, + ModelConfig, + ScriptArguments, + TrlParser, + get_kbit_device_map, + get_peft_config, + get_quantization_config, +) +from trl.rewards import accuracy_reward, think_format_reward + + +if __name__ == "__main__": + parser = TrlParser((ScriptArguments, GRPOConfig, ModelConfig)) + script_args, training_args, model_args = parser.parse_args_and_config() + ################ + # Model + ################ + dtype = model_args.dtype if model_args.dtype in ["auto", None] else getattr(torch, model_args.dtype) + training_args.model_init_kwargs = dict( + revision=model_args.model_revision, + attn_implementation=model_args.attn_implementation, + dtype=dtype, + ) + quantization_config = get_quantization_config(model_args) + if quantization_config is not None: + # Passing None would not be treated the same as omitting the argument, so we include it only when valid. + training_args.model_init_kwargs["device_map"] = get_kbit_device_map() + training_args.model_init_kwargs["quantization_config"] = quantization_config + + ################ + # Dataset + ################ + dataset = load_dataset("lmms-lab/multimodal-open-r1-8k-verified", split="train") + dataset = dataset.train_test_split(test_size=100, seed=42) + + SYSTEM_PROMPT = ( + "A conversation between user and assistant. The user asks a question, and the assistant solves it. The " + "assistant first thinks about the reasoning process in the mind and then provides the user with the answer. " + "The reasoning process and answer are enclosed within tags, i.e., \nThis is my " + "reasoning.\n\nThis is my answer." + ) + + def make_conversation(example): + prompt = [ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": example["problem"]}, + ] + return {"prompt": prompt} + + dataset = dataset.map(make_conversation) + + # Filter have big images + def filter_big_images(example): + image = example["image"] + return image.size[0] < 512 and image.size[1] < 512 + + dataset = dataset.filter(filter_big_images) + + def convert_to_rgb(example): + image = example["image"] + if image.mode != "RGB": + image = image.convert("RGB") + example["image"] = image + return example + + dataset = dataset.map(convert_to_rgb) + + train_dataset = dataset["train"] + eval_dataset = dataset["test"] if training_args.eval_strategy != "no" else None + + ################ + # Training + ################ + trainer = GRPOTrainer( + model=model_args.model_name_or_path, + args=training_args, + reward_funcs=[think_format_reward, accuracy_reward], + train_dataset=train_dataset, + eval_dataset=eval_dataset, + peft_config=get_peft_config(model_args), + ) + + trainer.train() + + # Save and push to hub + trainer.save_model(training_args.output_dir) + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) diff --git a/tooling/fine-tuning/trl/sft.py b/tooling/fine-tuning/trl/sft.py new file mode 100644 index 0000000..b6e132e --- /dev/null +++ b/tooling/fine-tuning/trl/sft.py @@ -0,0 +1,17 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +############################################################################################### +# This file has been moved to https://github.com/huggingface/trl/blob/main/trl/scripts/sft.py # +############################################################################################### diff --git a/tooling/fine-tuning/trl/sft_gemma3.py b/tooling/fine-tuning/trl/sft_gemma3.py new file mode 100644 index 0000000..8aeb74a --- /dev/null +++ b/tooling/fine-tuning/trl/sft_gemma3.py @@ -0,0 +1,69 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl", +# "Pillow", +# "trackio", +# "kernels", +# ] +# /// + +""" +Train Gemma-3 on the Codeforces COTS dataset. + +accelerate launch --config_file examples/accelerate_configs/deepspeed_zero3.yaml examples/scripts/sft_gemma3.py +""" + +from datasets import load_dataset +from transformers import AutoModelForImageTextToText + +from trl import SFTConfig, SFTTrainer + + +def main(): + # Load dataset + train_dataset = load_dataset("open-r1/codeforces-cots", split="train") + train_dataset = train_dataset.remove_columns("prompt") + + # Load model + model_id = "google/gemma-3-12b-it" + model = AutoModelForImageTextToText.from_pretrained(model_id, attn_implementation="eager") + + # Train model + training_args = SFTConfig( + output_dir=f"{model_id}-codeforces-SFT", + bf16=True, + use_liger_kernel=True, + max_length=8192, + per_device_train_batch_size=1, + gradient_accumulation_steps=8, + dataset_num_proc=32, + num_train_epochs=1, + ) + + trainer = SFTTrainer( + args=training_args, + model=model, + train_dataset=train_dataset, + ) + trainer.train() + + # Push to hub + trainer.push_to_hub(dataset_name="open-r1/codeforces-cots") + + +if __name__ == "__main__": + main() diff --git a/tooling/fine-tuning/trl/sft_tiny_aya_tool_calling.py b/tooling/fine-tuning/trl/sft_tiny_aya_tool_calling.py new file mode 100644 index 0000000..7a29be6 --- /dev/null +++ b/tooling/fine-tuning/trl/sft_tiny_aya_tool_calling.py @@ -0,0 +1,164 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl[peft]", +# "bitsandbytes", +# "liger-kernel", +# "trackio", +# ] +# /// + +""" +Teach tool calling to CohereLabs/tiny-aya-global using SFT with QLoRA on the bebechien/SimpleToolCalling dataset. + +The model used in this script does not have native tool-calling support. We extend its existing Jinja2 chat template to +serialize tool schemas into the system preamble and render tool calls as structured XML inside the model's +native <|START_RESPONSE|> / <|END_RESPONSE|> delimiters. The modified template is saved with the tokenizer, so +inference only requires loading the tokenizer from the output directory and calling apply_chat_template with +tools=TOOLS — no manual system-prompt construction needed. + +Example: + + python examples/scripts/sft_tiny_aya_tool_calling.py +""" + +import json +from pathlib import Path + +import torch +from datasets import load_dataset +from peft import LoraConfig +from transformers import AutoModelForCausalLM, BitsAndBytesConfig + +from trl import SFTConfig, SFTTrainer + + +# These are the tool schemas that are used in the dataset +TOOLS = [ + { + "type": "function", + "function": { + "name": "search_knowledge_base", + "description": "Search internal company documents, policies and project data.", + "parameters": { + "type": "object", + "properties": {"query": {"type": "string", "description": "query string"}}, + "required": ["query"], + }, + "return": {"type": "string"}, + }, + }, + { + "type": "function", + "function": { + "name": "search_google", + "description": "Search public information.", + "parameters": { + "type": "object", + "properties": {"query": {"type": "string", "description": "query string"}}, + "required": ["query"], + }, + "return": {"type": "string"}, + }, + }, +] + + +def create_conversation(sample): + return { + "prompt": [{"role": "user", "content": sample["user_content"]}], + "completion": [ + { + "role": "assistant", + "tool_calls": [ + { + "type": "function", + "function": { + "name": sample["tool_name"], + "arguments": json.loads(sample["tool_arguments"]), + }, + } + ], + }, + ], + "tools": TOOLS, + } + + +def main(): + model_id = "CohereLabs/tiny-aya-global" + dataset_name = "bebechien/SimpleToolCalling" + output_dir = "tiny-aya-global-tool-calling-SFT" + + # Load and format dataset + dataset = load_dataset(dataset_name, split="train") + dataset = dataset.map(create_conversation, remove_columns=dataset.features) + dataset = dataset.train_test_split(test_size=0.5, shuffle=True) + + # Load model + model = AutoModelForCausalLM.from_pretrained( + model_id, + attn_implementation="sdpa", + dtype=torch.float16, + quantization_config=BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_compute_dtype=torch.float16, + bnb_4bit_use_double_quant=True, + bnb_4bit_quant_type="nf4", + ), + ) + + # Configure LoRA + peft_config = LoraConfig( + r=32, + lora_alpha=32, + target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], + ) + + # Train + training_args = SFTConfig( + output_dir=output_dir, + per_device_train_batch_size=1, + gradient_accumulation_steps=4, + # Use the tool-aware chat template + chat_template_path=str(Path(__file__).parent / "tiny_aya_chat_template.jinja"), + warmup_steps=5, + learning_rate=2e-4, + optim="paged_adamw_8bit", + logging_steps=1, + report_to="trackio", + trackio_space_id=output_dir, + max_length=1024, + use_liger_kernel=True, + activation_offloading=True, + push_to_hub=True, + ) + + trainer = SFTTrainer( + model=model, + args=training_args, + train_dataset=dataset["train"], + peft_config=peft_config, + ) + trainer.train() + + # Save model and tokenizer (tokenizer carries the updated chat template) + trainer.save_model(output_dir) + trainer.push_to_hub(dataset_name=dataset_name) + + +if __name__ == "__main__": + main() diff --git a/tooling/fine-tuning/trl/sft_vlm.py b/tooling/fine-tuning/trl/sft_vlm.py new file mode 100644 index 0000000..54f9207 --- /dev/null +++ b/tooling/fine-tuning/trl/sft_vlm.py @@ -0,0 +1,117 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl[peft]", +# "Pillow>=9.4.0", +# "trackio", +# "kernels", +# ] +# /// + +""" +pip install pillow + +# Tested on 8x H100 GPUs +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/sft_vlm.py \ + --dataset_name HuggingFaceH4/llava-instruct-mix-vsft \ + --model_name_or_path llava-hf/llava-1.5-7b-hf \ + --gradient_accumulation_steps 8 \ + --output_dir LLaVA-1.5-7B-SFT \ + --dtype bfloat16 + +For LLaVA-NeXT, use: + --model_name_or_path llava-hf/llava-v1.6-mistral-7b-hf + +For meta-llama/Llama-3.2-11B-Vision-Instruct, use: + --model_name_or_path meta-llama/Llama-3.2-11B-Vision-Instruct + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/sft_vlm.py \ + --dataset_name HuggingFaceH4/llava-instruct-mix-vsft \ + --model_name_or_path HuggingFaceTB/SmolVLM-Instruct \ + --per_device_train_batch_size 1 \ + --gradient_accumulation_steps 1 \ + --output_dir SmolVLM-SFT \ + --dtype bfloat16 \ + --use_peft \ + --lora_target_modules down_proj, o_proj, k_proj, q_proj, gate_proj, up_proj, v_proj +""" + +import torch +from datasets import load_dataset +from transformers import AutoModelForImageTextToText + +from trl import ( + ModelConfig, + ScriptArguments, + SFTConfig, + SFTTrainer, + TrlParser, + get_kbit_device_map, + get_peft_config, + get_quantization_config, +) + + +if __name__ == "__main__": + parser = TrlParser((ScriptArguments, SFTConfig, ModelConfig)) + script_args, training_args, model_args = parser.parse_args_and_config() + training_args.max_length = None + + ################ + # Model + ################ + dtype = model_args.dtype if model_args.dtype in ["auto", None] else getattr(torch, model_args.dtype) + model_kwargs = dict( + revision=model_args.model_revision, + attn_implementation=model_args.attn_implementation, + dtype=dtype, + ) + quantization_config = get_quantization_config(model_args) + if quantization_config is not None: + # Passing None would not be treated the same as omitting the argument, so we include it only when valid. + model_kwargs["device_map"] = get_kbit_device_map() + model_kwargs["quantization_config"] = quantization_config + + model = AutoModelForImageTextToText.from_pretrained( + model_args.model_name_or_path, trust_remote_code=model_args.trust_remote_code, **model_kwargs + ) + + ################ + # Dataset + ################ + dataset = load_dataset(script_args.dataset_name, name=script_args.dataset_config) + + ################ + # Training + ################ + trainer = SFTTrainer( + model=model, + args=training_args, + train_dataset=dataset[script_args.dataset_train_split], + eval_dataset=dataset[script_args.dataset_test_split] if training_args.eval_strategy != "no" else None, + peft_config=get_peft_config(model_args), + ) + + trainer.train() + + # Save and push to hub + trainer.save_model(training_args.output_dir) + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) diff --git a/tooling/fine-tuning/trl/sft_vlm_gemma3.py b/tooling/fine-tuning/trl/sft_vlm_gemma3.py new file mode 100644 index 0000000..14a4f99 --- /dev/null +++ b/tooling/fine-tuning/trl/sft_vlm_gemma3.py @@ -0,0 +1,189 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl[peft]", +# "Pillow>=9.4.0", +# "trackio", +# "kernels", +# ] +# /// + +""" +Train Gemma 3 on the HuggingFaceH4/llava-instruct-mix-vsft dataset (single-image). + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/sft_vlm_gemma3.py \ + --dataset_name HuggingFaceH4/llava-instruct-mix-vsft \ + --model_name_or_path google/gemma-3-4b-it \ + --per_device_train_batch_size 1 \ + --output_dir Gemma-3-4B-SFT-MMIU \ + --dtype bfloat16 \ + --use_peft \ + --lora_target_modules all-linear \ + --attn_implementation eager + +Train Gemma 3 on the FanqingM/MMIU-Benchmark dataset (multi-image). + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + examples/scripts/sft_vlm_gemma3.py \ + --dataset_name FanqingM/MMIU-Benchmark \ + --dataset_train_split test \ + --model_name_or_path google/gemma-3-4b-it \ + --per_device_train_batch_size 1 \ + --output_dir Gemma-3-4B-SFT-MMIU \ + --dtype bfloat16 \ + --use_peft \ + --lora_target_modules all-linear \ + --attn_implementation eager +""" + +import io +import os +import zipfile + +import torch +from datasets import DatasetDict, load_dataset +from huggingface_hub import hf_hub_download, list_repo_files +from PIL import Image +from transformers import AutoModelForImageTextToText + +from trl import ( + ModelConfig, + ScriptArguments, + SFTConfig, + SFTTrainer, + TrlParser, + get_kbit_device_map, + get_peft_config, + get_quantization_config, +) + + +# For multi-image example +def process_vision_info(messages: list[dict]) -> list[Image.Image]: + image_inputs = [] + for msg in messages: + content = msg.get("content", []) + if not isinstance(content, list): + content = [content] + + for element in content: + if isinstance(element, dict) and ("image" in element or element.get("type") == "image"): + if "image" in element: + image = element["image"] + else: + image = element + if image is not None: + image = Image.open(io.BytesIO(image["bytes"])) + image_inputs.append(image.convert("RGB")) + return image_inputs + + +def format_data(samples: dict[str, any]) -> dict[str, list]: + formatted_samples = {"messages": []} + for cont in range(len(samples["question"])): + images = [] + for img_path in samples["input_image_path"][cont]: + try: + with open(img_path, "rb") as f: + img_bytes = f.read() + image = Image.open(io.BytesIO(img_bytes)).convert("RGB") + images.append({"type": "image", "image": image}) + except Exception as e: + print(f"Error processing image {img_path}: {e}") + continue + + formatted_samples["messages"].append( + [ + {"role": "system", "content": [{"type": "text", "text": samples["context"][cont]}]}, + {"role": "user", "content": images + [{"type": "text", "text": samples["question"][cont]}]}, + {"role": "assistant", "content": [{"type": "text", "text": samples["output"][cont]}]}, + ] + ) + return formatted_samples + + +# For multi-image example +def prepare_dataset(dataset: DatasetDict, dataset_name: str) -> DatasetDict: + all_files = list_repo_files(dataset_name, repo_type="dataset") + zip_files = [f for f in all_files if f.endswith(".zip")] + + for zip_filename in zip_files: + zip_path = hf_hub_download(repo_id=dataset_name, filename=zip_filename, repo_type="dataset") + extract_folder = zip_filename.replace(".zip", "") + os.makedirs(extract_folder, exist_ok=True) + + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(extract_folder) + + dataset = dataset.map(format_data, batched=True, batch_size=4, num_proc=16) + return dataset + + +def main(): + parser = TrlParser((ScriptArguments, SFTConfig, ModelConfig)) + script_args, training_args, model_args = parser.parse_args_and_config() + training_args.max_length = None + + ################ + # Model + ################ + dtype = model_args.dtype if model_args.dtype in ["auto", None] else getattr(torch, model_args.dtype) + model_kwargs = dict( + revision=model_args.model_revision, + attn_implementation=model_args.attn_implementation, + dtype=dtype, + ) + quantization_config = get_quantization_config(model_args) + if quantization_config is not None: + # Passing None would not be treated the same as omitting the argument, so we include it only when valid. + model_kwargs["device_map"] = get_kbit_device_map() + model_kwargs["quantization_config"] = quantization_config + + model = AutoModelForImageTextToText.from_pretrained( + model_args.model_name_or_path, trust_remote_code=model_args.trust_remote_code, **model_kwargs + ) + + ################ + # Dataset + ################ + dataset = load_dataset(script_args.dataset_name, name=script_args.dataset_config) + if script_args.dataset_name == "FanqingM/MMIU-Benchmark": + dataset = prepare_dataset(dataset, script_args.dataset_name) + + ################ + # Training + ################ + trainer = SFTTrainer( + model=model, + args=training_args, + train_dataset=dataset[script_args.dataset_train_split], + eval_dataset=dataset[script_args.dataset_test_split] if training_args.eval_strategy != "no" else None, + peft_config=get_peft_config(model_args), + ) + + trainer.train() + + # Save and push to hub + trainer.save_model(training_args.output_dir) + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) + + +if __name__ == "__main__": + main() diff --git a/tooling/fine-tuning/trl/trl_scripts_sft.py b/tooling/fine-tuning/trl/trl_scripts_sft.py new file mode 100644 index 0000000..1fb07ac --- /dev/null +++ b/tooling/fine-tuning/trl/trl_scripts_sft.py @@ -0,0 +1,156 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl", +# "peft", +# "trackio", +# "kernels", +# ] +# /// + +""" +# Full training +``` +python trl/scripts/sft.py \ + --model_name_or_path Qwen/Qwen2-0.5B \ + --dataset_name trl-lib/Capybara \ + --learning_rate 2.0e-5 \ + --num_train_epochs 1 \ + --packing \ + --per_device_train_batch_size 2 \ + --gradient_accumulation_steps 8 \ + --eos_token '<|im_end|>' \ + --eval_strategy steps \ + --eval_steps 100 \ + --output_dir Qwen2-0.5B-SFT \ + --push_to_hub +``` + +# LoRA +``` +python trl/scripts/sft.py \ + --model_name_or_path Qwen/Qwen2-0.5B \ + --dataset_name trl-lib/Capybara \ + --learning_rate 2.0e-4 \ + --num_train_epochs 1 \ + --packing \ + --per_device_train_batch_size 2 \ + --gradient_accumulation_steps 8 \ + --eos_token '<|im_end|>' \ + --eval_strategy steps \ + --eval_steps 100 \ + --use_peft \ + --lora_r 32 \ + --lora_alpha 16 \ + --output_dir Qwen2-0.5B-SFT \ + --push_to_hub +``` +""" + +import argparse + + +def main(script_args, training_args, model_args, dataset_args): + from accelerate import logging + from datasets import load_dataset + from transformers import AutoConfig, AutoModelForCausalLM + from transformers.models.auto.modeling_auto import MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES + + from trl import SFTTrainer, get_dataset, get_kbit_device_map, get_peft_config, get_quantization_config + + logger = logging.get_logger(__name__) + + ################ + # Model init kwargs + ################ + model_kwargs = dict( + revision=model_args.model_revision, + trust_remote_code=model_args.trust_remote_code, + attn_implementation=model_args.attn_implementation, + dtype=model_args.dtype, + ) + quantization_config = get_quantization_config(model_args) + if quantization_config is not None: + # Passing None would not be treated the same as omitting the argument, so we include it only when valid. + model_kwargs["device_map"] = get_kbit_device_map() + model_kwargs["quantization_config"] = quantization_config + + # Create model + config = AutoConfig.from_pretrained(model_args.model_name_or_path) + valid_image_text_architectures = MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES.values() + + if config.architectures and any(arch in valid_image_text_architectures for arch in config.architectures): + from transformers import AutoModelForImageTextToText + + model = AutoModelForImageTextToText.from_pretrained(model_args.model_name_or_path, **model_kwargs) + else: + model = AutoModelForCausalLM.from_pretrained(model_args.model_name_or_path, **model_kwargs) + + # Load the dataset + if dataset_args.datasets and script_args.dataset_name: + logger.warning( + "Both `datasets` and `dataset_name` are provided. The `datasets` argument will be used to load the " + "dataset and `dataset_name` will be ignored." + ) + dataset = get_dataset(dataset_args) + elif dataset_args.datasets and not script_args.dataset_name: + dataset = get_dataset(dataset_args) + elif not dataset_args.datasets and script_args.dataset_name: + dataset = load_dataset( + script_args.dataset_name, name=script_args.dataset_config, streaming=script_args.dataset_streaming + ) + else: + raise ValueError("Either `datasets` or `dataset_name` must be provided.") + + # Initialize the SFT trainer + trainer = SFTTrainer( + model=model, + args=training_args, + train_dataset=dataset[script_args.dataset_train_split], + eval_dataset=dataset[script_args.dataset_test_split] if training_args.eval_strategy != "no" else None, + peft_config=get_peft_config(model_args), + ) + + # Train the model + trainer.train() + + # Log training complete + trainer.accelerator.print("✅ Training completed.") + + # Save and push to Hub + trainer.save_model(training_args.output_dir) + trainer.accelerator.print(f"💾 Model saved to {training_args.output_dir}.") + + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) + trainer.accelerator.print(f"🤗 Model pushed to the Hub in https://huggingface.co/{trainer.hub_model_id}.") + + +def make_parser(subparsers: argparse._SubParsersAction | None = None, prog: str | None = None): + from trl import DatasetMixtureConfig, ModelConfig, ScriptArguments, SFTConfig, TrlParser + + dataclass_types = (ScriptArguments, SFTConfig, ModelConfig, DatasetMixtureConfig) + if subparsers is not None: + parser = subparsers.add_parser("sft", help="Run the SFT training script", dataclass_types=dataclass_types) + else: + parser = TrlParser(dataclass_types, prog=prog) + return parser + + +if __name__ == "__main__": + parser = make_parser() + script_args, training_args, model_args, dataset_args = parser.parse_args_and_config(fail_with_unknown_args=False) + main(script_args, training_args, model_args, dataset_args) diff --git a/tooling/fine-tuning/unsloth/docs/unsloth-README.md b/tooling/fine-tuning/unsloth/docs/unsloth-README.md new file mode 100644 index 0000000..7046a2a --- /dev/null +++ b/tooling/fine-tuning/unsloth/docs/unsloth-README.md @@ -0,0 +1,250 @@ +

+ + + + Unsloth logo + +

+

+Run and train AI models with a unified local interface. +

+ +

+ Features • + Quickstart • + Notebooks • + Documentation • + Reddit +

+ +unsloth studio ui homepage + +Unsloth Studio (Beta) lets you run and train text, [audio](https://unsloth.ai/docs/basics/text-to-speech-tts-fine-tuning), [embedding](https://unsloth.ai/docs/new/embedding-finetuning), [vision](https://unsloth.ai/docs/basics/vision-fine-tuning) models on Windows, Linux and macOS. + +## ⭐ Features +Unsloth provides several key features for both inference and training: +### Inference +* **Search + download + run models** including GGUF, LoRA adapters, safetensors +* **Export models**: [Save or export](https://unsloth.ai/docs/new/studio/export) models to GGUF, 16-bit safetensors and other formats. +* **Tool calling**: Support for [self-healing tool calling](https://unsloth.ai/docs/new/studio/chat#auto-healing-tool-calling) and web search +* **[Code execution](https://unsloth.ai/docs/new/studio/chat#code-execution)**: lets LLMs test code in Claude artifacts and sandbox environments +* [Auto-tune inference parameters](https://unsloth.ai/docs/new/studio/chat#auto-parameter-tuning) and customize chat templates. +* We work directly with teams behind [gpt-oss](https://docs.unsloth.ai/new/gpt-oss-how-to-run-and-fine-tune#unsloth-fixes-for-gpt-oss), [Qwen3](https://www.reddit.com/r/LocalLLaMA/comments/1kaodxu/qwen3_unsloth_dynamic_ggufs_128k_context_bug_fixes/), [Llama 4](https://github.com/ggml-org/llama.cpp/pull/12889), [Mistral](models/tutorials/devstral-how-to-run-and-fine-tune.md), [Gemma 1-3](https://news.ycombinator.com/item?id=39671146), and [Phi-4](https://unsloth.ai/blog/phi4), where we’ve fixed bugs that improve model accuracy. +* Upload images, audio, PDFs, code, DOCX and more file types to chat with. +### Training +* Train and RL **500+ models** up to **2x faster** with up to **70% less VRAM**, with no accuracy loss. +* Custom Triton and mathematical **kernels**. See some collabs we did with [PyTorch](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/fp8-reinforcement-learning) and [Hugging Face](https://unsloth.ai/docs/new/faster-moe). +* **Data Recipes**: [Auto-create datasets](https://unsloth.ai/docs/new/studio/data-recipe) from **PDF, CSV, DOCX** etc. Edit data in a visual-node workflow. +* **[Reinforcement Learning](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide)** (RL): The most efficient [RL](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) library, using **80% less VRAM** for GRPO, [FP8](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/fp8-reinforcement-learning) etc. +* Supports full fine-tuning, RL, pretraining, 4-bit, 16-bit and, FP8 training. +* **Observability**: Monitor training live, track loss and GPU usage and customize graphs. +* [Multi-GPU](https://unsloth.ai/docs/basics/multi-gpu-training-with-unsloth) training is supported, with major improvements coming soon. + +## ⚡ Quickstart +Unsloth can be used in two ways: through **[Unsloth Studio](https://unsloth.ai/docs/new/studio/)**, the web UI, or through **Unsloth Core**, the code-based version. Each has different requirements. + +### Unsloth Studio (web UI) +Unsloth Studio (Beta) works on **Windows, Linux, WSL** and **macOS**. + +* **CPU:** Supported for Chat and Data Recipes currently +* **NVIDIA:** Training works on RTX 30/40/50, Blackwell, DGX Spark, Station and more +* **macOS:** Currently supports chat and Data Recipes. **MLX training** is coming very soon +* **AMD:** Chat + Data works. Train with [Unsloth Core](#unsloth-core-code-based). Studio support is out soon. +* **Coming soon:** Training support for Apple MLX, AMD, and Intel. +* **Multi-GPU:** Available now, with a major upgrade on the way + +#### macOS, Linux, WSL: +```bash +curl -fsSL https://unsloth.ai/install.sh | sh +``` +#### Windows: +```powershell +irm https://unsloth.ai/install.ps1 | iex +``` + +#### Launch +```bash +unsloth studio -H 0.0.0.0 -p 8888 +``` + +#### Update +To update, use the same install commands as above. Or run (does not work on Windows): +```bash +unsloth studio update +``` + +#### Docker +Use our [Docker image](https://hub.docker.com/r/unsloth/unsloth) ```unsloth/unsloth``` container. Run: +```bash +docker run -d -e JUPYTER_PASSWORD="mypassword" \ + -p 8888:8888 -p 8000:8000 -p 2222:22 \ + -v $(pwd)/work:/workspace/work \ + --gpus all \ + unsloth/unsloth + ``` + +#### Developer, Nightly, Uninstall +To see developer, nightly and uninstallation etc. instructions, see [advanced installation](#-advanced-installation). + +### Unsloth Core (code-based) +#### Linux, WSL: +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +uv venv unsloth_env --python 3.13 +source unsloth_env/bin/activate +uv pip install unsloth --torch-backend=auto +``` +#### Windows: +```powershell +winget install -e --id Python.Python.3.13 +winget install --id=astral-sh.uv -e +uv venv unsloth_env --python 3.13 +.\unsloth_env\Scripts\activate +uv pip install unsloth --torch-backend=auto +``` +For Windows, `pip install unsloth` works only if you have PyTorch installed. Read our [Windows Guide](https://unsloth.ai/docs/get-started/install/windows-installation). +You can use the same Docker image as Unsloth Studio. + +#### AMD, Intel: +For RTX 50x, B200, 6000 GPUs: `uv pip install unsloth --torch-backend=auto`. Read our guides for: [Blackwell](https://unsloth.ai/docs/blog/fine-tuning-llms-with-blackwell-rtx-50-series-and-unsloth) and [DGX Spark](https://unsloth.ai/docs/blog/fine-tuning-llms-with-nvidia-dgx-spark-and-unsloth).
+To install Unsloth on **AMD** and **Intel** GPUs, follow our [AMD Guide](https://unsloth.ai/docs/get-started/install/amd) and [Intel Guide](https://unsloth.ai/docs/get-started/install/intel). + +## 📒 Free Notebooks + +Train for free with our notebooks. You can use our new [free Unsloth Studio notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) to run and train models for free in a web UI. +Read our [guide](https://unsloth.ai/docs/get-started/fine-tuning-llms-guide). Add dataset, run, then deploy your trained model. + +| Model | Free Notebooks | Performance | Memory use | +|-----------|---------|--------|----------| +| **Gemma 4 (E2B)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma4_(E2B)-Vision.ipynb) | 1.5x faster | 50% less | +| **Qwen3.5 (4B)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_(4B)_Vision.ipynb) | 1.5x faster | 60% less | +| **gpt-oss (20B)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-(20B)-Fine-tuning.ipynb) | 2x faster | 70% less | +| **Qwen3.5 GSPO** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_(4B)_Vision_GRPO.ipynb) | 2x faster | 70% less | +| **gpt-oss (20B): GRPO** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-(20B)-GRPO.ipynb) | 2x faster | 80% less | +| **Qwen3: Advanced GRPO** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_(4B)-GRPO.ipynb) | 2x faster | 70% less | +| **embeddinggemma (300M)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/EmbeddingGemma_(300M).ipynb) | 2x faster | 20% less | +| **Mistral Ministral 3 (3B)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_VL_(3B)_Vision.ipynb) | 1.5x faster | 60% less | +| **Llama 3.1 (8B) Alpaca** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-Alpaca.ipynb) | 2x faster | 70% less | +| **Llama 3.2 Conversational** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(1B_and_3B)-Conversational.ipynb) | 2x faster | 70% less | +| **Orpheus-TTS (3B)** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Orpheus_(3B)-TTS.ipynb) | 1.5x faster | 50% less | + +- See all our notebooks for: [Kaggle](https://github.com/unslothai/notebooks?tab=readme-ov-file#-kaggle-notebooks), [GRPO](https://unsloth.ai/docs/get-started/unsloth-notebooks#grpo-reasoning-rl-notebooks), [TTS](https://unsloth.ai/docs/get-started/unsloth-notebooks#text-to-speech-tts-notebooks), [embedding](https://unsloth.ai/docs/new/embedding-finetuning) & [Vision](https://unsloth.ai/docs/get-started/unsloth-notebooks#vision-multimodal-notebooks) +- See [all our models](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [all our notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks) +- See detailed documentation for Unsloth [here](https://unsloth.ai/docs) + +## 🦥 Unsloth News +- **Gemma 4**: Run and train Google’s new models directly in Unsloth Studio! [Blog](https://unsloth.ai/docs/models/gemma-4) +- **Introducing Unsloth Studio**: our new web UI for running and training LLMs. [Blog](https://unsloth.ai/docs/new/studio) +- **Qwen3.5** - 0.8B, 2B, 4B, 9B, 27B, 35-A3B, 112B-A10B are now supported. [Guide + notebooks](https://unsloth.ai/docs/models/qwen3.5/fine-tune) +- Train **MoE LLMs 12x faster** with 35% less VRAM - DeepSeek, GLM, Qwen and gpt-oss. [Blog](https://unsloth.ai/docs/new/faster-moe) +- **Embedding models**: Unsloth now supports ~1.8-3.3x faster embedding fine-tuning. [Blog](https://unsloth.ai/docs/new/embedding-finetuning) • [Notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks#embedding-models) +- New **7x longer context RL** vs. all other setups, via our new batching algorithms. [Blog](https://unsloth.ai/docs/new/grpo-long-context) +- New RoPE & MLP **Triton Kernels** & **Padding Free + Packing**: 3x faster training & 30% less VRAM. [Blog](https://unsloth.ai/docs/new/3x-faster-training-packing) +- **500K Context**: Training a 20B model with >500K context is now possible on an 80GB GPU. [Blog](https://unsloth.ai/docs/blog/500k-context-length-fine-tuning) +- **FP8 & Vision RL**: You can now do FP8 & VLM GRPO on consumer GPUs. [FP8 Blog](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl) +- **gpt-oss** by OpenAI: Read our [RL blog](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune/gpt-oss-reinforcement-learning), [Flex Attention](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune/long-context-gpt-oss-training) blog and [Guide](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune). + +## 📥 Advanced Installation +The below advanced instructions are for Unsloth Studio. For Unsloth Core advanced installation, [view our docs](https://unsloth.ai/docs/get-started/install/pip-install#advanced-pip-installation). +#### Developer installs: macOS, Linux, WSL: +```bash +git clone https://github.com/unslothai/unsloth +cd unsloth +./install.sh --local +unsloth studio -H 0.0.0.0 -p 8888 +``` +Then to update : +```bash +unsloth studio update +``` + +#### Developer installs: Windows PowerShell: +```powershell +git clone https://github.com/unslothai/unsloth.git +cd unsloth +Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass +.\install.ps1 --local +unsloth studio -H 0.0.0.0 -p 8888 +``` +Then to update : +```bash +unsloth studio update +``` + +#### Nightly: MacOS, Linux, WSL: +```bash +git clone https://github.com/unslothai/unsloth +cd unsloth +git checkout nightly +./install.sh --local +unsloth studio -H 0.0.0.0 -p 8888 +``` +Then to launch every time: +```bash +unsloth studio -H 0.0.0.0 -p 8888 +``` + +#### Nightly: Windows: +Run in Windows Powershell: +```bash +git clone https://github.com/unslothai/unsloth.git +cd unsloth +git checkout nightly +Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass +.\install.ps1 --local +unsloth studio -H 0.0.0.0 -p 8888 +``` +Then to launch every time: +```bash +unsloth studio -H 0.0.0.0 -p 8888 +``` + +#### Uninstall +You can uninstall Unsloth Studio by deleting its install folder usually located under `$HOME/.unsloth/studio` on Mac/Linux/WSL and `%USERPROFILE%\.unsloth\studio` on Windows. Using the `rm -rf` commands will **delete everything**, including your history, cache: + +* ​ **MacOS, WSL, Linux:** `rm -rf ~/.unsloth/studio` +* ​ **Windows (PowerShell):** `Remove-Item -Recurse -Force "$HOME\.unsloth\studio"` + +For more info, [see our docs](https://unsloth.ai/docs/new/studio/install#uninstall). + +#### Deleting model files + +You can delete old model files either from the bin icon in model search or by removing the relevant cached model folder from the default Hugging Face cache directory. By default, HF uses: + +* ​ **MacOS, Linux, WSL:** `~/.cache/huggingface/hub/` +* ​ **Windows:** `%USERPROFILE%\.cache\huggingface\hub\` + +## 💚 Community and Links +| Type | Links | +| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +|   **Discord** | [Join Discord server](https://discord.com/invite/unsloth) | +|   **r/unsloth Reddit** | [Join Reddit community](https://reddit.com/r/unsloth) | +| 📚 **Documentation & Wiki** | [Read Our Docs](https://unsloth.ai/docs) | +|   **Twitter (aka X)** | [Follow us on X](https://twitter.com/unslothai) | +| 🔮 **Our Models** | [Unsloth Catalog](https://unsloth.ai/docs/get-started/unsloth-model-catalog) | +| ✍️ **Blog** | [Read our Blogs](https://unsloth.ai/blog) | + +### Citation + +You can cite the Unsloth repo as follows: +```bibtex +@software{unsloth, + author = {Daniel Han, Michael Han and Unsloth team}, + title = {Unsloth}, + url = {https://github.com/unslothai/unsloth}, + year = {2023} +} +``` +If you trained a model with 🦥Unsloth, you can use this cool sticker!   + +### License +Unsloth uses a dual-licensing model of Apache 2.0 and AGPL-3.0. The core Unsloth package remains licensed under **[Apache 2.0](https://github.com/unslothai/unsloth?tab=Apache-2.0-1-ov-file)**, while certain optional components, such as the Unsloth Studio UI are licensed under the open-source license **[AGPL-3.0](https://github.com/unslothai/unsloth?tab=AGPL-3.0-2-ov-file)**. + +This structure helps support ongoing Unsloth development while keeping the project open source and enabling the broader ecosystem to continue growing. + +### Thank You to +- The [llama.cpp library](https://github.com/ggml-org/llama.cpp) that lets users run and save models with Unsloth +- The Hugging Face team and their libraries: [transformers](https://github.com/huggingface/transformers) and [TRL](https://github.com/huggingface/trl) +- The Pytorch and [Torch AO](https://github.com/unslothai/unsloth/pull/3391) team for their contributions +- NVIDIA for their [NeMo DataDesigner](https://github.com/NVIDIA-NeMo/DataDesigner) library and their contributions +- And of course for every single person who has contributed or has used Unsloth! diff --git a/tooling/fine-tuning/unsloth/kaggle/Gemma4_(31B)-Text.ipynb b/tooling/fine-tuning/unsloth/kaggle/Gemma4_(31B)-Text.ipynb new file mode 100644 index 0000000..6c9865f --- /dev/null +++ b/tooling/fine-tuning/unsloth/kaggle/Gemma4_(31B)-Text.ipynb @@ -0,0 +1,8781 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c19cd9ee", + "metadata": { + "id": "n5NrROnmsJP4", + "papermill": { + "duration": 0.021851, + "end_time": "2026-04-09T14:46:31.545467+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:31.523616+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab A100 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "id": "c5dbe248", + "metadata": { + "id": "jjzmSqm7sJP4", + "papermill": { + "duration": 0.018413, + "end_time": "2026-04-09T14:46:31.583432+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:31.565019+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "id": "0cad8cc5", + "metadata": { + "id": "WDatJHaBsJP5", + "papermill": { + "duration": 0.018268, + "end_time": "2026-04-09T14:46:31.620424+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:31.602156+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "id": "acd0984d", + "metadata": { + "id": "9TnXzZYMsJP5", + "papermill": { + "duration": 0.018422, + "end_time": "2026-04-09T14:46:31.657445+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:31.639023+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cf52976a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:46:31.696042Z", + "iopub.status.busy": "2026-04-09T14:46:31.695595Z", + "iopub.status.idle": "2026-04-09T14:46:36.809838Z", + "shell.execute_reply": "2026-04-09T14:46:36.808831Z" + }, + "id": "B2T3Z8F2sJP5", + "papermill": { + "duration": 5.1357, + "end_time": "2026-04-09T14:46:36.811554+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:31.675854+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "%%capture\n", + "try: import numpy, PIL; _numpy = f\"numpy=={numpy.__version__}\"; _pil = f\"pillow=={PIL.__version__}\"\n", + "except: _numpy = \"numpy\"; _pil = \"pillow\"\n", + "!uv pip install -qqq \\\n", + " \"torch>=2.8.0\" \"triton>=3.4.0\" {_numpy} {_pil} torchvision bitsandbytes \\\n", + " unsloth \"unsloth_zoo>=2026.4.6\" transformers==5.5.0 torchcodec timm" + ] + }, + { + "cell_type": "markdown", + "id": "77bdc102", + "metadata": { + "id": "TGMWlrRdzwgf", + "papermill": { + "duration": 0.018575, + "end_time": "2026-04-09T14:46:36.849477+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:36.830902+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1c116df3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:46:36.887792Z", + "iopub.status.busy": "2026-04-09T14:46:36.887484Z", + "iopub.status.idle": "2026-04-09T14:56:32.181348Z", + "shell.execute_reply": "2026-04-09T14:56:32.180581Z" + }, + "id": "-Xbb0cuLzwgf", + "outputId": "3d9968a4-cb68-4112-aa41-29a78c0c8ae0", + "papermill": { + "duration": 595.315071, + "end_time": "2026-04-09T14:56:32.183208+00:00", + "exception": false, + "start_time": "2026-04-09T14:46:36.868137+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 2. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9979852f7f1e4abfaab19c8fe7df76bf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors.index.json: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "000e4832d81f42fd81d516e06acf2981", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading (incomplete total...): 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c3e50bf8e254e9e9f5b14e4bc314c03", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 2 files: 0%| | 0/2 [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3a992f62", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:56:32.361453Z", + "iopub.status.busy": "2026-04-09T14:56:32.360986Z", + "iopub.status.idle": "2026-04-09T14:59:10.830340Z", + "shell.execute_reply": "2026-04-09T14:59:10.829715Z" + }, + "id": "9jGeSb9bWe0k", + "outputId": "e95da582-2668-4936-9aec-3ffdde2bb771", + "papermill": { + "duration": 158.492174, + "end_time": "2026-04-09T14:59:10.832047+00:00", + "exception": false, + "start_time": "2026-04-09T14:56:32.339873+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The animal in the image is a sloth. Sloths have appeared in several popular films, most notably:\n", + "\n", + "* **Zootopia (2016):** Featuring the character Flash, a slow-moving sloth who works at the Department of Mammal Vehicles.\n", + "* **Ice Age (2002):** Featuring Sid, a ground sloth who is one of the main protagonists of the series.\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "id": "0a1450eb", + "metadata": { + "id": "eh0BzbZPWtRD", + "papermill": { + "duration": 0.021884, + "end_time": "2026-04-09T14:59:10.878105+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:10.856221+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a72ce8c6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:59:10.923282Z", + "iopub.status.busy": "2026-04-09T14:59:10.923007Z", + "iopub.status.idle": "2026-04-09T14:59:48.128345Z", + "shell.execute_reply": "2026-04-09T14:59:48.127693Z" + }, + "id": "R3ExuK8cWuT3", + "outputId": "3a0a6496-79ef-4921-8dd5-96ba5ba77fc9", + "papermill": { + "duration": 37.229725, + "end_time": "2026-04-09T14:59:48.129962+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:10.900237+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In the emerald heart of the canopy high,\n", + "Where the orchids bloom and the parrots fly,\n", + "Dwells a gentle soul in a velvet coat,\n", + "In a slow-motion world, a drifting boat.\n", + "\n", + "With curved, steady claws and a sleepy gaze,\n", + "He wanders through gold-dappled, humid haze.\n", + "No rush for the fruit, no race for the prize,\n", + "Just the soft, steady blink of heavy-lidded eyes.\n", + "\n", + "He is the master of the patient art,\n", + "With a rhythmic beat in a quiet heart.\n", + "While the monkeys chatter and the jaguars leap,\n", + "The sloth\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "id": "e77fbff4", + "metadata": { + "id": "Bw5XPyYFajyM", + "papermill": { + "duration": 0.025126, + "end_time": "2026-04-09T14:59:48.181360+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:48.156234+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "id": "acb794c4", + "metadata": { + "id": "SXd9bTZd1aaL", + "papermill": { + "duration": 0.025143, + "end_time": "2026-04-09T14:59:48.231346+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:48.206203+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6fd5b894", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:59:48.282613Z", + "iopub.status.busy": "2026-04-09T14:59:48.282332Z", + "iopub.status.idle": "2026-04-09T14:59:57.633319Z", + "shell.execute_reply": "2026-04-09T14:59:57.632673Z" + }, + "id": "6bZsfBuZDeCL", + "papermill": { + "duration": 9.379235, + "end_time": "2026-04-09T14:59:57.635217+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:48.255982+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5dc4ec82", + "metadata": { + "id": "vITh0KVJ10qX", + "papermill": { + "duration": 0.024706, + "end_time": "2026-04-09T14:59:57.686384+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:57.661678+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4fc98513", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:59:57.737313Z", + "iopub.status.busy": "2026-04-09T14:59:57.737037Z", + "iopub.status.idle": "2026-04-09T14:59:57.741858Z", + "shell.execute_reply": "2026-04-09T14:59:57.741196Z" + }, + "id": "LjY75GoYUCB8", + "papermill": { + "duration": 0.032282, + "end_time": "2026-04-09T14:59:57.743246+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:57.710964+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "63328983", + "metadata": { + "id": "ZQkXuGYxbJ-e", + "papermill": { + "duration": 0.024742, + "end_time": "2026-04-09T14:59:57.793028+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:57.768286+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8e94eaa0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:59:57.844051Z", + "iopub.status.busy": "2026-04-09T14:59:57.843793Z", + "iopub.status.idle": "2026-04-09T15:00:01.697881Z", + "shell.execute_reply": "2026-04-09T15:00:01.696967Z" + }, + "id": "Mkq4RvEq7FQr", + "outputId": "43449058-686e-430f-c009-c3e795af23ac", + "papermill": { + "duration": 3.881705, + "end_time": "2026-04-09T15:00:01.699372+00:00", + "exception": false, + "start_time": "2026-04-09T14:59:57.817667+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "60adcfaac9cc483284f4cdc1cead9de4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5cc67ac7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:03.355512Z", + "iopub.status.busy": "2026-04-09T15:00:03.354667Z", + "iopub.status.idle": "2026-04-09T15:00:07.915139Z", + "shell.execute_reply": "2026-04-09T15:00:07.914463Z" + }, + "id": "1ahE8Ys37JDJ", + "outputId": "11a09b9e-9fab-45cc-aef4-81b027ebc64b", + "papermill": { + "duration": 4.589949, + "end_time": "2026-04-09T15:00:07.916517+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:03.326568+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c9cb90312b97442bb895e73d6329c5df", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "id": "bfb67b68", + "metadata": { + "id": "ndDUB23CGAC5", + "papermill": { + "duration": 0.025205, + "end_time": "2026-04-09T15:00:07.968708+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:07.943503+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "54b06431", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:08.021699Z", + "iopub.status.busy": "2026-04-09T15:00:08.021002Z", + "iopub.status.idle": "2026-04-09T15:00:08.026602Z", + "shell.execute_reply": "2026-04-09T15:00:08.025687Z" + }, + "id": "gGFzmplrEy9I", + "outputId": "7d50b4dc-d3ff-49fd-dba6-7511ee9c7c07", + "papermill": { + "duration": 0.034027, + "end_time": "2026-04-09T15:00:08.028170+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:07.994143+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "id": "c7255ddf", + "metadata": { + "id": "idAEIeSQ3xdS", + "papermill": { + "duration": 0.025334, + "end_time": "2026-04-09T15:00:08.080059+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:08.054725+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "124b95e5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:08.132853Z", + "iopub.status.busy": "2026-04-09T15:00:08.132156Z", + "iopub.status.idle": "2026-04-09T15:00:52.584313Z", + "shell.execute_reply": "2026-04-09T15:00:52.583576Z" + }, + "id": "95_Nn-89DhsL", + "outputId": "369cc7d6-dfd2-4e4a-c117-495ffd50d06d", + "papermill": { + "duration": 44.480351, + "end_time": "2026-04-09T15:00:52.586015+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:08.105664+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a1beb7697e21449a90a6dfdb59e2eb63", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=8): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "992d039a", + "metadata": { + "id": "Dv1NBUozV78l", + "papermill": { + "duration": 0.027396, + "end_time": "2026-04-09T15:00:57.191777+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.164381+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ab585e6a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:57.245666Z", + "iopub.status.busy": "2026-04-09T15:00:57.245320Z", + "iopub.status.idle": "2026-04-09T15:00:57.252022Z", + "shell.execute_reply": "2026-04-09T15:00:57.251352Z" + }, + "id": "LtsMVtlkUhja", + "outputId": "68552bcc-1c20-48e9-8a78-505dced229c9", + "papermill": { + "duration": 0.035425, + "end_time": "2026-04-09T15:00:57.253447+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.218022+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "id": "2cbf36da", + "metadata": { + "id": "4Kyjy__m9KY3", + "papermill": { + "duration": 0.025784, + "end_time": "2026-04-09T15:00:57.306088+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.280304+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "989de0a0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:57.359466Z", + "iopub.status.busy": "2026-04-09T15:00:57.358849Z", + "iopub.status.idle": "2026-04-09T15:00:57.364903Z", + "shell.execute_reply": "2026-04-09T15:00:57.364262Z" + }, + "id": "_rD6fl8EUxnG", + "outputId": "b44c5e2f-068f-4a31-a31e-34ed10678a6d", + "papermill": { + "duration": 0.034134, + "end_time": "2026-04-09T15:00:57.366221+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.332087+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' <|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "05fd3572", + "metadata": { + "cellView": "form", + "execution": { + "iopub.execute_input": "2026-04-09T15:00:57.420509Z", + "iopub.status.busy": "2026-04-09T15:00:57.419810Z", + "iopub.status.idle": "2026-04-09T15:00:57.425475Z", + "shell.execute_reply": "2026-04-09T15:00:57.424748Z" + }, + "id": "2ejIt2xSNKKp", + "outputId": "7a278f07-915e-44b9-d018-c342eb3d9256", + "papermill": { + "duration": 0.034909, + "end_time": "2026-04-09T15:00:57.427558+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.392649+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "8.258 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "id": "8927128e", + "metadata": { + "id": "CNP1Uidk9mrz", + "papermill": { + "duration": 0.028863, + "end_time": "2026-04-09T15:00:57.486133+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.457270+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "8bbfadef", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:00:57.545312Z", + "iopub.status.busy": "2026-04-09T15:00:57.544669Z", + "iopub.status.idle": "2026-04-09T15:45:32.096909Z", + "shell.execute_reply": "2026-04-09T15:45:32.095920Z" + }, + "id": "yqxqAZ7KJ4oL", + "outputId": "bed52b39-9792-4141-e4aa-3a7f8e3e6d49", + "papermill": { + "duration": 2674.583964, + "end_time": "2026-04-09T15:45:32.098942+00:00", + "exception": false, + "start_time": "2026-04-09T15:00:57.514978+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 2\n", + " \\\\ /| Num examples = 3,000 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 61,214,720 of 31,334,301,232 (0.20% trained)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 40:27, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
12.129590
20.628091
30.911727
41.568517
51.258429
60.759183
70.853166
80.742576
91.026424
101.295154
111.213621
120.669095
130.747510
141.042578
150.837716
160.966854
171.068619
181.088091
191.109440
200.957984
210.633893
221.168129
230.992129
240.891402
250.573305
260.488871
270.609662
280.634687
290.555076
300.802394
310.726872
320.673458
331.081852
340.485952
350.927314
360.931723
370.678981
380.992566
390.968166
400.671915
410.837725
420.872944
430.632054
440.529681
450.553375
461.237677
470.634191
480.646122
490.912598
501.033742
510.518066
520.603996
530.598058
540.576573
550.776600
560.912896
570.451140
580.760951
590.855676
600.749862

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3947b6c8", + "metadata": { + "cellView": "form", + "execution": { + "iopub.execute_input": "2026-04-09T15:45:32.155807Z", + "iopub.status.busy": "2026-04-09T15:45:32.155341Z", + "iopub.status.idle": "2026-04-09T15:45:32.162079Z", + "shell.execute_reply": "2026-04-09T15:45:32.161176Z" + }, + "id": "pCqnaKmlO1U9", + "outputId": "881756ba-9573-4a68-ec6e-14e4cf325d93", + "papermill": { + "duration": 0.036173, + "end_time": "2026-04-09T15:45:32.163732+00:00", + "exception": false, + "start_time": "2026-04-09T15:45:32.127559+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2668.3194 seconds used for training.\n", + "44.47 minutes used for training.\n", + "Peak reserved memory = 10.949 GB.\n", + "Peak reserved memory for training = 2.691 GB.\n", + "Peak reserved memory % of max memory = 75.184 %.\n", + "Peak reserved memory for training % of max memory = 18.478 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "id": "b53d19a6", + "metadata": { + "id": "ekOmTR1hSNcr", + "papermill": { + "duration": 0.026517, + "end_time": "2026-04-09T15:45:32.218053+00:00", + "exception": false, + "start_time": "2026-04-09T15:45:32.191536+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "d13acec7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:45:32.273858Z", + "iopub.status.busy": "2026-04-09T15:45:32.272928Z", + "iopub.status.idle": "2026-04-09T15:47:52.202477Z", + "shell.execute_reply": "2026-04-09T15:47:52.201712Z" + }, + "id": "kR3gIAX-SM2q", + "outputId": "cdfa1bd8-62cd-4355-cd4a-1026a16807ea", + "papermill": { + "duration": 139.987318, + "end_time": "2026-04-09T15:47:52.232546+00:00", + "exception": false, + "start_time": "2026-04-09T15:45:32.245228+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\n<|channel>thought\\n13']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = prepare_gemma_4_inputs(messages)\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "id": "0e5235a5", + "metadata": { + "id": "CrSvZObor0lY", + "papermill": { + "duration": 0.026931, + "end_time": "2026-04-09T15:47:52.286412+00:00", + "exception": false, + "start_time": "2026-04-09T15:47:52.259481+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d145525c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:47:52.342005Z", + "iopub.status.busy": "2026-04-09T15:47:52.341337Z", + "iopub.status.idle": "2026-04-09T15:48:17.844338Z", + "shell.execute_reply": "2026-04-09T15:48:17.843706Z" + }, + "id": "e2pEuRb1r2Vg", + "outputId": "4c132d52-60a3-4024-8500-3a779f3dc9d3", + "papermill": { + "duration": 25.53225, + "end_time": "2026-04-09T15:48:17.845774+00:00", + "exception": false, + "start_time": "2026-04-09T15:47:52.313524+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<|channel>thought\n", + "The short answer is a phenomenon called **Rayleigh scattering**.\n", + "\n", + "Here is the step-by-step breakdown of why it happens:\n", + "\n", + "### 1. Sunlight is a spectrum of colors\n", + "Although sunlight looks white, it is actually made up of all the colors of the rainbow (red, orange\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = prepare_gemma_4_inputs(messages)\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "81ad9893", + "metadata": { + "id": "uMuVrWbjAzhc", + "papermill": { + "duration": 0.029207, + "end_time": "2026-04-09T15:48:17.904807+00:00", + "exception": false, + "start_time": "2026-04-09T15:48:17.875600+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d62d52f4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:48:17.963190Z", + "iopub.status.busy": "2026-04-09T15:48:17.962913Z", + "iopub.status.idle": "2026-04-09T15:48:21.490170Z", + "shell.execute_reply": "2026-04-09T15:48:21.489520Z" + }, + "id": "upcOlWe7A1vc", + "outputId": "f2c735b5-ddc0-4664-a256-72143545e918", + "papermill": { + "duration": 3.558637, + "end_time": "2026-04-09T15:48:21.491692+00:00", + "exception": false, + "start_time": "2026-04-09T15:48:17.933055+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "id": "c2603e60", + "metadata": { + "id": "AEEcJ4qfC7Lp", + "papermill": { + "duration": 0.029644, + "end_time": "2026-04-09T15:48:21.625446+00:00", + "exception": false, + "start_time": "2026-04-09T15:48:21.595802+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "f2cb4825", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:48:21.685738Z", + "iopub.status.busy": "2026-04-09T15:48:21.685047Z", + "iopub.status.idle": "2026-04-09T15:49:12.173570Z", + "shell.execute_reply": "2026-04-09T15:49:12.172820Z" + }, + "id": "MKX_XKs_BNZR", + "outputId": "b12693a9-bca7-4e37-e9d4-1ceeed5b6907", + "papermill": { + "duration": 50.519795, + "end_time": "2026-04-09T15:49:12.175128+00:00", + "exception": false, + "start_time": "2026-04-09T15:48:21.655333+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<|channel>thought\n", + "As of my current knowledge, **there is no official \"Gemma-4\" model released by Google.**\n", + "\n", + "The current state of the Gemma family (Google's open-weights model series) is as follows:\n", + "\n", + "1. **Gemma (v1):** The initial release of open-weights models based on the same technology as Gemini.\n", + "2. **Gemma 2:** The second generation, which introduced a different architecture (including sliding window attention and logit soft-capping) and offered significantly improved performance, particularly in the 9B and 27B parameter sizes.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = prepare_gemma_4_inputs(messages)\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "bb8349cb", + "metadata": { + "id": "f422JgM9sdVT", + "papermill": { + "duration": 0.031637, + "end_time": "2026-04-09T15:49:12.239235+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.207598+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "10b57d3a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:49:12.302340Z", + "iopub.status.busy": "2026-04-09T15:49:12.301943Z", + "iopub.status.idle": "2026-04-09T15:49:12.305586Z", + "shell.execute_reply": "2026-04-09T15:49:12.304927Z" + }, + "id": "iHjt_SMYsd3P", + "papermill": { + "duration": 0.036802, + "end_time": "2026-04-09T15:49:12.307072+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.270270+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "id": "a0acca1d", + "metadata": { + "id": "z6O48DbNIAr0", + "papermill": { + "duration": 0.030509, + "end_time": "2026-04-09T15:49:12.370071+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.339562+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "bca9bebf", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:49:12.433167Z", + "iopub.status.busy": "2026-04-09T15:49:12.432708Z", + "iopub.status.idle": "2026-04-09T15:49:12.436285Z", + "shell.execute_reply": "2026-04-09T15:49:12.435702Z" + }, + "id": "ZV-CiKPrIFG0", + "papermill": { + "duration": 0.036759, + "end_time": "2026-04-09T15:49:12.437534+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.400775+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "4054eea7", + "metadata": { + "id": "TCv4vXHd61i7", + "papermill": { + "duration": 0.031055, + "end_time": "2026-04-09T15:49:12.500516+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.469461+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "e762204f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:49:12.566397Z", + "iopub.status.busy": "2026-04-09T15:49:12.565692Z", + "iopub.status.idle": "2026-04-09T15:49:12.569767Z", + "shell.execute_reply": "2026-04-09T15:49:12.568969Z" + }, + "id": "FqfebeAdT073", + "papermill": { + "duration": 0.037988, + "end_time": "2026-04-09T15:49:12.571165+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.533177+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "b216983e", + "metadata": { + "id": "Q974YEVPI7JS", + "papermill": { + "duration": 0.031342, + "end_time": "2026-04-09T15:49:12.634542+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.603200+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "26217777", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T15:49:12.699012Z", + "iopub.status.busy": "2026-04-09T15:49:12.698323Z", + "iopub.status.idle": "2026-04-09T15:49:12.702407Z", + "shell.execute_reply": "2026-04-09T15:49:12.701764Z" + }, + "id": "ZgcJIhJ0I_es", + "papermill": { + "duration": 0.038027, + "end_time": "2026-04-09T15:49:12.703918+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.665891+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "6d9d4e67", + "metadata": { + "id": "pnz9QOYTMvbH", + "papermill": { + "duration": 0.031057, + "end_time": "2026-04-09T15:49:12.766911+00:00", + "exception": false, + "start_time": "2026-04-09T15:49:12.735854+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "provenance": [] + }, + "kaggle": { + "accelerator": "nvidiaTeslaT4", + "dataSources": [ + { + "databundleVersionId": 16421787, + "sourceId": 134561, + "sourceType": "competition" + } + ], + "dockerImageVersionId": 31329, + "isGpuEnabled": true, + "isInternetEnabled": true, + "language": "python", + "sourceType": "notebook" + }, + "kernelspec": { + "display_name": "Python 3", + "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.12.12" + }, + "papermill": { + "default_parameters": {}, + "duration": 3769.199235, + "end_time": "2026-04-09T15:49:17.022422+00:00", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2026-04-09T14:46:27.823187+00:00", + "version": "2.7.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "000e4832d81f42fd81d516e06acf2981": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e24c7d620b6e4a0ba3ab31434fe4e2d1", + "IPY_MODEL_b99c3f0ccfcf4ede995ed99c0aaa94c9", + "IPY_MODEL_ef6189642fa34589b561a49d9e3df4b6" + ], + "layout": "IPY_MODEL_f5839673c4a649b6b3c7c767039e9659", + "tabbable": null, + "tooltip": null + } + }, + "00719cd6018c4f90bf566c624cca0e54": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "0093ad16714942fda671c8bdee823523": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0161b70d1f0a48fa9031f7e5fdb82d58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "03cf201e1dbd4f6c9ad0674ca5de0c0c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_0093ad16714942fda671c8bdee823523", + "placeholder": "​", + "style": "IPY_MODEL_f70e4406ca49447eae7f96ac39943f75", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:39<00:00, 81.93 examples/s]" + } + }, + "041bd7a313a24b09a69e1e74826989cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "07e2931fb3e1481eba7aefd3b760f469": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "083343851c584e7ca75b16a5d0b81242": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "083d2f2c9cf9465196c7784ffce47835": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_8fab7a6fb3694c18b32db45b8b7ea5c9", + "max": 1188.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_4b021943c5cc4543b0c5ab214d66082c", + "tabbable": null, + "tooltip": null, + "value": 1188.0 + } + }, + "08768bf98c184de38f72d472491bdde8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_7ce39791cdd24f2da44cddc865955e8b", + "placeholder": "​", + "style": "IPY_MODEL_13e9ad27dd974667a2abe655c19e9b5c", + "tabbable": null, + "tooltip": null, + "value": "chat_template.jinja: " + } + }, + "0db0737c77484f879d3784926cf91535": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ca44c1033c9d4081836bc565c16afaaf", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_cb1f3e709d8f448aa1dfc26acad5f183", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "0e9b584a9a834bbd94b2ce845711fc7e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "0f898b29b5aa41a1828bf2fcdb3e2549": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0fca689ef23844d9833927002b847724": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_88a12d9d1ba64562ba8fd4407cfe9a54", + "placeholder": "​", + "style": "IPY_MODEL_dd3eb04ec7fe48bb86aae0b6dcf21b21", + "tabbable": null, + "tooltip": null, + "value": "Computing checksums: 100%" + } + }, + "1191f87c5f084eed9738933497f740bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_932af61e0f874cc5b7ab0a3d338955f3", + "IPY_MODEL_083d2f2c9cf9465196c7784ffce47835", + "IPY_MODEL_5391e4607cf34c399f9d7d78a8bb4573" + ], + "layout": "IPY_MODEL_32b45a03d5ec46afb7e79b9892c390aa", + "tabbable": null, + "tooltip": null + } + }, + "119c448203264670ae619d5f195e32e1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "12342c4995124f3a93862b18a561172e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "12d481c5c4b448599ad0664fa4d8c186": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_0f898b29b5aa41a1828bf2fcdb3e2549", + "placeholder": "​", + "style": "IPY_MODEL_dcaed7f2f42c4c3590de018062a11cd2", + "tabbable": null, + "tooltip": null, + "value": " 100000/100000 [00:00<00:00, 130505.14 examples/s]" + } + }, + "13e9ad27dd974667a2abe655c19e9b5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "148aff2ee3d849f195ead7bd3005417f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_4645b8bd0b0045fe8bb42cb9b3d388ba", + "placeholder": "​", + "style": "IPY_MODEL_23a92666f0194eb4a35f2d483b694044", + "tabbable": null, + "tooltip": null, + "value": " 1.69k/? [00:00<00:00, 122kB/s]" + } + }, + "15dd2b3c856b48028061df9393e5933e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "179efa0635584d8da037e7dc31357c0b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d83b55de7f2546b79ab355c0c5a3f425", + "IPY_MODEL_7cb6e843c9464063bedb75c790dac142", + "IPY_MODEL_3ad354a593364689bfd9e7fc57c3acb3" + ], + "layout": "IPY_MODEL_07e2931fb3e1481eba7aefd3b760f469", + "tabbable": null, + "tooltip": null + } + }, + "1bf4a66851d74ab9aa8b1ac1e6b6077e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1d5d11772e854845b3da2ba42f8b31f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1dbbcbb641d0457da9a617d7c5e66c60": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1e5fc2fd6913484f9f5d9201087a450e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "207687f8a8584c839b231cc20da58659": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2196782266904e68be8a32ac0d6a0f53": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "2369db8f54c043d58b7b5934dd21ee02": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "23a92666f0194eb4a35f2d483b694044": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "24b7aeb3de9347428e4b5d7227e808de": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "24d2ca473bf34698a66c6a9764adf4b8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a224a8553c0e47cfa4fed1344bd1b7d6", + "placeholder": "​", + "style": "IPY_MODEL_b4fb8951c7804c279a7926b2c13edd59", + "tabbable": null, + "tooltip": null, + "value": "Fetching 2 files: 100%" + } + }, + "2736f1e3555446169cd2706f4a491421": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_37622ad056924c6f8f89e0262cab2b97", + "placeholder": "​", + "style": "IPY_MODEL_083343851c584e7ca75b16a5d0b81242", + "tabbable": null, + "tooltip": null, + "value": " 120k/? [00:00<00:00, 9.24MB/s]" + } + }, + "2760d298c9df414ab4137112bf32d8fd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "27a8a12da1034702a64ccedb2981c575": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f3ed4f1b125c4432b1cdd671930bfe5f", + "IPY_MODEL_53ee2477910b4b0eb151202487804a2b", + "IPY_MODEL_ca6c999e4b8a47509d70d5fdbf3c295e" + ], + "layout": "IPY_MODEL_d47270348cd34660947ff133088379de", + "tabbable": null, + "tooltip": null + } + }, + "2bd6c2a05f83417eb8f881f3de8d5eb4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d18e2632f27e49239a678db16247a2e9", + "max": 100000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_6946150c001a4d0aa1850c2bee69c0b0", + "tabbable": null, + "tooltip": null, + "value": 100000.0 + } + }, + "2ccf61cc2c69496f9726cbe6e95b9d8b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d391081595c436991ad4a7e02e6d536": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d9557aa49434ff3a772a05a66fffc40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2f341cf202db4feeac7652903288201d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "30f5c6c6cb044296b80f43162e68d94b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_84fbd41a3ce244c5b73af0f08d747c1c", + "placeholder": "​", + "style": "IPY_MODEL_d51a571b1c424eff8ce17a56255d7891", + "tabbable": null, + "tooltip": null, + "value": "tokenizer_config.json: " + } + }, + "31df175d9a6e4aeeb2ebcf545fba09a8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_8832d1cdbca64c74a38a5d6045ba0e18", + "placeholder": "​", + "style": "IPY_MODEL_0161b70d1f0a48fa9031f7e5fdb82d58", + "tabbable": null, + "tooltip": null, + "value": "Map (num_proc=8): 100%" + } + }, + "32b45a03d5ec46afb7e79b9892c390aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "363e1e28799d444aa8002941426bd8c3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "37622ad056924c6f8f89e0262cab2b97": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "38b7b0a0accc43f9be79506f3aa10940": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_95166084fce04f168194727aa818c0d4", + "placeholder": "​", + "style": "IPY_MODEL_d7eb5dc7004941c1b02f1d433f6d8ffc", + "tabbable": null, + "tooltip": null, + "value": " 2/2 [04:12<00:00, 252.67s/it]" + } + }, + "38f9cb5906f3454ea3e53f7424a51159": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_2369db8f54c043d58b7b5934dd21ee02", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_7f805ff9f8b64e40a6f4c1100ca539b2", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "3a654aaa88874576922d2ead1ba12d33": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3ad354a593364689bfd9e7fc57c3acb3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_5aedaac067804ed89a5def5319f4a4cd", + "placeholder": "​", + "style": "IPY_MODEL_abd94ffbb5c7432c8d2df6ea6bd591c7", + "tabbable": null, + "tooltip": null, + "value": " 208/208 [00:00<00:00, 22.5kB/s]" + } + }, + "3bb6d52047824c80a2656d5e2e5974b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "3bce8516d41e4055932a098594b5647c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3c3e50bf8e254e9e9f5b14e4bc314c03": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_24d2ca473bf34698a66c6a9764adf4b8", + "IPY_MODEL_bc59cc9cb6164af49f6250adcfcc6f36", + "IPY_MODEL_38b7b0a0accc43f9be79506f3aa10940" + ], + "layout": "IPY_MODEL_a38ac0a167fe4278b7360df5ef18cc06", + "tabbable": null, + "tooltip": null + } + }, + "3d0f2fec3da64771b9a714c34882a99e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3f76bba3dafe47c4b2bf3e3739a7eea4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "40f6fcdae0c74d06ad9060c54adaa8af": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4185e1da42694d0a855bcdafe4bd51d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e6bdb5db84ff46979adb6f9521205a0a", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_873fd6a2d5f440a0b0311ad2754b1218", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "42749654c90f4282babf172607a4e202": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "440f09af00f3435aaa266dc8fafa02e4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e591ddfdc2454d1286ff320af25a3f8b", + "placeholder": "​", + "style": "IPY_MODEL_7de54c30e0d54241b5824bc96b7c14ed", + "tabbable": null, + "tooltip": null, + "value": " 982/982 [00:00<00:00, 98.6kB/s]" + } + }, + "45b0d3dba1324d9f86abb361dd5a498d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "4645b8bd0b0045fe8bb42cb9b3d388ba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4735eeafdac74876a36ef26696967673": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "49a12fc2587747b28bdd4547a1153f4d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4a79f9108d514ff5a3728c8915c4accc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_de7a1f2d9ad4452188d88bb2890ff55d", + "placeholder": "​", + "style": "IPY_MODEL_12342c4995124f3a93862b18a561172e", + "tabbable": null, + "tooltip": null, + "value": " 12.0k/? [00:00<00:00, 1.30MB/s]" + } + }, + "4b021943c5cc4543b0c5ab214d66082c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4b1c3a1c826746ff9b8f8575047254ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_4e1dc4ae3c4c43e79c1daccb1cfe2c4f", + "placeholder": "​", + "style": "IPY_MODEL_00719cd6018c4f90bf566c624cca0e54", + "tabbable": null, + "tooltip": null, + "value": "model.safetensors.index.json: " + } + }, + "4bb5c79cbf3145b5884dcf19f10252e7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "4bfcde758855484bbcb2247d8f11ddcb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_de3c8be3b41348139129ec7411317470", + "IPY_MODEL_0db0737c77484f879d3784926cf91535", + "IPY_MODEL_b5e0b331842c4d048b89f99de909316f" + ], + "layout": "IPY_MODEL_c63b5c9009dd4ab387283824f660adca", + "tabbable": null, + "tooltip": null + } + }, + "4e1dc4ae3c4c43e79c1daccb1cfe2c4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4e1f4a63a3c0486d8d42c145004ce665": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "50231bc20fa74317819198329e62097d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "530a4830fa7243ff9d98f7e523221f3b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5391e4607cf34c399f9d7d78a8bb4573": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_65db81818b584084984a73f98f32f980", + "placeholder": "​", + "style": "IPY_MODEL_bf75830bd2f74e5091f7cdc50247c26a", + "tabbable": null, + "tooltip": null, + "value": " 1188/1188 [04:14<00:00, 25.34it/s]" + } + }, + "53b9fef768494db092dc06ebf11118cf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_08768bf98c184de38f72d472491bdde8", + "IPY_MODEL_ad392e4f7e294c48a576d7b613ac74b4", + "IPY_MODEL_4a79f9108d514ff5a3728c8915c4accc" + ], + "layout": "IPY_MODEL_b69eb0115bf44847afc9b12957f68f13", + "tabbable": null, + "tooltip": null + } + }, + "53ee2477910b4b0eb151202487804a2b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_f2e8c6e590a24ac28df404cc43bef213", + "max": 116531415.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_42749654c90f4282babf172607a4e202", + "tabbable": null, + "tooltip": null, + "value": 116531415.0 + } + }, + "56196278224341fda521ab23c67352ef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7a0dc5bd17c2407ea68c09c51aaaea05", + "IPY_MODEL_5973d02b637648b08588c56afe5698d0", + "IPY_MODEL_148aff2ee3d849f195ead7bd3005417f" + ], + "layout": "IPY_MODEL_5c5d3a0061d24907be28581eabb02cd5", + "tabbable": null, + "tooltip": null + } + }, + "586423c6f5c24604930622f7d9c41c01": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0fca689ef23844d9833927002b847724", + "IPY_MODEL_4185e1da42694d0a855bcdafe4bd51d4", + "IPY_MODEL_652ac436b21f4b3ea20e515e29331ad9" + ], + "layout": "IPY_MODEL_7a0bb05a560f42738ad2ddefe9e6ef1f", + "tabbable": null, + "tooltip": null + } + }, + "5973d02b637648b08588c56afe5698d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d5515569279c4be38be81665b7f78bc8", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_1dbbcbb641d0457da9a617d7c5e66c60", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "5a22224994c14e568f44f92c24b67174": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5aedaac067804ed89a5def5319f4a4cd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5b943c7cbf4a4ae39a10aa77037313da": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "5beb490b2ec447aba772341000c61aa2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5c5d3a0061d24907be28581eabb02cd5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "600cb4fa52324d13a44c27cb518ef4b8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "60adcfaac9cc483284f4cdc1cead9de4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_81cc1a9a180d455ba112a8e2fc4370de", + "IPY_MODEL_8d2c770968ea4aa895b34d91e8fc4200", + "IPY_MODEL_440f09af00f3435aaa266dc8fafa02e4" + ], + "layout": "IPY_MODEL_3bce8516d41e4055932a098594b5647c", + "tabbable": null, + "tooltip": null + } + }, + "62599fabfe704fafbe1c481930a06440": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_aaf1a00ae4c7477a9f202ef7f71c7521", + "placeholder": "​", + "style": "IPY_MODEL_3bb6d52047824c80a2656d5e2e5974b6", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:01<00:00, 284.12 examples/s]" + } + }, + "62b2dc6228b84ccf889646fa48b788be": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "652ac436b21f4b3ea20e515e29331ad9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_1e5fc2fd6913484f9f5d9201087a450e", + "placeholder": "​", + "style": "IPY_MODEL_0e9b584a9a834bbd94b2ce845711fc7e", + "tabbable": null, + "tooltip": null, + "value": " 1/1 [00:00<00:00, 157.88it/s]" + } + }, + "65db81818b584084984a73f98f32f980": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6917999552634b0b8dbb90f02f21b86e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "6946150c001a4d0aa1850c2bee69c0b0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6a062426ee974fee9ffdb29501f6d08c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_041bd7a313a24b09a69e1e74826989cf", + "placeholder": "​", + "style": "IPY_MODEL_50231bc20fa74317819198329e62097d", + "tabbable": null, + "tooltip": null, + "value": "Unsloth: Tokenizing ["text"] (num_proc=8): 100%" + } + }, + "6b92f3719f884226afabf272385d45cb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "6d9ef09e4a9d416a9a46f9dc1bbaf4c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "700441d98fed4085ac97bc22c18c55da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e8ccd117e4e14a198c189d1e631844ad", + "IPY_MODEL_8385a3383d814b7c9536b64ad713643a", + "IPY_MODEL_a23e5e0af2dc48a28fab3735caeddb79" + ], + "layout": "IPY_MODEL_1bf4a66851d74ab9aa8b1ac1e6b6077e", + "tabbable": null, + "tooltip": null + } + }, + "70f9749da14748a9a1512b203e1bea68": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "725a558139214e7dba2f617c9592af35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_31df175d9a6e4aeeb2ebcf545fba09a8", + "IPY_MODEL_ea8eb5cb677e4746945b26aac468097b", + "IPY_MODEL_62599fabfe704fafbe1c481930a06440" + ], + "layout": "IPY_MODEL_7bd4d35fdb7646fdb8c3b680e50e2f30", + "tabbable": null, + "tooltip": null + } + }, + "7318c1b2e3ae4e53a58b4497fc22a420": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "73c57dd7f29c4f73bef37d8355172ce2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7464a9c6c9b14891b98647dec7600353": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "78d33fdc643242dca3a2cbd98915eebe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a0bb05a560f42738ad2ddefe9e6ef1f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a0dc5bd17c2407ea68c09c51aaaea05": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ef339cb572e343618ab7737d678b7551", + "placeholder": "​", + "style": "IPY_MODEL_62b2dc6228b84ccf889646fa48b788be", + "tabbable": null, + "tooltip": null, + "value": "processor_config.json: " + } + }, + "7bd4d35fdb7646fdb8c3b680e50e2f30": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7cb6e843c9464063bedb75c790dac142": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_24b7aeb3de9347428e4b5d7227e808de", + "max": 208.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_bdea0e2fabcc4340baaf3da97acaca58", + "tabbable": null, + "tooltip": null, + "value": 208.0 + } + }, + "7ce39791cdd24f2da44cddc865955e8b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7de54c30e0d54241b5824bc96b7c14ed": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "7f805ff9f8b64e40a6f4c1100ca539b2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "807c2055b0db4db6b6ba6ca0476ad38c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_4735eeafdac74876a36ef26696967673", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_8f92a9cccc394baa9c5ae55af29bd27c", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "8133ec6564f54dcaad20564a2d278d03": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ff04312b4a664b24ad0030bb947be894", + "placeholder": "​", + "style": "IPY_MODEL_6b92f3719f884226afabf272385d45cb", + "tabbable": null, + "tooltip": null, + "value": " 32.2M/32.2M [00:00<00:00, 160MB/s]" + } + }, + "81cc1a9a180d455ba112a8e2fc4370de": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d1f4f04d8a2342839bf3fc5ae26fb7cf", + "placeholder": "​", + "style": "IPY_MODEL_f24969df204a4a1bbfb64939f6793513", + "tabbable": null, + "tooltip": null, + "value": "README.md: 100%" + } + }, + "8385a3383d814b7c9536b64ad713643a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ad53f1dc09ad40288f89f3850edb66b4", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_84d56b9dfc364ffda7916cdb4ba3a8fc", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "8423817f2b4b4d6a81b467023ce01994": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "84d56b9dfc364ffda7916cdb4ba3a8fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "84e0e573d4cc40baab6224039c4326bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_acabee228a184af8a71c0628bd0c089a", + "placeholder": "​", + "style": "IPY_MODEL_7318c1b2e3ae4e53a58b4497fc22a420", + "tabbable": null, + "tooltip": null, + "value": "tokenizer.json: 100%" + } + }, + "84fbd41a3ce244c5b73af0f08d747c1c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "873fd6a2d5f440a0b0311ad2754b1218": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8832d1cdbca64c74a38a5d6045ba0e18": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "88a12d9d1ba64562ba8fd4407cfe9a54": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8cb34722fb9940b2960cdb7a0164c21d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8d2c770968ea4aa895b34d91e8fc4200": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a2fa186beb3e4407a248d483e7ec1482", + "max": 982.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_530a4830fa7243ff9d98f7e523221f3b", + "tabbable": null, + "tooltip": null, + "value": 982.0 + } + }, + "8f92a9cccc394baa9c5ae55af29bd27c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8fab7a6fb3694c18b32db45b8b7ea5c9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90ff42f56a3449809883451674e813ed": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "932af61e0f874cc5b7ab0a3d338955f3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_fae74896cb8b480eb6e3d150d4be1125", + "placeholder": "​", + "style": "IPY_MODEL_e23404206b124069a9e353806b328527", + "tabbable": null, + "tooltip": null, + "value": "Loading weights: 100%" + } + }, + "9385d3f43b574a5aa445961890e3ca60": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "945d6d985ea1430bad5da9dd52d5bf17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "95166084fce04f168194727aa818c0d4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9835553764e340b084b6c9b4192dede6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9979852f7f1e4abfaab19c8fe7df76bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4b1c3a1c826746ff9b8f8575047254ac", + "IPY_MODEL_b99659e5aa0e49a49925b8d3373b33fa", + "IPY_MODEL_2736f1e3555446169cd2706f4a491421" + ], + "layout": "IPY_MODEL_363e1e28799d444aa8002941426bd8c3", + "tabbable": null, + "tooltip": null + } + }, + "a1beb7697e21449a90a6dfdb59e2eb63": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6a062426ee974fee9ffdb29501f6d08c", + "IPY_MODEL_38f9cb5906f3454ea3e53f7424a51159", + "IPY_MODEL_03cf201e1dbd4f6c9ad0674ca5de0c0c" + ], + "layout": "IPY_MODEL_6d9ef09e4a9d416a9a46f9dc1bbaf4c0", + "tabbable": null, + "tooltip": null + } + }, + "a1eeb36b3ddd4d949c90bd4b2226bcdb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a224a8553c0e47cfa4fed1344bd1b7d6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a23e5e0af2dc48a28fab3735caeddb79": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e9b45ef12abd4bbd8d371f763dacf55b", + "placeholder": "​", + "style": "IPY_MODEL_2196782266904e68be8a32ac0d6a0f53", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:01<00:00, 459.00 examples/s]" + } + }, + "a2fa186beb3e4407a248d483e7ec1482": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a38ac0a167fe4278b7360df5ef18cc06": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aaf1a00ae4c7477a9f202ef7f71c7521": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "abd94ffbb5c7432c8d2df6ea6bd591c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "acabee228a184af8a71c0628bd0c089a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ad392e4f7e294c48a576d7b613ac74b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_5b943c7cbf4a4ae39a10aa77037313da", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_2d9557aa49434ff3a772a05a66fffc40", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "ad53f1dc09ad40288f89f3850edb66b4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae024d064a3c412bb13038c52ddcaa03": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_2d391081595c436991ad4a7e02e6d536", + "max": 32169626.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_3a654aaa88874576922d2ead1ba12d33", + "tabbable": null, + "tooltip": null, + "value": 32169626.0 + } + }, + "af5f841a2cdc400391c794560bf15a45": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3feb364e98b4876a9cbfcb8c08d6c18": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e131eaea413c4647a7694d8f2a3f67ed", + "placeholder": "​", + "style": "IPY_MODEL_15dd2b3c856b48028061df9393e5933e", + "tabbable": null, + "tooltip": null, + "value": "Generating train split: 100%" + } + }, + "b4fb8951c7804c279a7926b2c13edd59": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "b5e0b331842c4d048b89f99de909316f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e351a3a818944286a2acf7dc43df02a1", + "placeholder": "​", + "style": "IPY_MODEL_945d6d985ea1430bad5da9dd52d5bf17", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:02<00:00, 441.04 examples/s]" + } + }, + "b69eb0115bf44847afc9b12957f68f13": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b99659e5aa0e49a49925b8d3373b33fa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_600cb4fa52324d13a44c27cb518ef4b8", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_9835553764e340b084b6c9b4192dede6", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "b99c3f0ccfcf4ede995ed99c0aaa94c9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_90ff42f56a3449809883451674e813ed", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_8423817f2b4b4d6a81b467023ce01994", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "bc59cc9cb6164af49f6250adcfcc6f36": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_3f76bba3dafe47c4b2bf3e3739a7eea4", + "max": 2.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_c7fa6164981a488a8fece218f1691ec6", + "tabbable": null, + "tooltip": null, + "value": 2.0 + } + }, + "bdea0e2fabcc4340baaf3da97acaca58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bedda22b15eb4a42a9f6c9681d22c1b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "bf68c41c79ad420aad5db1dfeb16a50d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_5a22224994c14e568f44f92c24b67174", + "placeholder": "​", + "style": "IPY_MODEL_4bb5c79cbf3145b5884dcf19f10252e7", + "tabbable": null, + "tooltip": null, + "value": " 15.0k/? [00:00<00:00, 1.34MB/s]" + } + }, + "bf75830bd2f74e5091f7cdc50247c26a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "c63b5c9009dd4ab387283824f660adca": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c7557342d7744e998dba2d24fe413d06": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "c7fa6164981a488a8fece218f1691ec6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c9cb90312b97442bb895e73d6329c5df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fab8d4e53c6944c8a23045a53ace1750", + "IPY_MODEL_807c2055b0db4db6b6ba6ca0476ad38c", + "IPY_MODEL_cce754ec2015456886b15153e571185f" + ], + "layout": "IPY_MODEL_2760d298c9df414ab4137112bf32d8fd", + "tabbable": null, + "tooltip": null + } + }, + "ca44c1033c9d4081836bc565c16afaaf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ca6c999e4b8a47509d70d5fdbf3c295e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_207687f8a8584c839b231cc20da58659", + "placeholder": "​", + "style": "IPY_MODEL_6917999552634b0b8dbb90f02f21b86e", + "tabbable": null, + "tooltip": null, + "value": " 117M/117M [00:02<00:00, 275MB/s]" + } + }, + "cb1f3e709d8f448aa1dfc26acad5f183": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "cce754ec2015456886b15153e571185f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_5beb490b2ec447aba772341000c61aa2", + "placeholder": "​", + "style": "IPY_MODEL_cd1ca44e4664435aade0cb03d7f4e9d5", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:00<00:00, 10507.50 examples/s]" + } + }, + "cd1ca44e4664435aade0cb03d7f4e9d5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "d18e2632f27e49239a678db16247a2e9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d1f4f04d8a2342839bf3fc5ae26fb7cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d47270348cd34660947ff133088379de": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d51a571b1c424eff8ce17a56255d7891": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "d5515569279c4be38be81665b7f78bc8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "d7eb5dc7004941c1b02f1d433f6d8ffc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "d83b55de7f2546b79ab355c0c5a3f425": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_2ccf61cc2c69496f9726cbe6e95b9d8b", + "placeholder": "​", + "style": "IPY_MODEL_7464a9c6c9b14891b98647dec7600353", + "tabbable": null, + "tooltip": null, + "value": "generation_config.json: 100%" + } + }, + "dcaed7f2f42c4c3590de018062a11cd2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "dd3eb04ec7fe48bb86aae0b6dcf21b21": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "de3c8be3b41348139129ec7411317470": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a1eeb36b3ddd4d949c90bd4b2226bcdb", + "placeholder": "​", + "style": "IPY_MODEL_2f341cf202db4feeac7652903288201d", + "tabbable": null, + "tooltip": null, + "value": "Filter (num_proc=8): 100%" + } + }, + "de7a1f2d9ad4452188d88bb2890ff55d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e131eaea413c4647a7694d8f2a3f67ed": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e23404206b124069a9e353806b328527": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e24c7d620b6e4a0ba3ab31434fe4e2d1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_40f6fcdae0c74d06ad9060c54adaa8af", + "placeholder": "​", + "style": "IPY_MODEL_45b0d3dba1324d9f86abb361dd5a498d", + "tabbable": null, + "tooltip": null, + "value": "Download complete: 100%" + } + }, + "e309404ffb6f451aaa57428b8f414843": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e351a3a818944286a2acf7dc43df02a1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e4fd7c501ed34c8db0529f5e6e197acf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_c7557342d7744e998dba2d24fe413d06", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_3d0f2fec3da64771b9a714c34882a99e", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "e58c399a44e44a4a8f3cc94f5311fd2c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_30f5c6c6cb044296b80f43162e68d94b", + "IPY_MODEL_e4fd7c501ed34c8db0529f5e6e197acf", + "IPY_MODEL_bf68c41c79ad420aad5db1dfeb16a50d" + ], + "layout": "IPY_MODEL_70f9749da14748a9a1512b203e1bea68", + "tabbable": null, + "tooltip": null + } + }, + "e591ddfdc2454d1286ff320af25a3f8b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e6bdb5db84ff46979adb6f9521205a0a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e8ccd117e4e14a198c189d1e631844ad": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_af5f841a2cdc400391c794560bf15a45", + "placeholder": "​", + "style": "IPY_MODEL_119c448203264670ae619d5f195e32e1", + "tabbable": null, + "tooltip": null, + "value": "Unsloth: Standardizing formats (num_proc=8): 100%" + } + }, + "e9b45ef12abd4bbd8d371f763dacf55b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ea8eb5cb677e4746945b26aac468097b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_1d5d11772e854845b3da2ba42f8b31f5", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_73c57dd7f29c4f73bef37d8355172ce2", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "ef339cb572e343618ab7737d678b7551": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ef6189642fa34589b561a49d9e3df4b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_4e1f4a63a3c0486d8d42c145004ce665", + "placeholder": "​", + "style": "IPY_MODEL_bedda22b15eb4a42a9f6c9681d22c1b4", + "tabbable": null, + "tooltip": null, + "value": " 62.5G/62.5G [04:12<00:00, 273MB/s]" + } + }, + "ef6bc3a4404c4aebbf321483b52fa418": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b3feb364e98b4876a9cbfcb8c08d6c18", + "IPY_MODEL_2bd6c2a05f83417eb8f881f3de8d5eb4", + "IPY_MODEL_12d481c5c4b448599ad0664fa4d8c186" + ], + "layout": "IPY_MODEL_49a12fc2587747b28bdd4547a1153f4d", + "tabbable": null, + "tooltip": null + } + }, + "f24969df204a4a1bbfb64939f6793513": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "f2e8c6e590a24ac28df404cc43bef213": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3ed4f1b125c4432b1cdd671930bfe5f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_f5fac5ea14274655ba8e0a4e734dd073", + "placeholder": "​", + "style": "IPY_MODEL_e309404ffb6f451aaa57428b8f414843", + "tabbable": null, + "tooltip": null, + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "f5839673c4a649b6b3c7c767039e9659": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f5fac5ea14274655ba8e0a4e734dd073": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f70e4406ca49447eae7f96ac39943f75": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "fa239bb86e2b434aa62eb5b1e6211200": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_84e0e573d4cc40baab6224039c4326bf", + "IPY_MODEL_ae024d064a3c412bb13038c52ddcaa03", + "IPY_MODEL_8133ec6564f54dcaad20564a2d278d03" + ], + "layout": "IPY_MODEL_78d33fdc643242dca3a2cbd98915eebe", + "tabbable": null, + "tooltip": null + } + }, + "fab8d4e53c6944c8a23045a53ace1750": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_8cb34722fb9940b2960cdb7a0164c21d", + "placeholder": "​", + "style": "IPY_MODEL_9385d3f43b574a5aa445961890e3ca60", + "tabbable": null, + "tooltip": null, + "value": "Map: 100%" + } + }, + "fae74896cb8b480eb6e3d150d4be1125": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ff04312b4a664b24ad0030bb947be894": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tooling/fine-tuning/unsloth/kaggle/Gemma4_(E4B)-Text.ipynb b/tooling/fine-tuning/unsloth/kaggle/Gemma4_(E4B)-Text.ipynb new file mode 100644 index 0000000..2a05993 --- /dev/null +++ b/tooling/fine-tuning/unsloth/kaggle/Gemma4_(E4B)-Text.ipynb @@ -0,0 +1,8241 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9b84b389", + "metadata": { + "id": "3FgedoPTwNIy", + "papermill": { + "duration": 0.02114, + "end_time": "2026-04-09T14:15:04.157266+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:04.136126+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab L4 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "id": "7bf3fc9f", + "metadata": { + "id": "kD8yWWE9wNIz", + "papermill": { + "duration": 0.017711, + "end_time": "2026-04-09T14:15:04.192885+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:04.175174+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "id": "bc8ec7ab", + "metadata": { + "id": "dYFNULMnwNIz", + "papermill": { + "duration": 0.01829, + "end_time": "2026-04-09T14:15:04.229560+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:04.211270+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "id": "e7bd6a4f", + "metadata": { + "id": "DQ6w6D0UwNIz", + "papermill": { + "duration": 0.017554, + "end_time": "2026-04-09T14:15:04.265115+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:04.247561+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "28bc6243", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:15:04.302392Z", + "iopub.status.busy": "2026-04-09T14:15:04.301722Z", + "iopub.status.idle": "2026-04-09T14:15:08.424803Z", + "shell.execute_reply": "2026-04-09T14:15:08.423967Z" + }, + "id": "LSA1qFrKwNIz", + "papermill": { + "duration": 4.143759, + "end_time": "2026-04-09T14:15:08.426762+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:04.283003+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "%%capture\n", + "try: import numpy, PIL; _numpy = f\"numpy=={numpy.__version__}\"; _pil = f\"pillow=={PIL.__version__}\"\n", + "except: _numpy = \"numpy\"; _pil = \"pillow\"\n", + "!uv pip install -qqq \\\n", + " \"torch>=2.8.0\" \"triton>=3.4.0\" {_numpy} {_pil} torchvision bitsandbytes \\\n", + " unsloth \"unsloth_zoo>=2026.4.5\" transformers==5.5.0 torchcodec timm" + ] + }, + { + "cell_type": "markdown", + "id": "f6b4946d", + "metadata": { + "id": "TGMWlrRdzwgf", + "papermill": { + "duration": 0.018261, + "end_time": "2026-04-09T14:15:08.464472+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:08.446211+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0da09ebe", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:15:08.501803Z", + "iopub.status.busy": "2026-04-09T14:15:08.501126Z", + "iopub.status.idle": "2026-04-09T14:18:12.449859Z", + "shell.execute_reply": "2026-04-09T14:18:12.449089Z" + }, + "id": "-Xbb0cuLzwgf", + "outputId": "b1936459-858a-460f-d39c-fe4d41114da8", + "papermill": { + "duration": 183.969777, + "end_time": "2026-04-09T14:18:12.451994+00:00", + "exception": false, + "start_time": "2026-04-09T14:15:08.482217+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 2. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3f9356b907ff4aeb8a45acce1e82e41b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/16.0G [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3991f051", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:18:12.637777Z", + "iopub.status.busy": "2026-04-09T14:18:12.637023Z", + "iopub.status.idle": "2026-04-09T14:18:56.352960Z", + "shell.execute_reply": "2026-04-09T14:18:56.352104Z" + }, + "id": "9jGeSb9bWe0k", + "outputId": "289205bd-b890-4659-8c82-8c7674befdfe", + "papermill": { + "duration": 43.740329, + "end_time": "2026-04-09T14:18:56.354671+00:00", + "exception": false, + "start_time": "2026-04-09T14:18:12.614342+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am sorry, but I cannot answer that question. The image you provided is a photograph of a sloth, and it is not a film poster or a scene from a movie, so it does not feature in any films.\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "id": "13c09053", + "metadata": { + "id": "eh0BzbZPWtRD", + "papermill": { + "duration": 0.021173, + "end_time": "2026-04-09T14:18:56.397839+00:00", + "exception": false, + "start_time": "2026-04-09T14:18:56.376666+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f05f68d7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:18:56.442084Z", + "iopub.status.busy": "2026-04-09T14:18:56.441720Z", + "iopub.status.idle": "2026-04-09T14:19:19.809135Z", + "shell.execute_reply": "2026-04-09T14:19:19.808438Z" + }, + "id": "R3ExuK8cWuT3", + "outputId": "d63b198a-00c6-49a5-d0e5-78cbd18d217f", + "papermill": { + "duration": 23.39163, + "end_time": "2026-04-09T14:19:19.810646+00:00", + "exception": false, + "start_time": "2026-04-09T14:18:56.419016+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## The Gentle Pace\n", + "\n", + "In emerald woods, where mosses softly cling,\n", + "And dappled sunlight makes the shadows swing,\n", + "There moves a creature, slow beneath the green,\n", + "The sloth, a masterpiece of patient scene.\n", + "\n", + "A hanging silhouette, a mossy grace,\n", + "Adorning time within its tranquil space.\n", + "No hurried breath disturbs its languid guise,\n", + "It moves as if the forest breathes through sighs.\n", + "\n", + "The world rushes by—a frantic, buzzing flight—\n", + "Of birds in chorus, bathed in blinding light.\n", + "But the sloth observes it with a knowing eye,\n", + "Content within its slow eternity.\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "id": "3b172504", + "metadata": { + "id": "wZrmFRZpZtGf", + "papermill": { + "duration": 0.025014, + "end_time": "2026-04-09T14:19:19.861788+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:19.836774+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Gemma 4 can also hear!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6285a30a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:19:19.912674Z", + "iopub.status.busy": "2026-04-09T14:19:19.912128Z", + "iopub.status.idle": "2026-04-09T14:19:20.258124Z", + "shell.execute_reply": "2026-04-09T14:19:20.257342Z" + }, + "id": "68crYajNZtw1", + "outputId": "e8ffe42f-79d8-473c-8b2b-8d4d05acc549", + "papermill": { + "duration": 0.376154, + "end_time": "2026-04-09T14:19:20.262661+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:19.886507+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Audio, display\n", + "Audio(\"https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4fdc2f3c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:19:20.323617Z", + "iopub.status.busy": "2026-04-09T14:19:20.323336Z", + "iopub.status.idle": "2026-04-09T14:19:20.800752Z", + "shell.execute_reply": "2026-04-09T14:19:20.799625Z" + }, + "id": "k3vrdoa0Z01X", + "papermill": { + "duration": 0.509763, + "end_time": "2026-04-09T14:19:20.802792+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:20.293029+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "!wget -qqq https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3 -O audio.mp3" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "95b24a57", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:19:20.862299Z", + "iopub.status.busy": "2026-04-09T14:19:20.861816Z", + "iopub.status.idle": "2026-04-09T14:19:39.539296Z", + "shell.execute_reply": "2026-04-09T14:19:39.538406Z" + }, + "id": "BJr_D4O9Z2Zh", + "outputId": "d6517a81-1d77-41dc-b2dd-2e6ab1aa3a29", + "papermill": { + "duration": 18.708402, + "end_time": "2026-04-09T14:19:39.540895+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:20.832493+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This audio is about the Apollo program.\n" + ] + } + ], + "source": [ + "audio_file = \"audio.mp3\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio about?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "id": "20e934e5", + "metadata": { + "id": "L15JuAmmaOkB", + "papermill": { + "duration": 0.027251, + "end_time": "2026-04-09T14:19:39.597028+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:39.569777+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Let's combine all 3 modalities together!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7d2bde68", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:19:39.653187Z", + "iopub.status.busy": "2026-04-09T14:19:39.652613Z", + "iopub.status.idle": "2026-04-09T14:19:56.511776Z", + "shell.execute_reply": "2026-04-09T14:19:56.511109Z" + }, + "id": "is37bsDZaRwV", + "outputId": "37235929-0289-4ba6-c352-da6d389cb5a0", + "papermill": { + "duration": 16.889309, + "end_time": "2026-04-09T14:19:56.513361+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:39.624052+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This appears to be a snippet of a speech, likely from a historical or political context, given the formal language and the ambitious goal mentioned. The image is a picture of a sloth.\n", + "\n", + "**Relationship:**\n", + "\n", + "There is no apparent relationship between the audio and the image. The audio is a serious, goal-oriented statement about a national endeavor, while the image is a photograph of an animal.\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio and image about? \"\\\n", + " \"How are they related?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "id": "17fa13a3", + "metadata": { + "id": "Bw5XPyYFajyM", + "papermill": { + "duration": 0.032942, + "end_time": "2026-04-09T14:19:56.579220+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:56.546278+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "id": "3666efda", + "metadata": { + "id": "SXd9bTZd1aaL", + "papermill": { + "duration": 0.031294, + "end_time": "2026-04-09T14:19:56.642703+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:56.611409+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "eb65be92", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:19:56.719906Z", + "iopub.status.busy": "2026-04-09T14:19:56.718703Z", + "iopub.status.idle": "2026-04-09T14:20:02.557870Z", + "shell.execute_reply": "2026-04-09T14:20:02.556932Z" + }, + "id": "6bZsfBuZDeCL", + "papermill": { + "duration": 5.88583, + "end_time": "2026-04-09T14:20:02.559982+00:00", + "exception": false, + "start_time": "2026-04-09T14:19:56.674152+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a1bf9b7c", + "metadata": { + "id": "vITh0KVJ10qX", + "papermill": { + "duration": 0.029681, + "end_time": "2026-04-09T14:20:02.620946+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:02.591265+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a1cb35e2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:20:02.685772Z", + "iopub.status.busy": "2026-04-09T14:20:02.685316Z", + "iopub.status.idle": "2026-04-09T14:20:02.690342Z", + "shell.execute_reply": "2026-04-09T14:20:02.689588Z" + }, + "id": "LjY75GoYUCB8", + "papermill": { + "duration": 0.039865, + "end_time": "2026-04-09T14:20:02.691841+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:02.651976+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f0482b8e", + "metadata": { + "id": "ZQkXuGYxbJ-e", + "papermill": { + "duration": 0.029969, + "end_time": "2026-04-09T14:20:02.751701+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:02.721732+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3c26afca", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:20:02.811731Z", + "iopub.status.busy": "2026-04-09T14:20:02.811310Z", + "iopub.status.idle": "2026-04-09T14:20:06.302247Z", + "shell.execute_reply": "2026-04-09T14:20:06.301342Z" + }, + "id": "Mkq4RvEq7FQr", + "outputId": "e78c54dd-f931-4c00-a73d-e37f3eff19e8", + "papermill": { + "duration": 3.522975, + "end_time": "2026-04-09T14:20:06.303736+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:02.780761+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1bd2499e051c47fe835936333918511a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2fd69cec", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:20:07.839111Z", + "iopub.status.busy": "2026-04-09T14:20:07.838390Z", + "iopub.status.idle": "2026-04-09T14:20:12.567650Z", + "shell.execute_reply": "2026-04-09T14:20:12.566972Z" + }, + "id": "1ahE8Ys37JDJ", + "outputId": "13973ed3-779d-485e-92aa-33b6925f1737", + "papermill": { + "duration": 4.762099, + "end_time": "2026-04-09T14:20:12.569118+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:07.807019+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65a0b27e6c4247a080a54ed6b18b656b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "id": "6fbe8d8f", + "metadata": { + "id": "ndDUB23CGAC5", + "papermill": { + "duration": 0.030617, + "end_time": "2026-04-09T14:20:12.631702+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:12.601085+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "84476bb5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:20:12.697330Z", + "iopub.status.busy": "2026-04-09T14:20:12.696528Z", + "iopub.status.idle": "2026-04-09T14:20:12.702078Z", + "shell.execute_reply": "2026-04-09T14:20:12.701418Z" + }, + "id": "gGFzmplrEy9I", + "outputId": "36882276-635b-45f5-f9d8-3764373dc35e", + "papermill": { + "duration": 0.03974, + "end_time": "2026-04-09T14:20:12.703464+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:12.663724+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "id": "029e0426", + "metadata": { + "id": "idAEIeSQ3xdS", + "papermill": { + "duration": 0.030334, + "end_time": "2026-04-09T14:20:12.764440+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:12.734106+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2063eb63", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:20:12.827234Z", + "iopub.status.busy": "2026-04-09T14:20:12.826505Z", + "iopub.status.idle": "2026-04-09T14:20:58.477258Z", + "shell.execute_reply": "2026-04-09T14:20:58.476282Z" + }, + "id": "95_Nn-89DhsL", + "outputId": "87503724-3283-49e4-fec6-4b2c4e084fca", + "papermill": { + "duration": 45.684477, + "end_time": "2026-04-09T14:20:58.479229+00:00", + "exception": false, + "start_time": "2026-04-09T14:20:12.794752+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5a7b3ac7349846deb9064be7c434d764", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=8): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5b1a7cc7", + "metadata": { + "id": "Dv1NBUozV78l", + "papermill": { + "duration": 0.030613, + "end_time": "2026-04-09T14:21:02.511624+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.481011+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "9fb4df86", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:21:02.575287Z", + "iopub.status.busy": "2026-04-09T14:21:02.574549Z", + "iopub.status.idle": "2026-04-09T14:21:02.581906Z", + "shell.execute_reply": "2026-04-09T14:21:02.581204Z" + }, + "id": "LtsMVtlkUhja", + "outputId": "d3126757-2a14-4c6d-99f8-98b3bf91be55", + "papermill": { + "duration": 0.041188, + "end_time": "2026-04-09T14:21:02.583417+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.542229+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "id": "f3972b9e", + "metadata": { + "id": "4Kyjy__m9KY3", + "papermill": { + "duration": 0.030403, + "end_time": "2026-04-09T14:21:02.645269+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.614866+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "165d2951", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:21:02.708036Z", + "iopub.status.busy": "2026-04-09T14:21:02.707522Z", + "iopub.status.idle": "2026-04-09T14:21:02.715319Z", + "shell.execute_reply": "2026-04-09T14:21:02.714464Z" + }, + "id": "_rD6fl8EUxnG", + "outputId": "e579a2b3-9df6-4c40-ef7c-98d7c9cd9d82", + "papermill": { + "duration": 0.041393, + "end_time": "2026-04-09T14:21:02.716862+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.675469+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "' In programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "73ec0163", + "metadata": { + "cellView": "form", + "execution": { + "iopub.execute_input": "2026-04-09T14:21:02.783682Z", + "iopub.status.busy": "2026-04-09T14:21:02.783109Z", + "iopub.status.idle": "2026-04-09T14:21:02.788999Z", + "shell.execute_reply": "2026-04-09T14:21:02.788020Z" + }, + "id": "2ejIt2xSNKKp", + "outputId": "2ecea13f-2faa-4c7d-e006-a0a1cb90612a", + "papermill": { + "duration": 0.039208, + "end_time": "2026-04-09T14:21:02.790686+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.751478+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "9.891 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "id": "eee6fad9", + "metadata": { + "id": "CNP1Uidk9mrz", + "papermill": { + "duration": 0.030451, + "end_time": "2026-04-09T14:21:02.852194+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.821743+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d83b4edc", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:21:02.917281Z", + "iopub.status.busy": "2026-04-09T14:21:02.916648Z", + "iopub.status.idle": "2026-04-09T14:27:25.935388Z", + "shell.execute_reply": "2026-04-09T14:27:25.934474Z" + }, + "id": "yqxqAZ7KJ4oL", + "outputId": "180092e1-ae76-449a-9f2d-0dbc3894b8f8", + "papermill": { + "duration": 383.053463, + "end_time": "2026-04-09T14:27:25.937341+00:00", + "exception": false, + "start_time": "2026-04-09T14:21:02.883878+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 2,991 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 18,350,080 of 8,014,506,528 (0.23% trained)\n", + "Caching is incompatible with gradient checkpointing in Gemma4TextDecoderLayer. Setting `past_key_values=None`.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 05:53, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
110.523083
210.053993
312.042599
49.989523
510.095123
610.694252
710.365056
89.754820
98.308989
107.331110
117.254261
126.173282
136.381964
144.963476
155.690104
164.411693
174.552224
184.913744
195.021698
204.934382
213.959793
223.978175
234.443007
244.595473
253.987100
263.831797
273.935458
283.008995
293.504218
303.710511
313.277609
323.731925
333.324703
343.664254
353.287769
363.606441
373.251672
383.009572
393.222754
402.543038
413.437666
423.372575
432.745370
442.456408
452.818116
463.419305
472.893388
483.205531
492.713997
502.372560
512.854839
522.170771
533.100059
542.641205
552.271563
562.701172
572.765497
582.787446
592.603349
602.821406

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ba3079a2", + "metadata": { + "cellView": "form", + "execution": { + "iopub.execute_input": "2026-04-09T14:27:26.004799Z", + "iopub.status.busy": "2026-04-09T14:27:26.004480Z", + "iopub.status.idle": "2026-04-09T14:27:26.012023Z", + "shell.execute_reply": "2026-04-09T14:27:26.011040Z" + }, + "id": "pCqnaKmlO1U9", + "outputId": "585888de-dbd8-4562-c6e5-a5f0dbf26dc7", + "papermill": { + "duration": 0.042476, + "end_time": "2026-04-09T14:27:26.013461+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:25.970985+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "379.4784 seconds used for training.\n", + "6.32 minutes used for training.\n", + "Peak reserved memory = 10.715 GB.\n", + "Peak reserved memory for training = 0.824 GB.\n", + "Peak reserved memory % of max memory = 73.577 %.\n", + "Peak reserved memory for training % of max memory = 5.658 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "id": "78fe5ece", + "metadata": { + "id": "ekOmTR1hSNcr", + "papermill": { + "duration": 0.031646, + "end_time": "2026-04-09T14:27:26.078664+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:26.047018+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "789f3453", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:27:26.144119Z", + "iopub.status.busy": "2026-04-09T14:27:26.143382Z", + "iopub.status.idle": "2026-04-09T14:27:38.238264Z", + "shell.execute_reply": "2026-04-09T14:27:38.237354Z" + }, + "id": "kR3gIAX-SM2q", + "outputId": "42097560-b2b6-4d32-a9f8-160db24434cc", + "papermill": { + "duration": 12.129782, + "end_time": "2026-04-09T14:27:38.240040+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:26.110258+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\n13, 21, 34, 55, 89, ...\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones.']" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "id": "d14c972d", + "metadata": { + "id": "CrSvZObor0lY", + "papermill": { + "duration": 0.03125, + "end_time": "2026-04-09T14:27:38.303897+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:38.272647+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "80b77f9d", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:27:38.368840Z", + "iopub.status.busy": "2026-04-09T14:27:38.367877Z", + "iopub.status.idle": "2026-04-09T14:27:53.797997Z", + "shell.execute_reply": "2026-04-09T14:27:53.797095Z" + }, + "id": "e2pEuRb1r2Vg", + "outputId": "a648ff4f-3762-44d5-eb8b-5045a5c01a50", + "papermill": { + "duration": 15.464494, + "end_time": "2026-04-09T14:27:53.799621+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:38.335127+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sky appears blue primarily due to a phenomenon called **Rayleigh scattering**. Here's a breakdown of how this works:\n", + "\n", + "1. **Sunlight is composed of different wavelengths:** Sunlight, which comes from the sun, is made up of various colors, each with a different wavelength. Blue light has a shorter wavelength\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ec07e9bd", + "metadata": { + "id": "uMuVrWbjAzhc", + "papermill": { + "duration": 0.035117, + "end_time": "2026-04-09T14:27:53.868536+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:53.833419+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c841a798", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:27:53.936332Z", + "iopub.status.busy": "2026-04-09T14:27:53.935832Z", + "iopub.status.idle": "2026-04-09T14:27:57.309758Z", + "shell.execute_reply": "2026-04-09T14:27:57.308857Z" + }, + "id": "upcOlWe7A1vc", + "outputId": "b38635d3-0eae-40ed-93f1-771f04c205c0", + "papermill": { + "duration": 3.410314, + "end_time": "2026-04-09T14:27:57.311357+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:53.901043+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "id": "c0280a59", + "metadata": { + "id": "AEEcJ4qfC7Lp", + "papermill": { + "duration": 0.03305, + "end_time": "2026-04-09T14:27:57.379393+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:57.346343+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "4e76e14f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:27:57.446364Z", + "iopub.status.busy": "2026-04-09T14:27:57.445610Z", + "iopub.status.idle": "2026-04-09T14:28:03.411741Z", + "shell.execute_reply": "2026-04-09T14:28:03.411099Z" + }, + "id": "MKX_XKs_BNZR", + "outputId": "c6380f12-92c3-44da-ee71-c6895cb19a95", + "papermill": { + "duration": 6.001005, + "end_time": "2026-04-09T14:28:03.413384+00:00", + "exception": false, + "start_time": "2026-04-09T14:27:57.412379+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am Gemma 4, a Large Language Model developed by Google DeepMind. I am an open weights model.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "2c10654e", + "metadata": { + "id": "f422JgM9sdVT", + "papermill": { + "duration": 0.033782, + "end_time": "2026-04-09T14:28:03.482906+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.449124+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "b579db68", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:28:03.553382Z", + "iopub.status.busy": "2026-04-09T14:28:03.552682Z", + "iopub.status.idle": "2026-04-09T14:28:03.556813Z", + "shell.execute_reply": "2026-04-09T14:28:03.555982Z" + }, + "id": "iHjt_SMYsd3P", + "papermill": { + "duration": 0.040718, + "end_time": "2026-04-09T14:28:03.558346+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.517628+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "id": "ec2d7240", + "metadata": { + "id": "z6O48DbNIAr0", + "papermill": { + "duration": 0.033577, + "end_time": "2026-04-09T14:28:03.626993+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.593416+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "301ea027", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:28:03.695829Z", + "iopub.status.busy": "2026-04-09T14:28:03.695545Z", + "iopub.status.idle": "2026-04-09T14:28:03.699618Z", + "shell.execute_reply": "2026-04-09T14:28:03.698865Z" + }, + "id": "ZV-CiKPrIFG0", + "papermill": { + "duration": 0.040418, + "end_time": "2026-04-09T14:28:03.700987+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.660569+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "f1580211", + "metadata": { + "id": "TCv4vXHd61i7", + "papermill": { + "duration": 0.034175, + "end_time": "2026-04-09T14:28:03.769687+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.735512+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "a11309e2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:28:03.838541Z", + "iopub.status.busy": "2026-04-09T14:28:03.837824Z", + "iopub.status.idle": "2026-04-09T14:28:03.842150Z", + "shell.execute_reply": "2026-04-09T14:28:03.841298Z" + }, + "id": "FqfebeAdT073", + "papermill": { + "duration": 0.040287, + "end_time": "2026-04-09T14:28:03.843691+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.803404+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "a9ac86d1", + "metadata": { + "id": "Q974YEVPI7JS", + "papermill": { + "duration": 0.033488, + "end_time": "2026-04-09T14:28:03.911272+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.877784+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "163597b1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-04-09T14:28:03.982798Z", + "iopub.status.busy": "2026-04-09T14:28:03.982206Z", + "iopub.status.idle": "2026-04-09T14:28:03.986398Z", + "shell.execute_reply": "2026-04-09T14:28:03.985558Z" + }, + "id": "ZgcJIhJ0I_es", + "papermill": { + "duration": 0.041947, + "end_time": "2026-04-09T14:28:03.988402+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:03.946455+00:00", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "bedaf816", + "metadata": { + "id": "pnz9QOYTMvbH", + "papermill": { + "duration": 0.03474, + "end_time": "2026-04-09T14:28:04.058824+00:00", + "exception": false, + "start_time": "2026-04-09T14:28:04.024084+00:00", + "status": "completed" + }, + "tags": [] + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kaggle": { + "accelerator": "nvidiaTeslaT4", + "dataSources": [ + { + "databundleVersionId": 16421787, + "sourceId": 134561, + "sourceType": "competition" + } + ], + "dockerImageVersionId": 31329, + "isGpuEnabled": true, + "isInternetEnabled": true, + "language": "python", + "sourceType": "notebook" + }, + "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.12.12" + }, + "papermill": { + "default_parameters": {}, + "duration": 785.802226, + "end_time": "2026-04-09T14:28:07.416534+00:00", + "environment_variables": {}, + "exception": null, + "input_path": "__notebook__.ipynb", + "output_path": "__notebook__.ipynb", + "parameters": {}, + "start_time": "2026-04-09T14:15:01.614308+00:00", + "version": "2.7.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "001d2358ac194ff387ff44a9976849e1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_1fef92fd286340aabaa41cad92ac64c3", + "placeholder": "​", + "style": "IPY_MODEL_552f08ce4c064e61b7b50d29ac4d7d44", + "tabbable": null, + "tooltip": null, + "value": "Unsloth: Tokenizing ["text"] (num_proc=8): 100%" + } + }, + "05ad56c561f04666b5ee42e3fd0e62c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "05c0091537e34df0a0f90e665ecc82a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e5c6e31d8a7943be90673e5034f1acf0", + "placeholder": "​", + "style": "IPY_MODEL_a20ca0892f964e25ba1586d4a5bbd9dd", + "tabbable": null, + "tooltip": null, + "value": " 11.9k/? [00:00<00:00, 1.16MB/s]" + } + }, + "08bda2f90dc847dea5b45b609709f40c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "08fe8b4959d14bb5a67ba9da42040d43": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a00778e41580422394e4e0280bfd2f82", + "IPY_MODEL_f4e8817005d044fb9fed3ba2035ebf6c", + "IPY_MODEL_e368e10eff6a4d77b3dcbec79b579e82" + ], + "layout": "IPY_MODEL_38fea064eac74561b71c0265acdf1614", + "tabbable": null, + "tooltip": null + } + }, + "09962f62cce94f56a8c39ba832b2d765": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_e79bc28cc65b4095bcdcce0706c34f32", + "placeholder": "​", + "style": "IPY_MODEL_ef66db03235441e49e3a28e8f7f142ea", + "tabbable": null, + "tooltip": null, + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "0befc317ff8643628a499907eea0c38d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0d99defc025f44daab34d0c575b350c2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0fa2f8b8168e4406b46fb1825f7d4292": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "106b68972ccb43c58b5029bf218ab1d5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_3b84f78ce4d14ef9b1bd5b85f2c82aa7", + "max": 982.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_a0f0d065f65248e98aa3a31493911932", + "tabbable": null, + "tooltip": null, + "value": 982.0 + } + }, + "1134f408212e435db3a3f077c3fba26d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "12b6d1753927475682f8702ca4cada4f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "13630bf3f7be48c9b687ccff4e6b639f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "188a2acc11d34429a8b534511676a75f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2e117d94f0414890968b9b9128d0bd83", + "IPY_MODEL_d4037b70f52e4d998c56578de7c79774", + "IPY_MODEL_d7a1b908d01841bd863d9763faaecf19" + ], + "layout": "IPY_MODEL_2d9fb98979364652b7b22d23db520b8e", + "tabbable": null, + "tooltip": null + } + }, + "198057887a0b463aaa5008f568be4b88": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d4ace70caa0b427ebeb42e173962e4a6", + "placeholder": "​", + "style": "IPY_MODEL_803ef0c370ea4b768c955c2ccf60ef9f", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:00<00:00, 10398.55 examples/s]" + } + }, + "1a5639acc2c940c6953598272c4b2e69": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d6182709ee8042188c1784721434f68c", + "placeholder": "​", + "style": "IPY_MODEL_768634c4bf8142adb559389539b93592", + "tabbable": null, + "tooltip": null, + "value": " 16.0G/16.0G [01:10<00:00, 322MB/s]" + } + }, + "1bd2499e051c47fe835936333918511a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f416c1e959ee4745bc8a272345480d0d", + "IPY_MODEL_106b68972ccb43c58b5029bf218ab1d5", + "IPY_MODEL_61788d01c4fc4cae83947b486bc89ffb" + ], + "layout": "IPY_MODEL_7d5975865cb8442989a4e7b6cdcd47a6", + "tabbable": null, + "tooltip": null + } + }, + "1fef92fd286340aabaa41cad92ac64c3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "20fe61bf6b394ba89a2e59acf77cdce5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "211d2ae3785141c59d4e415a0b5b11df": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "26fbb43053db4a2eb73f900bcfb61f14": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "287fbc35965645beb41b4ce8a70770f4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a5a818e39724e57b299536662a4210d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "2b882452251c443fa8c8fa2c9feb7b46": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d9fb98979364652b7b22d23db520b8e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e117d94f0414890968b9b9128d0bd83": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_64b87ca879094043b28c55f5e1809699", + "placeholder": "​", + "style": "IPY_MODEL_e6eae91cecb14392a0af9398937b2fbc", + "tabbable": null, + "tooltip": null, + "value": "Computing checksums: 100%" + } + }, + "2e5c5a5f83e24ec9b55d3ac973a1e191": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_32d6aea2c6d54fe7bffba1aa32ed1d13", + "IPY_MODEL_940db0f1f9ed402db0925d693d85df02", + "IPY_MODEL_05c0091537e34df0a0f90e665ecc82a7" + ], + "layout": "IPY_MODEL_d92b9a6eb55b482fa1de1bc6ef01c2fe", + "tabbable": null, + "tooltip": null + } + }, + "2f9c9391a52749148984920f1880ff58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "32d6aea2c6d54fe7bffba1aa32ed1d13": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_05ad56c561f04666b5ee42e3fd0e62c5", + "placeholder": "​", + "style": "IPY_MODEL_1134f408212e435db3a3f077c3fba26d", + "tabbable": null, + "tooltip": null, + "value": "chat_template.jinja: " + } + }, + "3584c90d6b27469cb2780c6fc618f146": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "38fea064eac74561b71c0265acdf1614": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3951f3ffff774384acdfde89992fd0dd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b84f78ce4d14ef9b1bd5b85f2c82aa7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3c6e58fc816741e7b1321e9bf0ee80a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3d028f45e72344c1a42519245f58a8ae": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3f80b23d09b84265bbea8d3caa05b940": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "3f9356b907ff4aeb8a45acce1e82e41b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_eb1f0cb5250a460195a57ae36b2d1648", + "IPY_MODEL_682793ef605b4942a6e2299be26823c5", + "IPY_MODEL_1a5639acc2c940c6953598272c4b2e69" + ], + "layout": "IPY_MODEL_ce0953daab7c4cb290ce36a31350dadc", + "tabbable": null, + "tooltip": null + } + }, + "40a44625b8d54fbca680049dfe1ddd1c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d75f4d2d03ae4247a54732e952674931", + "placeholder": "​", + "style": "IPY_MODEL_2a5a818e39724e57b299536662a4210d", + "tabbable": null, + "tooltip": null, + "value": "tokenizer.json: 100%" + } + }, + "41824be3f8014c7bb2dac828e792bae8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_c7641a7d1ad24f5ca33469ae18fdac68", + "placeholder": "​", + "style": "IPY_MODEL_cbe4683fe14945e18dd7161a2c454500", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:40<00:00, 79.59 examples/s]" + } + }, + "45de381897e74b69b1d4f46db5d36291": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "4c52050f012045e7b6980b51c672547d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4cc728ba782043c0910331789fd4ce96": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4f34e17e884648bab833dd7e006e6287": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f2c4809b20c84e7a96d9b67a3d8ac09f", + "IPY_MODEL_87f56a4df31f499b886dd2b3a392892b", + "IPY_MODEL_553cc00c3bd348b5b5326c399d974a24" + ], + "layout": "IPY_MODEL_b6bde48c056745dda54e0d1420a78519", + "tabbable": null, + "tooltip": null + } + }, + "5382be602e5a42b29c026e90f7a5e585": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "552f08ce4c064e61b7b50d29ac4d7d44": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "553cc00c3bd348b5b5326c399d974a24": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_b3e6ffa744ed4549a25ddaf5e459cb6a", + "placeholder": "​", + "style": "IPY_MODEL_8db9010ceefb4493a303c361fce31d91", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:01<00:00, 3853.33 examples/s]" + } + }, + "5553cc1760b043f3b82b87db8f8fc570": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "57574cc040184d2b8a4395b3287a8ef1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "59f259377ce840c6b1d6f7477b4f74fb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5a7b3ac7349846deb9064be7c434d764": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_001d2358ac194ff387ff44a9976849e1", + "IPY_MODEL_84014c285cd34142887259eae7e1c518", + "IPY_MODEL_41824be3f8014c7bb2dac828e792bae8" + ], + "layout": "IPY_MODEL_d127ada24d82403e826fd8cc2be96aae", + "tabbable": null, + "tooltip": null + } + }, + "5fc156df253a4accaa09963954145a6b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "61788d01c4fc4cae83947b486bc89ffb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a31ce646c53140a1bb1ccd7777de20e7", + "placeholder": "​", + "style": "IPY_MODEL_5fc156df253a4accaa09963954145a6b", + "tabbable": null, + "tooltip": null, + "value": " 982/982 [00:00<00:00, 106kB/s]" + } + }, + "61e6c04c874f45e387821539981f2e76": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "62c1945a264749d7b0906cbca3d15350": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_6cb531ed8c234011bd0f06ae73690115", + "placeholder": "​", + "style": "IPY_MODEL_c423948df5c1410d80bc29d975e87492", + "tabbable": null, + "tooltip": null, + "value": "generation_config.json: 100%" + } + }, + "6307099d3c25460ba6bee80edd1d1a09": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_acf4cc08f5654424a995921b867414bd", + "max": 32169626.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_0fa2f8b8168e4406b46fb1825f7d4292", + "tabbable": null, + "tooltip": null, + "value": 32169626.0 + } + }, + "647a740f72ee4c319784610a86dae503": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_4c52050f012045e7b6980b51c672547d", + "placeholder": "​", + "style": "IPY_MODEL_45de381897e74b69b1d4f46db5d36291", + "tabbable": null, + "tooltip": null, + "value": " 208/208 [00:00<00:00, 22.5kB/s]" + } + }, + "64b87ca879094043b28c55f5e1809699": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "65a0b27e6c4247a080a54ed6b18b656b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_82ddb8eff0d24c57b66a23958ff8c248", + "IPY_MODEL_68426c295d0f41c582174dd4a5d2523f", + "IPY_MODEL_198057887a0b463aaa5008f568be4b88" + ], + "layout": "IPY_MODEL_5553cc1760b043f3b82b87db8f8fc570", + "tabbable": null, + "tooltip": null + } + }, + "65dec59f62c1480cb6bca2268f2a403a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_dd6c5df2d2c34be880470f6fd5fc297e", + "placeholder": "​", + "style": "IPY_MODEL_99ca530944db40c688cc2e2167672d99", + "tabbable": null, + "tooltip": null, + "value": "Filter (num_proc=8): 100%" + } + }, + "65e41393d19847bb86101d4a4d6b46d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_8e8ccf63de5b4a7f9ce88b529c4cd59b", + "placeholder": "​", + "style": "IPY_MODEL_904ca5e14e8d4c339aa31e466f2eb2d6", + "tabbable": null, + "tooltip": null, + "value": " 100000/100000 [00:00<00:00, 123190.86 examples/s]" + } + }, + "66cdc617906c4996b55384b1e8a907fd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "682793ef605b4942a6e2299be26823c5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_8b24bd733ab54b019cb26c3157e41758", + "max": 15992595884.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_4cc728ba782043c0910331789fd4ce96", + "tabbable": null, + "tooltip": null, + "value": 15992595884.0 + } + }, + "68426c295d0f41c582174dd4a5d2523f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ece07379e5f3496f9950ad425026ca5f", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_59f259377ce840c6b1d6f7477b4f74fb", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "68b87a00770d4fa0856a5a4ffbf343e5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6cb531ed8c234011bd0f06ae73690115": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6cebc0e67c664e059e14fb481985a383": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6d4f64faf10d4cd2bf1d4d7bfb7fd1b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_2b882452251c443fa8c8fa2c9feb7b46", + "placeholder": "​", + "style": "IPY_MODEL_e39ab592e86c4190bbbd488bcd85d99e", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:02<00:00, 1114.52 examples/s]" + } + }, + "6e11e1ff8e7a4246a38d6143ac8daa6f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "747599c76bbb4fc7b1c565b8dd4e1317": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_78d696ad36834f32aadb2db6f783cc29", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_f26c344426984a1a93868519dabb45bc", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "75205816cf7f4c50b9eee6478a4ed98a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_c5fc3eba43d74cb2acea114cc65139e2", + "placeholder": "​", + "style": "IPY_MODEL_08bda2f90dc847dea5b45b609709f40c", + "tabbable": null, + "tooltip": null, + "value": "Unsloth: Standardizing formats (num_proc=8): 100%" + } + }, + "760b0d5e9a9d44e386477ba3806fe69a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_287fbc35965645beb41b4ce8a70770f4", + "max": 2130.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_b91f8b142c3b48cf9f08d2df6eda1978", + "tabbable": null, + "tooltip": null, + "value": 2130.0 + } + }, + "768634c4bf8142adb559389539b93592": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "78d696ad36834f32aadb2db6f783cc29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "790136d7d63b4531b07d2ae73e8bd6af": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7c2a23b31d77497e9ecc8128f038398b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_62c1945a264749d7b0906cbca3d15350", + "IPY_MODEL_f3fe3589911a40ebbfae2bd3596a935d", + "IPY_MODEL_647a740f72ee4c319784610a86dae503" + ], + "layout": "IPY_MODEL_6e11e1ff8e7a4246a38d6143ac8daa6f", + "tabbable": null, + "tooltip": null + } + }, + "7d01a45f2b68423396448afb5789db26": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7d0812636bda4a41b39233e82f705cc3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_b051a523cdd34fd180668215334d080c", + "placeholder": "​", + "style": "IPY_MODEL_61e6c04c874f45e387821539981f2e76", + "tabbable": null, + "tooltip": null, + "value": " 117M/117M [00:01<00:00, 583MB/s]" + } + }, + "7d5975865cb8442989a4e7b6cdcd47a6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7d78ab46e4754acfb5915b3a0741817e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7e9050fcebb9454cb5e2c85353d93756": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_20fe61bf6b394ba89a2e59acf77cdce5", + "placeholder": "​", + "style": "IPY_MODEL_2f9c9391a52749148984920f1880ff58", + "tabbable": null, + "tooltip": null, + "value": "tokenizer_config.json: " + } + }, + "7ed39adaaf9646ed8b9eaac7c64e4e26": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "803ef0c370ea4b768c955c2ccf60ef9f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "80eb316b1b1c49a28f7e8c01d97ab526": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_211d2ae3785141c59d4e415a0b5b11df", + "max": 116531415.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_b864c84037eb417e872fdcfeaa55bc8d", + "tabbable": null, + "tooltip": null, + "value": 116531415.0 + } + }, + "82ddb8eff0d24c57b66a23958ff8c248": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_68b87a00770d4fa0856a5a4ffbf343e5", + "placeholder": "​", + "style": "IPY_MODEL_3f80b23d09b84265bbea8d3caa05b940", + "tabbable": null, + "tooltip": null, + "value": "Map: 100%" + } + }, + "84014c285cd34142887259eae7e1c518": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ac4e9c906b1b46d4bd7c712e7e9412aa", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_898c5d16a65f4922bb48389354bf156a", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "85771c35b1354a02a5da2c6fac955977": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "86852c7625d6454888e1e037ed765a70": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a79151a924304732b6c49e43ebd01838", + "max": 100000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_92975d32f5954dfd9f4eedde77125e53", + "tabbable": null, + "tooltip": null, + "value": 100000.0 + } + }, + "868b0d680f2e4ec983d25229a3196e61": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "87f56a4df31f499b886dd2b3a392892b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_0befc317ff8643628a499907eea0c38d", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_f8edf29ad3514c31a53cab5b3f04f2da", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "898c5d16a65f4922bb48389354bf156a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8b24bd733ab54b019cb26c3157e41758": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8db9010ceefb4493a303c361fce31d91": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "8e8ccf63de5b4a7f9ce88b529c4cd59b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fc1b1d31b414d7f8c68676ac0dfa064": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ea1195f4e1494cd1b0188cb79e0812a7", + "placeholder": "​", + "style": "IPY_MODEL_e58ddbc47ea34e1b9b3ece0738cf296b", + "tabbable": null, + "tooltip": null, + "value": " 32.2M/32.2M [00:00<00:00, 160MB/s]" + } + }, + "904ca5e14e8d4c339aa31e466f2eb2d6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "92975d32f5954dfd9f4eedde77125e53": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "940db0f1f9ed402db0925d693d85df02": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_fcebf1670b43483d8324d101283307c5", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_7d78ab46e4754acfb5915b3a0741817e", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "98d18f12362a44f48acbc5fa8d7973e1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "99ca530944db40c688cc2e2167672d99": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "9cc696acfaa24029a19aac32db80080a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9e839d76d2fe4c42a7caf2d809cfa215": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9fcc1b0d5e7e47b38e0025c24aa8c329": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_09962f62cce94f56a8c39ba832b2d765", + "IPY_MODEL_80eb316b1b1c49a28f7e8c01d97ab526", + "IPY_MODEL_7d0812636bda4a41b39233e82f705cc3" + ], + "layout": "IPY_MODEL_ab3a91cb5e314145903e065d581c9be7", + "tabbable": null, + "tooltip": null + } + }, + "a00778e41580422394e4e0280bfd2f82": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_aec5f94e1ea64dc39eb51936779a81d2", + "placeholder": "​", + "style": "IPY_MODEL_5382be602e5a42b29c026e90f7a5e585", + "tabbable": null, + "tooltip": null, + "value": "processor_config.json: " + } + }, + "a0f0d065f65248e98aa3a31493911932": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a20ca0892f964e25ba1586d4a5bbd9dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "a2465290c940413bbd0c5059e9207d8e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "a25564c9cd6844539a80ba11ab305b89": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7e9050fcebb9454cb5e2c85353d93756", + "IPY_MODEL_a853a0f5e14345868bfe0433a96990b0", + "IPY_MODEL_a8aa4963126647ae974557a5df08688b" + ], + "layout": "IPY_MODEL_12b6d1753927475682f8702ca4cada4f", + "tabbable": null, + "tooltip": null + } + }, + "a31ce646c53140a1bb1ccd7777de20e7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a79151a924304732b6c49e43ebd01838": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a853a0f5e14345868bfe0433a96990b0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_a2465290c940413bbd0c5059e9207d8e", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_c9ebc137214a4d48aa437ec8ab4efccd", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "a8aa4963126647ae974557a5df08688b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_9cc696acfaa24029a19aac32db80080a", + "placeholder": "​", + "style": "IPY_MODEL_f9b35e10980c481ebb2e68ff6bd086ec", + "tabbable": null, + "tooltip": null, + "value": " 14.9k/? [00:00<00:00, 1.36MB/s]" + } + }, + "ab3a91cb5e314145903e065d581c9be7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "abba5ca8b9c24aa5ad4834264bdd0bfc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_75205816cf7f4c50b9eee6478a4ed98a", + "IPY_MODEL_c06835d0e1084b16811cf1678fa6a9bf", + "IPY_MODEL_bec3af9e58e84d829633e69b53bc80d1" + ], + "layout": "IPY_MODEL_d819c83dbe194834abe4485e51a61fcc", + "tabbable": null, + "tooltip": null + } + }, + "ac4e9c906b1b46d4bd7c712e7e9412aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "acf4cc08f5654424a995921b867414bd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aec5f94e1ea64dc39eb51936779a81d2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b051a523cdd34fd180668215334d080c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b05797a38c9041d7a4fd977b6b66ca13": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_40a44625b8d54fbca680049dfe1ddd1c", + "IPY_MODEL_6307099d3c25460ba6bee80edd1d1a09", + "IPY_MODEL_8fc1b1d31b414d7f8c68676ac0dfa064" + ], + "layout": "IPY_MODEL_66cdc617906c4996b55384b1e8a907fd", + "tabbable": null, + "tooltip": null + } + }, + "b074bfe33e75427b96014c838dd4a42a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "b12e94ba51934a4097da47d981948854": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3e6ffa744ed4549a25ddaf5e459cb6a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6bde48c056745dda54e0d1420a78519": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b864c84037eb417e872fdcfeaa55bc8d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b91f8b142c3b48cf9f08d2df6eda1978": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bb0ac6fd692944548351a5c2efd31ea5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "bec3af9e58e84d829633e69b53bc80d1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_cdde474a35044655bd1693145eb1cba9", + "placeholder": "​", + "style": "IPY_MODEL_57574cc040184d2b8a4395b3287a8ef1", + "tabbable": null, + "tooltip": null, + "value": " 3000/3000 [00:01<00:00, 534.28 examples/s]" + } + }, + "c06835d0e1084b16811cf1678fa6a9bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_85771c35b1354a02a5da2c6fac955977", + "max": 3000.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_790136d7d63b4531b07d2ae73e8bd6af", + "tabbable": null, + "tooltip": null, + "value": 3000.0 + } + }, + "c382838d589c4320b7bbc41684168893": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_d8edddbcbf70493b8bfdff63602782b7", + "placeholder": "​", + "style": "IPY_MODEL_13630bf3f7be48c9b687ccff4e6b639f", + "tabbable": null, + "tooltip": null, + "value": "Generating train split: 100%" + } + }, + "c423948df5c1410d80bc29d975e87492": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "c5e70f486b134264911fa70a74fb3d19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "c5fc3eba43d74cb2acea114cc65139e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c7641a7d1ad24f5ca33469ae18fdac68": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9ebc137214a4d48aa437ec8ab4efccd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ca6689b7b9d1446c9f09e3dcf5125ae8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_65dec59f62c1480cb6bca2268f2a403a", + "IPY_MODEL_747599c76bbb4fc7b1c565b8dd4e1317", + "IPY_MODEL_6d4f64faf10d4cd2bf1d4d7bfb7fd1b4" + ], + "layout": "IPY_MODEL_3c6e58fc816741e7b1321e9bf0ee80a0", + "tabbable": null, + "tooltip": null + } + }, + "cbe4683fe14945e18dd7161a2c454500": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "cdde474a35044655bd1693145eb1cba9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ce0953daab7c4cb290ce36a31350dadc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d127ada24d82403e826fd8cc2be96aae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d15e935af71e48bf9eb16c54fd039cb4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c382838d589c4320b7bbc41684168893", + "IPY_MODEL_86852c7625d6454888e1e037ed765a70", + "IPY_MODEL_65e41393d19847bb86101d4a4d6b46d4" + ], + "layout": "IPY_MODEL_3951f3ffff774384acdfde89992fd0dd", + "tabbable": null, + "tooltip": null + } + }, + "d4037b70f52e4d998c56578de7c79774": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_26fbb43053db4a2eb73f900bcfb61f14", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_0d99defc025f44daab34d0c575b350c2", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "d4ace70caa0b427ebeb42e173962e4a6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d6182709ee8042188c1784721434f68c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d75f4d2d03ae4247a54732e952674931": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d7664d8a987847b983fdda73512050a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "d7a1b908d01841bd863d9763faaecf19": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_f0233eb685774716b42a86884e43593b", + "placeholder": "​", + "style": "IPY_MODEL_c5e70f486b134264911fa70a74fb3d19", + "tabbable": null, + "tooltip": null, + "value": " 1/1 [00:00<00:00, 142.45it/s]" + } + }, + "d819c83dbe194834abe4485e51a61fcc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d8edddbcbf70493b8bfdff63602782b7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d92b9a6eb55b482fa1de1bc6ef01c2fe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dbdfb3f2528c4473bac00ebd848220a1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dd6c5df2d2c34be880470f6fd5fc297e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dfeb0d920b4a491d85062ee2f62db17d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e368e10eff6a4d77b3dcbec79b579e82": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_ea4d607d803845d199352d6247ca844f", + "placeholder": "​", + "style": "IPY_MODEL_d7664d8a987847b983fdda73512050a7", + "tabbable": null, + "tooltip": null, + "value": " 1.69k/? [00:00<00:00, 146kB/s]" + } + }, + "e39ab592e86c4190bbbd488bcd85d99e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e58ddbc47ea34e1b9b3ece0738cf296b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e5c6e31d8a7943be90673e5034f1acf0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e6eae91cecb14392a0af9398937b2fbc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e79bc28cc65b4095bcdcce0706c34f32": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e94a7c81af474a4c9ada6310f0fa71f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "e9a732ae54f9464092bf38e35c644619": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_3584c90d6b27469cb2780c6fc618f146", + "placeholder": "​", + "style": "IPY_MODEL_7ed39adaaf9646ed8b9eaac7c64e4e26", + "tabbable": null, + "tooltip": null, + "value": "Loading weights: 100%" + } + }, + "ea1195f4e1494cd1b0188cb79e0812a7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ea4d607d803845d199352d6247ca844f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eb1f0cb5250a460195a57ae36b2d1648": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_9e839d76d2fe4c42a7caf2d809cfa215", + "placeholder": "​", + "style": "IPY_MODEL_868b0d680f2e4ec983d25229a3196e61", + "tabbable": null, + "tooltip": null, + "value": "model.safetensors: 100%" + } + }, + "ece07379e5f3496f9950ad425026ca5f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ef66db03235441e49e3a28e8f7f142ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "f0233eb685774716b42a86884e43593b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f26c344426984a1a93868519dabb45bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f2c4809b20c84e7a96d9b67a3d8ac09f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_dfeb0d920b4a491d85062ee2f62db17d", + "placeholder": "​", + "style": "IPY_MODEL_98d18f12362a44f48acbc5fa8d7973e1", + "tabbable": null, + "tooltip": null, + "value": "Map (num_proc=8): 100%" + } + }, + "f3fe3589911a40ebbfae2bd3596a935d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_f74b38a069ee4a1f84435f2a7fe3919e", + "max": 208.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_7d01a45f2b68423396448afb5789db26", + "tabbable": null, + "tooltip": null, + "value": 208.0 + } + }, + "f416c1e959ee4745bc8a272345480d0d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_dbdfb3f2528c4473bac00ebd848220a1", + "placeholder": "​", + "style": "IPY_MODEL_e94a7c81af474a4c9ada6310f0fa71f2", + "tabbable": null, + "tooltip": null, + "value": "README.md: 100%" + } + }, + "f4b411dee72341d7ba6ee61660534490": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e9a732ae54f9464092bf38e35c644619", + "IPY_MODEL_760b0d5e9a9d44e386477ba3806fe69a", + "IPY_MODEL_fd3f63178dc444dfb32884cccb020faf" + ], + "layout": "IPY_MODEL_6cebc0e67c664e059e14fb481985a383", + "tabbable": null, + "tooltip": null + } + }, + "f4e8817005d044fb9fed3ba2035ebf6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_bb0ac6fd692944548351a5c2efd31ea5", + "max": 1.0, + "min": 0.0, + "orientation": "horizontal", + "style": "IPY_MODEL_3d028f45e72344c1a42519245f58a8ae", + "tabbable": null, + "tooltip": null, + "value": 1.0 + } + }, + "f74b38a069ee4a1f84435f2a7fe3919e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f8edf29ad3514c31a53cab5b3f04f2da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f9b35e10980c481ebb2e68ff6bd086ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "background": null, + "description_width": "", + "font_size": null, + "text_color": null + } + }, + "fcebf1670b43483d8324d101283307c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": 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, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "fd3f63178dc444dfb32884cccb020faf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HTMLView", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_b12e94ba51934a4097da47d981948854", + "placeholder": "​", + "style": "IPY_MODEL_b074bfe33e75427b96014c838dd4a42a", + "tabbable": null, + "tooltip": null, + "value": " 2130/2130 [00:53<00:00, 377.03it/s]" + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Text.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Text.ipynb new file mode 100644 index 0000000..7477a45 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Text.ipynb @@ -0,0 +1,7723 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "64duhI2Gsavq" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab A100 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tDDXqI4lsavq" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-Zyog1Zysavq" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LRFceDFcsavq" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "A6wGqvTjsavr" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lBN09c1tUlSV" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "-Xbb0cuLzwgf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 461, + "referenced_widgets": [ + "7769eb91dcb74e2b998cea8da27110c0", + "c96e424cc8ba44c9ad664e4acc966e99", + "8d33ff5f466e416ca3e3332a5fd15d59", + "6dd24e24dccb4f76884a667a339889a5", + "f64b22ad99e54673944ad3ba7bde198b", + "a6828f24aaad43d58bf87cbadbfdae20", + "e233f639b56b47ba813d231923e6234e", + "692480d015c746ae9a97e09def1832c9", + "6a6c3c78ddbd4e27a5886e47cf44e476", + "1a3548fbc46e48cfb0df425c6b640467", + "62dd1228b1d0402ead07486077387640", + "12c7026200d14b42b3d085995ab11a7a", + "7ca13c9cdb5c4b649c78793975295602", + "1ff0ed429f7f4784a1846b62126e6288", + "3bb8deb734824b119dc6a75a03671357", + "038f96ae1ed5480b9f209d268ae32cbd", + "670f3a9c0b2045cfa378a5aac8337396", + "6f5ce5cfa09f492e956109eda6f5b3f3", + "8ebf11b7ab2142ceb3a1893d4f215dd3", + "604450c9e490468081c0577fb9d6116c", + "5818f1d23c7e4fb9b0f2a8c7fd00f6d8", + "790cc60e62b74a0f83bee6b135407008", + "aa8461c3b0a048859b122f833cdd0588", + "15d3f86682a7499ba4a89a47c3eb2cc9", + "193ff086d24f4ec79369788d1f23ce5b", + "42d741ab6080460d86c7b25d69c83513", + "ca26a64b7c8141849e2af1c7926c8d4c", + "6caf778bd350418ab85f925401358cb7", + "4bcd980f165945358b2dd5bb46d852dd", + "361e586e6e55463a90f6b9dc4f536e0c", + "75b32154d6504abcb249e2c2e00c6afb", + "c743597897874b0cbc8440fdf5eb3f7a", + "38de8ae3e68a4b1796aca83591ee8156", + "4154a72354a8403dbe3369ba9c548fc7", + "c88bd79d9b5c4b0681930216611d5522", + "a46f89db282041ff8cc4401bb8a4a636", + "e50c40ce7c6b43fd9c347b915e2b6aab", + "8431c48be48e4720aec35e9bab52fa92", + "f41e37a94c5c4b68a781b58c42fca4ff", + "0b4bf122609942de8afa64e37c61654b", + "e138b40042e54adaa94a1323fd9cc779", + "f8adec579c1d43a68e1c9ed0a64718fc", + "b1c346a40483474097727972d6a05eef", + "e740ea8de695437588e91271aaa28928", + "517986179dc2406fba8401fd1a18c866", + "b60c8f2bd64e4df7b1f3897ba20996c9", + "d52aff7110844ba99567cd085f88f4fb", + "f8aac8afada341a49d34f71feeb33086", + "29a3f7f177fd45ec98d5fdf5358e87e6", + "7f04178813454a64b2e11ae328ddd975", + "19514ae2563642e7aafc05fdcd2d6eb9", + "e15263fc72d24bf3a6da6563d246bca2", + "35444cb6e46f4925895b17449663d323", + "1f05fbc19f6d4c3c985093ae4502f677", + "92944bffeb3542cbb02ebe44fe67ff2b", + "9a181c75a14544a698eb5b5e16a7e27c", + "b4eda43ec55741ceab50a6ef8823641b", + "de0d4fe3ef26497c968986714c4c1294", + "53e8cc1b279b4cb68fe499416d20a28b", + "d5a0369d9ec94f018b8480620c458d0d", + "a450acc04e4d4bf58177461b3b888397", + "0959671891b947a19ceb2f1d9677e7e5", + "a885ae88241a4013b42b8f4d89d74f99", + "5db37854f8c6430cac9a074903f4a766", + "77b5140635d14346bf7ae7fe1c905dff", + "9062490a257644d380adf6ef8a037694", + "2d1ad39161c840d38be868b6b5d30e06", + "291e50a3d894436ab3691f49cdba7461", + "43404477358b43ab890fc624fbbe093d", + "c94cef24144246b38abf0669f99576a8", + "816a0b007a0e4dda8e41f11dd7d853d2", + "2b6016ee95894de5831bd86bc0dd4985", + "f9eeebd8dfe34fca81e472e14c21211a", + "7351cbc882f14b308be2c7732e56bb91", + "4715a8e2e0f1442a8911832160ad2d47", + "224b1b795ca840d4a06db069caae1e6d", + "6f31576ee8624861a649053804780272", + "ea4c29f5f43a453e8494f835a6407024", + "88f39a67d2b941d683b52a3c44559525", + "fd01935ca8d74ef5981e120f9c36868b", + "422a169fb50048509742eb51dd7db278", + "46a247d88b904364a2c01b7a23adc16d", + "751c3757c92e4b989bad2beaf0e72862", + "f069d89c19924879af9abb3cc8d71b64", + "0e4d36725d4a4aea8c02ccaf3dd96eaf", + "ca077b888e13430385998ae69c8b6175", + "f53291e6d8d041c5b050722b334e6cab", + "1942ae9bfdf348b791c37a8bb211f29a", + "22f7568e9caf4d728d63c52378b3d5a5", + "b0cbed05625145fdba2236b2264f0990", + "ed26f2f3dc67495e8c5e66dd43f56988", + "73bdd24fd1234a138bba9b248810769a", + "91886a707da84f88898e9eb1a5603766", + "c17e1dc079a8448d9cd3678aa841a4cf", + "8f96e18da1b940f1907df7daec6fe385", + "5880c5dc36154d699e40aacc9829efae", + "f2e283218aaf4f7d826d44d87bc18b66", + "2e283e162b124bdcae47a501696bc9af", + "f3a176148e2e48d982f3362dd707d389" + ] + }, + "outputId": "d373134b-4b9d-43be-db56-d438180a5a5a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "Unsloth: Your Flash Attention 2 installation seems to be broken. Using Xformers instead. No performance changes will be seen.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| NVIDIA A100-SXM4-80GB. Num GPUs = 1. Max memory: 79.251 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 8.0. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = TRUE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors.index.json: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "7769eb91dcb74e2b998cea8da27110c0" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (incomplete total...): 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "12c7026200d14b42b3d085995ab11a7a" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Fetching 2 files: 0%| | 0/2 [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "9jGeSb9bWe0k", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "512b7df1-151d-4e3e-f8cf-88cd39c34e2f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The animal in the image is a sloth. While sloths are not typically central characters in major films, they have appeared in various movies and documentaries. Some examples include:\n", + "\n", + "* **Zootopia (2016):** A sloth named Flash is a memorable character in this Disney animated film.\n", + "* **Nature Documentaries:** Sloths are frequently featured in nature documentaries from series like *Planet Earth* or *National Geographic*.\n", + "* **Various animated films:** They occasionally appear as background characters or minor roles in various animated productions.\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eh0BzbZPWtRD" + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "R3ExuK8cWuT3", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "db69482a-7f7d-4dc9-cc54-768eb938fbb1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "In the canopy’s emerald, velvet embrace,\n", + "Where the sunlight descends with a slow, steady grace,\n", + "Dwells a master of stillness, a king of the pause,\n", + "Obeying the rhythm of nature’s own laws.\n", + "\n", + "No hurry disturbs him, no frantic pursuit,\n", + "He is content with the leaf and the fruit.\n", + "With limbs like slow rivers and eyes soft and wise,\n", + "He watches the world through a dreamy disguise.\n", + "\n", + "A coat made of moss and a spirit of peace,\n", + "He waits for the rush of the jungle to cease.\n", + "While the monkeys all chatter and colorful birds fly,\n", + "\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "6bZsfBuZDeCL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "81d7a65c-3b00-437c-d418-67867cd126de" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Detected MoE model with num_experts = 128 and target_modules = '(?:.*?(?:language|text).*?(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense).*?(?:k_proj|q_proj|v_proj|o_proj|gate_proj|up_proj|down_proj|proj|linear).*?)|(?:\\\\bmodel\\\\.layers\\\\.[\\\\d]{1,}\\\\.(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense)\\\\.(?:(?:k_proj|q_proj|v_proj|o_proj|gate_proj|up_proj|down_proj|proj|linear)))'. Enabling LoRA on MoE parameters: ['mlp.experts.gate_up_proj', 'mlp.experts.down_proj']\n", + "Unsloth: PEFT set target_parameters but found no matching parameters.\n", + "This is expected for MoE models - Unsloth handles MoE expert LoRA targeting separately.\n" + ] + } + ], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "LjY75GoYUCB8" + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZQkXuGYxbJ-e" + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "Mkq4RvEq7FQr", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 113, + "referenced_widgets": [ + "ea642c11633e49db979a42c731ee1d65", + "7d44ac1ab19148ddbeb30b5a154ad8ae", + "608c16dc8fc049c1aa16b44db90b3aba", + "9fe2a1a901af4445aed445bce8b40c83", + "caa699c0834f42c68854dd5d612dde74", + "c512cc070e8349408354f6c9454eb2b7", + "0302c405886540e9837f90608688c0be", + "1521c752798a47fb996da308bf41a27f", + "7208562807bb435b85271416df707e93", + "26779d9bd26b461e9df7846137d31213", + "9c3255be55bf4c1ea91f55754010961e", + "0921d7187ee24114880fa7d7b7db645d", + "f28157da9878442998595a29bda2f64b", + "13580885a8fc41acb660a155918fba88", + "90c1689829f242998f4b35bb8068d5f6", + "b9c0ae90bcbd498ab039c00f6d7c0017", + "dc0f07ea3fb74c9a9817e3c61a237211", + "22e5c73c269247f3915c216c9efb2a7e", + "ed6383465575471689ab4d8a2323da84", + "fb1419c94d254f38ae1007200c3cec92", + "a8bb4aa7409647c2b8949b14e67f8222", + "63dd480a71204e75b4bb7dd8ca76790f", + "3a0e9f6cd1014fd38ccd3ef2734b2929", + "7b0b5a0d6e474bb78ee8eac7281099b5", + "f8b0f6f04f734d4f8bb59c29ee163a42", + "e82867e03ef64048b0632e551a941eb3", + "33bd1e52d5094206942d06bbdab706cf", + "7818031043d44f27a87fa3574cc8c86e", + "38cca59244824cff98732887980d5172", + "ecc2db1896c244958fe0e79dd11b66bd", + "d838de584c474e8ea454a4c71185af61", + "bbdce42ed0704835ade22bd2a2f8c46c", + "750bfb16f1f442a2bd1e4b2ee021319b" + ] + }, + "outputId": "2ab453f2-3708-4f67-b137-dbd70ce21643" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "1ahE8Ys37JDJ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "89abc50a036d4faf9be10ceed297717b", + "fd4fe9ecb07b4a93b28cc23aff8c869d", + "10f5aeae5a594847aac7310d83942932", + "cbd6d8c7ed884edd9f53d56f8abfd194", + "aaf13b4c776146be9b377259caad3a9f", + "eceb4abf92b744df8973b3443e956ff5", + "4ed42a6b2ed541edaa51d5769589b234", + "f81f35d00b0443f5aff0a50382fca927", + "27abe44e35554d3e8338b50f494f7bd2", + "d07a25a3f10e47fa835d5d9ef6088e09", + "f37eb7bb43cc4409bfbfd827450dc4c0" + ] + }, + "outputId": "8fcfe6f4-5d8e-4f43-ca00-3ed0d290a09d" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "gGFzmplrEy9I", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + }, + "outputId": "2985589a-7ff8-4334-afde-3354f60e3ce6" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 13 + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "95_Nn-89DhsL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "c3d4dd1d33394f1a88ca079188777fe1", + "c1533ef6cb884d6e86a22519ed7125ce", + "824b65bd8b7a41baadbe6ddb79b17de4", + "c118b89131354eb98deaae78238b0210", + "89fccf64a5ca4b08b435b4223f42793e", + "a4b2ebf57ab144f4bff90820725b6108", + "f5b43de869004a42b2b9d0740aa455e7", + "85243a7a0b3a4abb891cf55828ba8b7a", + "a9805e75f7df4882a90770bf8a7a5530", + "b3ac166597b342ca8cbf4eb0b361e7a4", + "97802db0631649d79348faed67ba75ef" + ] + }, + "outputId": "fb94fdc8-f519-4b05-d689-525b6857cc89" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=16): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dv1NBUozV78l" + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "LtsMVtlkUhja", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + }, + "outputId": "e6063abd-0fbb-4ae7-d93a-500cbe5f9e5f" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Kyjy__m9KY3" + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "_rD6fl8EUxnG", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + }, + "outputId": "420e56a4-9651-45b4-d8f7-c33f3b7ff052" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "' <|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 17 + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7c222465-fa0f-467c-91d8-f2c6a2ad3938" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = NVIDIA A100-SXM4-80GB. Max memory = 79.251 GB.\n", + "46.416 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "c2db93ff-2bc9-4ebc-dcc5-36d484a7618c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 3,000 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 9,292,800 of 25,815,226,672 (0.04% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 20:53, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
11.781083
20.566694
30.878096
41.368889
51.104031
60.794103
70.815552
80.770014
90.916691
101.033089
111.126286
120.652004
130.769890
140.978357
150.766254
160.999658
171.138031
181.053890
191.042485
200.973515
210.605233
221.156014
230.922710
240.928817
250.575161
260.498077
270.613930
280.653096
290.572882
300.831407
310.706046
320.678690
331.082695
340.499532
350.965407
360.964235
370.643548
380.955152
390.993222
400.663521
410.862385
420.868709
430.650642
440.554028
450.584829
461.281055
470.672700
480.687023
490.953930
501.126283
510.532105
520.613895
530.654956
540.610443
550.815666
560.950072
570.495718
580.817099
590.894461
600.800382

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1e195e99-92bc-4b23-91a9-a9602d8035a7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1326.0614 seconds used for training.\n", + "22.1 minutes used for training.\n", + "Peak reserved memory = 48.988 GB.\n", + "Peak reserved memory for training = 2.572 GB.\n", + "Peak reserved memory % of max memory = 61.814 %.\n", + "Peak reserved memory for training % of max memory = 3.245 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-3` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "kR3gIAX-SM2q", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7c7c8ee7-33b3-474e-af73-7e743a706b57" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\n<|channel>thought\\n13, 21, 34, 55, 89, 144, ...\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones.']" + ], + "text/html": [ + "

['<bos><|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,<turn|>\\n<|turn>model\\n<|channel>thought\\n<channel|>13, 21, 34, 55, 89, 144, ...\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones.<turn|>']
" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-3 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CrSvZObor0lY" + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "e2pEuRb1r2Vg", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9ad7c937-8c04-46ba-d850-ce24f294ffc0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The sky is blue because of a phenomenon called **Rayleigh scattering**.\n", + "\n", + "Here is the step-by-step breakdown of why this happens:\n", + "\n", + "### 1. Sunlight is a spectrum of colors\n", + "Although sunlight looks white, it is actually made up of all the colors of the rainbow (red\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-3 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "upcOlWe7A1vc", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "42f363fe-2e66-41ef-9645-998f4b011299" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "MKX_XKs_BNZR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c05ee3db-0983-468f-bc1c-4a99b1ef1ac5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "Gemma 4 is a family of open weights large language models developed by Google DeepMind. \n", + "\n", + "Key characteristics of the Gemma 4 family include:\n", + "\n", + "* **Open Weights:** These models are released with open weights, allowing developers and researchers to customize, fine-tune, and deploy them in various applications.\n", + "* **Multimodal Capabilities:** Gemma 4 models are capable of understanding and processing both text and image inputs.\n", + "* **Audio Processing:** Within the Gemma 4 family, the 2B and 4B models also have the capability to process audio input.\n", + "* **Text Generation:** While\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-3 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "ZV-CiKPrIFG0" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "id": "FqfebeAdT073" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "ZgcJIhJ0I_es" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "provenance": [], + "machine_shape": "hm" + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "7769eb91dcb74e2b998cea8da27110c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c96e424cc8ba44c9ad664e4acc966e99", + "IPY_MODEL_8d33ff5f466e416ca3e3332a5fd15d59", + "IPY_MODEL_6dd24e24dccb4f76884a667a339889a5" + ], + "layout": "IPY_MODEL_f64b22ad99e54673944ad3ba7bde198b" + } + }, + "c96e424cc8ba44c9ad664e4acc966e99": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a6828f24aaad43d58bf87cbadbfdae20", + "placeholder": "​", + "style": "IPY_MODEL_e233f639b56b47ba813d231923e6234e", + "value": "model.safetensors.index.json: " + } + }, + "8d33ff5f466e416ca3e3332a5fd15d59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_692480d015c746ae9a97e09def1832c9", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6a6c3c78ddbd4e27a5886e47cf44e476", + "value": 1 + } + }, + "6dd24e24dccb4f76884a667a339889a5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1a3548fbc46e48cfb0df425c6b640467", + "placeholder": "​", + "style": "IPY_MODEL_62dd1228b1d0402ead07486077387640", + "value": " 103k/? [00:00<00:00, 9.53MB/s]" + } + }, + "f64b22ad99e54673944ad3ba7bde198b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a6828f24aaad43d58bf87cbadbfdae20": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e233f639b56b47ba813d231923e6234e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "692480d015c746ae9a97e09def1832c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "6a6c3c78ddbd4e27a5886e47cf44e476": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1a3548fbc46e48cfb0df425c6b640467": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "62dd1228b1d0402ead07486077387640": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "12c7026200d14b42b3d085995ab11a7a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7ca13c9cdb5c4b649c78793975295602", + "IPY_MODEL_1ff0ed429f7f4784a1846b62126e6288", + "IPY_MODEL_3bb8deb734824b119dc6a75a03671357" + ], + "layout": "IPY_MODEL_038f96ae1ed5480b9f209d268ae32cbd" + } + }, + "7ca13c9cdb5c4b649c78793975295602": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_670f3a9c0b2045cfa378a5aac8337396", + "placeholder": "​", + "style": "IPY_MODEL_6f5ce5cfa09f492e956109eda6f5b3f3", + "value": "Download complete: 100%" + } + }, + "1ff0ed429f7f4784a1846b62126e6288": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_8ebf11b7ab2142ceb3a1893d4f215dd3", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_604450c9e490468081c0577fb9d6116c", + "value": 1 + } + }, + "3bb8deb734824b119dc6a75a03671357": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5818f1d23c7e4fb9b0f2a8c7fd00f6d8", + "placeholder": "​", + "style": "IPY_MODEL_790cc60e62b74a0f83bee6b135407008", + "value": " 51.6G/51.6G [02:15<00:00, 374MB/s]" + } + }, + "038f96ae1ed5480b9f209d268ae32cbd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "670f3a9c0b2045cfa378a5aac8337396": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6f5ce5cfa09f492e956109eda6f5b3f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8ebf11b7ab2142ceb3a1893d4f215dd3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "604450c9e490468081c0577fb9d6116c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5818f1d23c7e4fb9b0f2a8c7fd00f6d8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "790cc60e62b74a0f83bee6b135407008": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "aa8461c3b0a048859b122f833cdd0588": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_15d3f86682a7499ba4a89a47c3eb2cc9", + "IPY_MODEL_193ff086d24f4ec79369788d1f23ce5b", + "IPY_MODEL_42d741ab6080460d86c7b25d69c83513" + ], + "layout": "IPY_MODEL_ca26a64b7c8141849e2af1c7926c8d4c" + } + }, + "15d3f86682a7499ba4a89a47c3eb2cc9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6caf778bd350418ab85f925401358cb7", + "placeholder": "​", + "style": "IPY_MODEL_4bcd980f165945358b2dd5bb46d852dd", + "value": "Fetching 2 files: 100%" + } + }, + "193ff086d24f4ec79369788d1f23ce5b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_361e586e6e55463a90f6b9dc4f536e0c", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_75b32154d6504abcb249e2c2e00c6afb", + "value": 2 + } + }, + "42d741ab6080460d86c7b25d69c83513": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c743597897874b0cbc8440fdf5eb3f7a", + "placeholder": "​", + "style": "IPY_MODEL_38de8ae3e68a4b1796aca83591ee8156", + "value": " 2/2 [02:15<00:00, 135.50s/it]" + } + }, + "ca26a64b7c8141849e2af1c7926c8d4c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6caf778bd350418ab85f925401358cb7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4bcd980f165945358b2dd5bb46d852dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "361e586e6e55463a90f6b9dc4f536e0c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "75b32154d6504abcb249e2c2e00c6afb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c743597897874b0cbc8440fdf5eb3f7a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "38de8ae3e68a4b1796aca83591ee8156": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4154a72354a8403dbe3369ba9c548fc7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c88bd79d9b5c4b0681930216611d5522", + "IPY_MODEL_a46f89db282041ff8cc4401bb8a4a636", + "IPY_MODEL_e50c40ce7c6b43fd9c347b915e2b6aab" + ], + "layout": "IPY_MODEL_8431c48be48e4720aec35e9bab52fa92" + } + }, + "c88bd79d9b5c4b0681930216611d5522": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f41e37a94c5c4b68a781b58c42fca4ff", + "placeholder": "​", + "style": "IPY_MODEL_0b4bf122609942de8afa64e37c61654b", + "value": "Loading weights: 100%" + } + }, + "a46f89db282041ff8cc4401bb8a4a636": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_e138b40042e54adaa94a1323fd9cc779", + "max": 1013, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f8adec579c1d43a68e1c9ed0a64718fc", + "value": 1013 + } + }, + "e50c40ce7c6b43fd9c347b915e2b6aab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b1c346a40483474097727972d6a05eef", + "placeholder": "​", + "style": "IPY_MODEL_e740ea8de695437588e91271aaa28928", + "value": " 1013/1013 [00:14<00:00, 547.14it/s]" + } + }, + "8431c48be48e4720aec35e9bab52fa92": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f41e37a94c5c4b68a781b58c42fca4ff": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0b4bf122609942de8afa64e37c61654b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e138b40042e54adaa94a1323fd9cc779": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f8adec579c1d43a68e1c9ed0a64718fc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b1c346a40483474097727972d6a05eef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e740ea8de695437588e91271aaa28928": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "517986179dc2406fba8401fd1a18c866": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b60c8f2bd64e4df7b1f3897ba20996c9", + "IPY_MODEL_d52aff7110844ba99567cd085f88f4fb", + "IPY_MODEL_f8aac8afada341a49d34f71feeb33086" + ], + "layout": "IPY_MODEL_29a3f7f177fd45ec98d5fdf5358e87e6" + } + }, + "b60c8f2bd64e4df7b1f3897ba20996c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7f04178813454a64b2e11ae328ddd975", + "placeholder": "​", + "style": "IPY_MODEL_19514ae2563642e7aafc05fdcd2d6eb9", + "value": "generation_config.json: 100%" + } + }, + "d52aff7110844ba99567cd085f88f4fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_e15263fc72d24bf3a6da6563d246bca2", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_35444cb6e46f4925895b17449663d323", + "value": 208 + } + }, + "f8aac8afada341a49d34f71feeb33086": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1f05fbc19f6d4c3c985093ae4502f677", + "placeholder": "​", + "style": "IPY_MODEL_92944bffeb3542cbb02ebe44fe67ff2b", + "value": " 208/208 [00:00<00:00, 28.3kB/s]" + } + }, + "29a3f7f177fd45ec98d5fdf5358e87e6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7f04178813454a64b2e11ae328ddd975": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "19514ae2563642e7aafc05fdcd2d6eb9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e15263fc72d24bf3a6da6563d246bca2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "35444cb6e46f4925895b17449663d323": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1f05fbc19f6d4c3c985093ae4502f677": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "92944bffeb3542cbb02ebe44fe67ff2b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9a181c75a14544a698eb5b5e16a7e27c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b4eda43ec55741ceab50a6ef8823641b", + "IPY_MODEL_de0d4fe3ef26497c968986714c4c1294", + "IPY_MODEL_53e8cc1b279b4cb68fe499416d20a28b" + ], + "layout": "IPY_MODEL_d5a0369d9ec94f018b8480620c458d0d" + } + }, + "b4eda43ec55741ceab50a6ef8823641b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a450acc04e4d4bf58177461b3b888397", + "placeholder": "​", + "style": "IPY_MODEL_0959671891b947a19ceb2f1d9677e7e5", + "value": "processor_config.json: " + } + }, + "de0d4fe3ef26497c968986714c4c1294": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_a885ae88241a4013b42b8f4d89d74f99", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5db37854f8c6430cac9a074903f4a766", + "value": 1 + } + }, + "53e8cc1b279b4cb68fe499416d20a28b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_77b5140635d14346bf7ae7fe1c905dff", + "placeholder": "​", + "style": "IPY_MODEL_9062490a257644d380adf6ef8a037694", + "value": " 1.69k/? [00:00<00:00, 182kB/s]" + } + }, + "d5a0369d9ec94f018b8480620c458d0d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a450acc04e4d4bf58177461b3b888397": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0959671891b947a19ceb2f1d9677e7e5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a885ae88241a4013b42b8f4d89d74f99": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "5db37854f8c6430cac9a074903f4a766": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "77b5140635d14346bf7ae7fe1c905dff": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9062490a257644d380adf6ef8a037694": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2d1ad39161c840d38be868b6b5d30e06": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_291e50a3d894436ab3691f49cdba7461", + "IPY_MODEL_43404477358b43ab890fc624fbbe093d", + "IPY_MODEL_c94cef24144246b38abf0669f99576a8" + ], + "layout": "IPY_MODEL_816a0b007a0e4dda8e41f11dd7d853d2" + } + }, + "291e50a3d894436ab3691f49cdba7461": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2b6016ee95894de5831bd86bc0dd4985", + "placeholder": "​", + "style": "IPY_MODEL_f9eeebd8dfe34fca81e472e14c21211a", + "value": "chat_template.jinja: " + } + }, + "43404477358b43ab890fc624fbbe093d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_7351cbc882f14b308be2c7732e56bb91", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4715a8e2e0f1442a8911832160ad2d47", + "value": 1 + } + }, + "c94cef24144246b38abf0669f99576a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_224b1b795ca840d4a06db069caae1e6d", + "placeholder": "​", + "style": "IPY_MODEL_6f31576ee8624861a649053804780272", + "value": " 12.0k/? [00:00<00:00, 1.25MB/s]" + } + }, + "816a0b007a0e4dda8e41f11dd7d853d2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2b6016ee95894de5831bd86bc0dd4985": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f9eeebd8dfe34fca81e472e14c21211a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7351cbc882f14b308be2c7732e56bb91": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "4715a8e2e0f1442a8911832160ad2d47": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "224b1b795ca840d4a06db069caae1e6d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6f31576ee8624861a649053804780272": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ea4c29f5f43a453e8494f835a6407024": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_88f39a67d2b941d683b52a3c44559525", + "IPY_MODEL_fd01935ca8d74ef5981e120f9c36868b", + "IPY_MODEL_422a169fb50048509742eb51dd7db278" + ], + "layout": "IPY_MODEL_46a247d88b904364a2c01b7a23adc16d" + } + }, + "88f39a67d2b941d683b52a3c44559525": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_751c3757c92e4b989bad2beaf0e72862", + "placeholder": "​", + "style": "IPY_MODEL_f069d89c19924879af9abb3cc8d71b64", + "value": "tokenizer_config.json: " + } + }, + "fd01935ca8d74ef5981e120f9c36868b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0e4d36725d4a4aea8c02ccaf3dd96eaf", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ca077b888e13430385998ae69c8b6175", + "value": 1 + } + }, + "422a169fb50048509742eb51dd7db278": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f53291e6d8d041c5b050722b334e6cab", + "placeholder": "​", + "style": "IPY_MODEL_1942ae9bfdf348b791c37a8bb211f29a", + "value": " 15.0k/? [00:00<00:00, 1.64MB/s]" + } + }, + "46a247d88b904364a2c01b7a23adc16d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "751c3757c92e4b989bad2beaf0e72862": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f069d89c19924879af9abb3cc8d71b64": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0e4d36725d4a4aea8c02ccaf3dd96eaf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "ca077b888e13430385998ae69c8b6175": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f53291e6d8d041c5b050722b334e6cab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1942ae9bfdf348b791c37a8bb211f29a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "22f7568e9caf4d728d63c52378b3d5a5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b0cbed05625145fdba2236b2264f0990", + "IPY_MODEL_ed26f2f3dc67495e8c5e66dd43f56988", + "IPY_MODEL_73bdd24fd1234a138bba9b248810769a" + ], + "layout": "IPY_MODEL_91886a707da84f88898e9eb1a5603766" + } + }, + "b0cbed05625145fdba2236b2264f0990": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c17e1dc079a8448d9cd3678aa841a4cf", + "placeholder": "​", + "style": "IPY_MODEL_8f96e18da1b940f1907df7daec6fe385", + "value": "tokenizer.json: 100%" + } + }, + "ed26f2f3dc67495e8c5e66dd43f56988": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_5880c5dc36154d699e40aacc9829efae", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f2e283218aaf4f7d826d44d87bc18b66", + "value": 32169626 + } + }, + "73bdd24fd1234a138bba9b248810769a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2e283e162b124bdcae47a501696bc9af", + "placeholder": "​", + "style": "IPY_MODEL_f3a176148e2e48d982f3362dd707d389", + "value": " 32.2M/32.2M [00:01<00:00, 161MB/s]" + } + }, + "91886a707da84f88898e9eb1a5603766": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c17e1dc079a8448d9cd3678aa841a4cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8f96e18da1b940f1907df7daec6fe385": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5880c5dc36154d699e40aacc9829efae": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f2e283218aaf4f7d826d44d87bc18b66": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2e283e162b124bdcae47a501696bc9af": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f3a176148e2e48d982f3362dd707d389": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ea642c11633e49db979a42c731ee1d65": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7d44ac1ab19148ddbeb30b5a154ad8ae", + "IPY_MODEL_608c16dc8fc049c1aa16b44db90b3aba", + "IPY_MODEL_9fe2a1a901af4445aed445bce8b40c83" + ], + "layout": "IPY_MODEL_caa699c0834f42c68854dd5d612dde74" + } + }, + "7d44ac1ab19148ddbeb30b5a154ad8ae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c512cc070e8349408354f6c9454eb2b7", + "placeholder": "​", + "style": "IPY_MODEL_0302c405886540e9837f90608688c0be", + "value": "README.md: 100%" + } + }, + "608c16dc8fc049c1aa16b44db90b3aba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1521c752798a47fb996da308bf41a27f", + "max": 982, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7208562807bb435b85271416df707e93", + "value": 982 + } + }, + "9fe2a1a901af4445aed445bce8b40c83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_26779d9bd26b461e9df7846137d31213", + "placeholder": "​", + "style": "IPY_MODEL_9c3255be55bf4c1ea91f55754010961e", + "value": " 982/982 [00:00<00:00, 112kB/s]" + } + }, + "caa699c0834f42c68854dd5d612dde74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c512cc070e8349408354f6c9454eb2b7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0302c405886540e9837f90608688c0be": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1521c752798a47fb996da308bf41a27f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7208562807bb435b85271416df707e93": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "26779d9bd26b461e9df7846137d31213": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9c3255be55bf4c1ea91f55754010961e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0921d7187ee24114880fa7d7b7db645d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_f28157da9878442998595a29bda2f64b", + "IPY_MODEL_13580885a8fc41acb660a155918fba88", + "IPY_MODEL_90c1689829f242998f4b35bb8068d5f6" + ], + "layout": "IPY_MODEL_b9c0ae90bcbd498ab039c00f6d7c0017" + } + }, + "f28157da9878442998595a29bda2f64b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_dc0f07ea3fb74c9a9817e3c61a237211", + "placeholder": "​", + "style": "IPY_MODEL_22e5c73c269247f3915c216c9efb2a7e", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "13580885a8fc41acb660a155918fba88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ed6383465575471689ab4d8a2323da84", + "max": 116531415, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fb1419c94d254f38ae1007200c3cec92", + "value": 116531415 + } + }, + "90c1689829f242998f4b35bb8068d5f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a8bb4aa7409647c2b8949b14e67f8222", + "placeholder": "​", + "style": "IPY_MODEL_63dd480a71204e75b4bb7dd8ca76790f", + "value": " 117M/117M [00:02<00:00, 581MB/s]" + } + }, + "b9c0ae90bcbd498ab039c00f6d7c0017": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "dc0f07ea3fb74c9a9817e3c61a237211": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "22e5c73c269247f3915c216c9efb2a7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ed6383465575471689ab4d8a2323da84": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fb1419c94d254f38ae1007200c3cec92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a8bb4aa7409647c2b8949b14e67f8222": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "63dd480a71204e75b4bb7dd8ca76790f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3a0e9f6cd1014fd38ccd3ef2734b2929": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7b0b5a0d6e474bb78ee8eac7281099b5", + "IPY_MODEL_f8b0f6f04f734d4f8bb59c29ee163a42", + "IPY_MODEL_e82867e03ef64048b0632e551a941eb3" + ], + "layout": "IPY_MODEL_33bd1e52d5094206942d06bbdab706cf" + } + }, + "7b0b5a0d6e474bb78ee8eac7281099b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7818031043d44f27a87fa3574cc8c86e", + "placeholder": "​", + "style": "IPY_MODEL_38cca59244824cff98732887980d5172", + "value": "Generating train split: 100%" + } + }, + "f8b0f6f04f734d4f8bb59c29ee163a42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ecc2db1896c244958fe0e79dd11b66bd", + "max": 100000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d838de584c474e8ea454a4c71185af61", + "value": 100000 + } + }, + "e82867e03ef64048b0632e551a941eb3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_bbdce42ed0704835ade22bd2a2f8c46c", + "placeholder": "​", + "style": "IPY_MODEL_750bfb16f1f442a2bd1e4b2ee021319b", + "value": " 100000/100000 [00:00<00:00, 144341.88 examples/s]" + } + }, + "33bd1e52d5094206942d06bbdab706cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7818031043d44f27a87fa3574cc8c86e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "38cca59244824cff98732887980d5172": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ecc2db1896c244958fe0e79dd11b66bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d838de584c474e8ea454a4c71185af61": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "bbdce42ed0704835ade22bd2a2f8c46c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "750bfb16f1f442a2bd1e4b2ee021319b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3a8bada54de24005878735b98d444f29": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_8eded708fd6742cc96cec313c512b0f0", + "IPY_MODEL_b9c5d9b844874196ae366f285e49ebfe", + "IPY_MODEL_b40f36a643b242dfbaf1ffd475e83da2" + ], + "layout": "IPY_MODEL_45a9724053244ca998c84a5e0a81c1b9" + } + }, + "8eded708fd6742cc96cec313c512b0f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_89d693d6c7a142c68c7802423585b151", + "placeholder": "​", + "style": "IPY_MODEL_a2c6355a6a6b4ef787cbeba481410426", + "value": "Unsloth: Standardizing formats (num_proc=16): 100%" + } + }, + "b9c5d9b844874196ae366f285e49ebfe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_76fd0b3eac784c53943244976d315519", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_50ffb521dbd1411bb0d8537d3bd4b6d0", + "value": 3000 + } + }, + "b40f36a643b242dfbaf1ffd475e83da2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_20c834cf533442388acf92187ee4445e", + "placeholder": "​", + "style": "IPY_MODEL_9dcb860a29474e5b93713073549d35f1", + "value": " 3000/3000 [00:01<00:00, 212.69 examples/s]" + } + }, + "45a9724053244ca998c84a5e0a81c1b9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "89d693d6c7a142c68c7802423585b151": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a2c6355a6a6b4ef787cbeba481410426": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "76fd0b3eac784c53943244976d315519": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "50ffb521dbd1411bb0d8537d3bd4b6d0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "20c834cf533442388acf92187ee4445e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9dcb860a29474e5b93713073549d35f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "89abc50a036d4faf9be10ceed297717b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_fd4fe9ecb07b4a93b28cc23aff8c869d", + "IPY_MODEL_10f5aeae5a594847aac7310d83942932", + "IPY_MODEL_cbd6d8c7ed884edd9f53d56f8abfd194" + ], + "layout": "IPY_MODEL_aaf13b4c776146be9b377259caad3a9f" + } + }, + "fd4fe9ecb07b4a93b28cc23aff8c869d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_eceb4abf92b744df8973b3443e956ff5", + "placeholder": "​", + "style": "IPY_MODEL_4ed42a6b2ed541edaa51d5769589b234", + "value": "Map: 100%" + } + }, + "10f5aeae5a594847aac7310d83942932": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_f81f35d00b0443f5aff0a50382fca927", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_27abe44e35554d3e8338b50f494f7bd2", + "value": 3000 + } + }, + "cbd6d8c7ed884edd9f53d56f8abfd194": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d07a25a3f10e47fa835d5d9ef6088e09", + "placeholder": "​", + "style": "IPY_MODEL_f37eb7bb43cc4409bfbfd827450dc4c0", + "value": " 3000/3000 [00:00<00:00, 9363.26 examples/s]" + } + }, + "aaf13b4c776146be9b377259caad3a9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "eceb4abf92b744df8973b3443e956ff5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4ed42a6b2ed541edaa51d5769589b234": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f81f35d00b0443f5aff0a50382fca927": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "27abe44e35554d3e8338b50f494f7bd2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d07a25a3f10e47fa835d5d9ef6088e09": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f37eb7bb43cc4409bfbfd827450dc4c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c3d4dd1d33394f1a88ca079188777fe1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c1533ef6cb884d6e86a22519ed7125ce", + "IPY_MODEL_824b65bd8b7a41baadbe6ddb79b17de4", + "IPY_MODEL_c118b89131354eb98deaae78238b0210" + ], + "layout": "IPY_MODEL_89fccf64a5ca4b08b435b4223f42793e" + } + }, + "c1533ef6cb884d6e86a22519ed7125ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a4b2ebf57ab144f4bff90820725b6108", + "placeholder": "​", + "style": "IPY_MODEL_f5b43de869004a42b2b9d0740aa455e7", + "value": "Unsloth: Tokenizing ["text"] (num_proc=16): 100%" + } + }, + "824b65bd8b7a41baadbe6ddb79b17de4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_85243a7a0b3a4abb891cf55828ba8b7a", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a9805e75f7df4882a90770bf8a7a5530", + "value": 3000 + } + }, + "c118b89131354eb98deaae78238b0210": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b3ac166597b342ca8cbf4eb0b361e7a4", + "placeholder": "​", + "style": "IPY_MODEL_97802db0631649d79348faed67ba75ef", + "value": " 3000/3000 [01:19<00:00, 39.23 examples/s]" + } + }, + "89fccf64a5ca4b08b435b4223f42793e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a4b2ebf57ab144f4bff90820725b6108": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f5b43de869004a42b2b9d0740aa455e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "85243a7a0b3a4abb891cf55828ba8b7a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a9805e75f7df4882a90770bf8a7a5530": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b3ac166597b342ca8cbf4eb0b361e7a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "97802db0631649d79348faed67ba75ef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6c2f48e8343b4722bc30bb62d94ea55f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e2755c541dad407ba30990db458f29e4", + "IPY_MODEL_927ce392ba2a403081cb68ddf07fcc78", + "IPY_MODEL_c0e8470e86fd4f34b8adff7ac78ae0cd" + ], + "layout": "IPY_MODEL_ecbed13d665c454da7f835028d56e590" + } + }, + "e2755c541dad407ba30990db458f29e4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_89d74579171d48668c0542e20fbe877c", + "placeholder": "​", + "style": "IPY_MODEL_e03a39c6a9354ed9a018e2487f073d59", + "value": "Map (num_proc=16): 100%" + } + }, + "927ce392ba2a403081cb68ddf07fcc78": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_29c397be81794e3aaf80ff115b1bd8fe", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b8c562d039ca4c9bba34c03f10dd65a7", + "value": 3000 + } + }, + "c0e8470e86fd4f34b8adff7ac78ae0cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0e3d391c4f8d42318f19ba0f832a4438", + "placeholder": "​", + "style": "IPY_MODEL_92015d6aa1274b69a48acafff7cc1abe", + "value": " 3000/3000 [00:01<00:00, 3380.93 examples/s]" + } + }, + "ecbed13d665c454da7f835028d56e590": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "89d74579171d48668c0542e20fbe877c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e03a39c6a9354ed9a018e2487f073d59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "29c397be81794e3aaf80ff115b1bd8fe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b8c562d039ca4c9bba34c03f10dd65a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0e3d391c4f8d42318f19ba0f832a4438": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "92015d6aa1274b69a48acafff7cc1abe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3802243f57e44bbe993ec24f6a8c3fee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1429ff4a23174e25b800190869b5aa4a", + "IPY_MODEL_9644878b1d71428ca8bf953423132e1a", + "IPY_MODEL_7eb91b277e664af291ede6355337cae6" + ], + "layout": "IPY_MODEL_bb05f72207104b9a854ef607a034330a" + } + }, + "1429ff4a23174e25b800190869b5aa4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8f4a1acdc33a4d42be4af93b5ac94d2f", + "placeholder": "​", + "style": "IPY_MODEL_851ab005663641dd92883ee29796768b", + "value": "Filter (num_proc=16): 100%" + } + }, + "9644878b1d71428ca8bf953423132e1a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0fa697ca6068489ea5c7acb5f6d9c4bd", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8501848fec5c4e51a213b86aeac44213", + "value": 3000 + } + }, + "7eb91b277e664af291ede6355337cae6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_97d6b96094d34d6985855ba18a5f329b", + "placeholder": "​", + "style": "IPY_MODEL_9ed61906d50b444da7e8a22a636c65ac", + "value": " 3000/3000 [00:01<00:00, 1704.62 examples/s]" + } + }, + "bb05f72207104b9a854ef607a034330a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8f4a1acdc33a4d42be4af93b5ac94d2f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "851ab005663641dd92883ee29796768b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0fa697ca6068489ea5c7acb5f6d9c4bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8501848fec5c4e51a213b86aeac44213": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "97d6b96094d34d6985855ba18a5f329b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9ed61906d50b444da7e8a22a636c65ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Vision.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Vision.ipynb new file mode 100644 index 0000000..814e36e --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(26B_A4B)-Vision.ipynb @@ -0,0 +1,6426 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "gOpYt-Zgspvw" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab A100 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xNElsIzospvw" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZzyYx8-dspvx" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bgKLV2s1spvx" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "f6leZW9xspvx" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "Yxkkpa5ospvx" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GFOEZbP7ONMs" + }, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "QmUBVEnvCDJv", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 461, + "referenced_widgets": [ + "7a0fef44174146c98c37ecedecf45d39", + "84760c4a858e46799d253ed3ed86864b", + "451c2f99255e481fb940b0fbf6ddcb58", + "da843bee4e4643eba56b23c2c77aff70", + "82cbe0e382ec49faba78de7b6076b0cf", + "43cac410ebb9427aa7b02011287fb0e6", + "b6e3107751ed469f918b08dbe981c84d", + "0dae1b24c79f4cabba0fc8509b191360", + "ee0d046105cf4d69b9bad9c06978227a", + "f9cffd18bda8431f8a3bede12812168d", + "73a74bcdebc0483db57f9bde93dc3b41", + "2832a79a4f824c4c8f95a2a626582ba6", + "e150eaba931d4f649f6a9c64f1dda02c", + "358cbf15de2b4b00a1e708e7f6e29bb8", + "6f425cd96d5349fa816d9dc0584847b2", + "4893d81e6e984c8ca738593658719209", + "a4bf50d66e8040da9d3b5271f2187dcd", + "49e5b3f23ed84e3cb1a57a7e63788b07", + "521e891f3e594a9e95f233aadf1c4dfa", + "8c143f5422ee486f8716091a0a191ddf", + "dcbdcfc579364725859f64933cd2dec8", + "6630c1be8c1f4c50b9d17d0ba774365d", + "2e2c558295f0452ea3c09bcd29685a36", + "212cb67858a0498c96f3a8bfc16e0544", + "6d8e427e07704af581a52d81c03d289d", + "b11e6e50cb58496db7e763c090fb72da", + "b8c82d51698e4754b611e4589809d729", + "5b5ea275ee2f47359c726ab08a022189", + "e0b83356e66b4095982601c6a76a91f6", + "5120f72dd76945f1b1cb000eb3bfde0f", + "27edb4245f3d4b03b64164333a90848a", + "79322768faff475499be0ebb67805a65", + "bb09f0eaaa2c4e4bb248d490501b488e", + "e2d8bc90d34f45d6b68abf2b22a3e9a7", + "ff60dfd2948b4279b6cbda74b37c33b2", + "0e0b9c3f46aa477c8f9c6d3a26bd63cf", + "4af204e557cb4cc28586af24956dd3b0", + "0b4f98b868f8451d8cb99f6190321c8d", + "4082b09ab6c749c49d71d368cdf85141", + "e98bb563f163410b99017d1985d4ca2a", + "25048b0ead8f4484b2d5017491823090", + "28078c7802c4429b9baf4c7a7b7c72a1", + "509af22adf884b03ba262bd41ff8ea75", + "758c27fab7674b248981c8eb67d3d60e", + "39da2c555af34b0dbee8a65ba82c0ef5", + "2caf91d8b96246d8b0a2e7f2cc3eb326", + "a64f5ed11fc2481aa79ff65998d216c6", + "2081138477dc4a59b0932d099c5c91e3", + "4d1e5c4c438044188d0572c54d56f851", + "c7d8ec30f492459296878ae9b8c92f73", + "44b23794497242938bcb8b2b193b4758", + "0bc564d52fbd4636b18d77f49a793be0", + "724731bdf7d64e208c8da43df88d3916", + "d31c33be9b50430c84e099c561e8491a", + "a69f172b151a41b3afdf594e8300dd63", + "853c106980d745abbcec56ab94573120", + "e5385ae4aa5a4b62a1c01f1f0b7be3e6", + "04e9e69091fe45e0b7bd59cee36f23e3", + "5410c1cc987741f8b68318ab56336621", + "86cec3facded4f8eb655afc878cecc96", + "2ab5080fa805496d99219628cfc534c5", + "b01770b4e0074b2582f03bb4ac34b68f", + "d63b8fd5ca6a401a9c760c6405731a82", + "b7ec7200facb477283dc5de798770e2f", + "1d96a405a2024cf7b380844283029ed3", + "60a6115cbfba408fbda48a00ace7afc1", + "d25954e26fbd407fa5430a78ba49a0b3", + "7b3356198bac4650b26cb10fb6724694", + "1906304d8f6c4163b9484a4fcc0d2cde", + "56e0cc76ccb54253adb3cd26b3113c2b", + "7704ce4caa804b7c8007f6301e774d9f", + "3607b98e5dfb47faa77ae97560951467", + "45e788079b654d2b89c4665faf42d1fd", + "48b508296aa54d729314e2a2c24160dd", + "dcbfd0eaa87b40ee8157fe3aa489ec4d", + "b65aa8c218fe4b039bba43def6756e9c", + "cf60ba5586f14a93a8df74129e2b06aa", + "5450e335cdc248c1bd43e5d18002ebaa", + "c019419080b74a96ada7632a57dd8485", + "9d120705e8c447abb09bc20843da23f4", + "47837cac654c4f05921f1029b6718815", + "c1ba8e990adb4c3aa63d786ec8e93af7", + "e2e92f6bcf934ad8bf00cf6b2aef3ba4", + "bb44124af9914c29aa02aee3dfc214a0", + "47ac15c001a6445c94781c8746012cd4", + "462243e2ef5d4635a9ab6df9e5779f6c", + "c9de48023b9e4625ac8b32c87ffa92dd", + "4586b977bb6f4c739bb9fa5819cabfc6", + "43ee4b1bf75542309a1622da87399e6d", + "a5f0c555837c427d932cd4ab3b372889", + "4486f8a8e17c48ac8056d1337e221050", + "f840f357c01a49e6a77b1be045aa7d12", + "8aa47b7fd9924cf4869f9e14b5b4ead5", + "c489d961ea974c40a4e1f24b44aa0a2a", + "f51553d1142b4697ad396bee6fb7b21d", + "2af0f039d0304149a1f997d053b84405", + "91f37acd8eb844f4a18825bdc3e1f6c2", + "6ee677fbe8094e34a85628f69273cbca", + "7b5b3e29daf5435a80eae703f4a23444" + ] + }, + "outputId": "b63f747d-32a4-470f-b489-cad13b3b20f9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "Unsloth: Your Flash Attention 2 installation seems to be broken. Using Xformers instead. No performance changes will be seen.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| NVIDIA A100-SXM4-80GB. Num GPUs = 1. Max memory: 79.251 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 8.0. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = TRUE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors.index.json: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "7a0fef44174146c98c37ecedecf45d39" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (incomplete total...): 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "2832a79a4f824c4c8f95a2a626582ba6" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Fetching 2 files: 0%| | 0/2 [00:00\n", + "### Data Prep\n", + "We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions.\n", + "\n", + "You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "LjY75GoYUCB8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "referenced_widgets": [ + "e6cf365cf0674a8884e0c8ac8f8280e8", + "7e30c5c4c96d48e3a78689e33caafcd3", + "7de02d7843554276ad002c048a27c0d0", + "96cfbd5b4f314ea4841878182a7efe76", + "562d09896c604940922612e0e07f9c65", + "6f4bfaeacaa94fe9a5e6183255c23610", + "bda1c422c31a400abab7180489c6827a", + "c7ea3a7037814db68f2e49efc250dc53", + "314fc72dcdde4fe0b9b59439f0008a3d", + "48e085b16ef14d99b042debed39dcb6c", + "54a8a8e37c3d49158c65380451eb8712", + "9a6f19b03be84e5aa83b969363d08266", + "81f70c633bc4400e8a87c1cba5c878cb", + "4384402858074f76a55cc80ff7ea31f4", + "8fc9de0fd3964947a7f98a091b81d4a2", + "8c1a59d63151455e8d6008943028bfed", + "ac2d18a0024d4f9292e96f5b2ffc454d", + "b855d3442a164d599f2e7462f153fa95", + "4e5d2c84e7b2409bbb1d45e6d4130821", + "9f3d00003e14495e8a4fb3cfb563e13e", + "7fe02defa2cb4928ae9fbd155c02caee", + "5762804fcc6a477dbaaff1622e67752d", + "44475c29f3e74859a22b79e426cbff03", + "a1d0d7eed4b349e69421762f608a2da0", + "5955b2caad154badb366ab1dc729bf85", + "3203efbc3d4b4195abe86d53b48b8b77", + "e220f3b014f946fa9751a4d39ed0303c", + "beda7d7f24cb413ebcdb42f238dc89bd", + "ec5e1b08549d47ca99a7857a97b94022", + "1355eb5a553a4f87b4a5a6dda9b1160c", + "67fc62df6f6a411c96cb8769f241a810", + "1a2dd7eb1fc94f49b65c10b677b26684", + "60936221bc13459c8adefcc141ac7165", + "079918351e0f463bba0cc030663acffc", + "fa068bcbf12a4f9b8d92f0dad7ee4c71", + "20ded9b9c93a4e07a946e13bbb68062d", + "8845926888a448f98a2d32eddfb9f710", + "a2c4067b539d42a0ab8a71a2ec05742f", + "d212975985c24093951238bf6b32f85b", + "3f674fdc9dbc421386f653c880926d96", + "29d34168eb7c408486892b2b17f279b9", + "00bb9e9c8b124008af2a01ed6ca53b13", + "08279df17aad4a6080e6fe784d5b9e81", + "aaa881bedb974089931e8eee3b193769", + "e89e685da18542fca578ff9bd9aaa8cb", + "56e57386c76b437c8e523405dbc74d89", + "cebedffd8b49445e9721acaa3301d4ea", + "f59d8fb192174fce8983987a2a299e77", + "3aaf75c2b9754b6298cdf346d51a4516", + "01baf8e6d6b944529659448e08efe79c", + "0403261c40634c8daac850bd575fc966", + "8e8c01da153245c8b4e942dae53e2dd2", + "0bf222211e5a4e9cba517790a6089144", + "26a7d1ec9dda441f9b1f99052b082422", + "b5eb5d5fe03543ac9327188d0311bcda" + ] + }, + "outputId": "f5358882-f875-4091-f503-f1b43305c604" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/519 [00:00" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUAAAAAyCAIAAACib5WDAAAYrUlEQVR4Ae3cebSuUx0HcCSFEBHKlNZCQi2zureMyTwrY2UeQlSaXNdQxjSSMltFSJF5bjCzDMuilUUUIjSKotLtc+83+z73eYd7znve877n3vXuP56zn/389m/av2FP75l10qRJswzKQAMDDcyYGphtxmS7P1wPgl1/9N4nqoZ77I/4TOvA3dU+bP/5z39mnXXWPtnSgGwfNGC4lf/+9799oD1kkjOnA1N6tD9kPUwHELbZZ5/9hRde+Oc//zkd0Ol9FgteffXVsR/apyfHTP6dCT3zzDP/+Mc/ZpttTPvImGauYxuh9BdffPHvf//7v/71r46RpCNPM5Zc7uijj37729/+ne98J9m4Y7Riwete9zpPKb1jJIOOo6qBjPinP/3pt7zlLddcc82///1vBjCqFDtHzhxnpsIraP/nP//5IossMvfcc3/5y18mHTfuWMZky0022YSKf/rTnwrJSHSMTd8//vGP55133qabbvr888/Dg9uOsQ06jpIG4sCvvPLKxhtvbNzFboS48SiRGwnamTADS25i5+abbz7PPPMYg85j2yyz8F7J/IYbbrjyyiu/8pWvwPmGN7xB/uwAp0HSy7xggw02uO2222688cbXv/71HeAZdOmBBpiQYoAuv/zy973vfccee+xf//pXa6gMYg8YGAaJkXj/WOub3HjVVVfxsb/85S+m0JasI2EyqVs4gNACmD8rI0Go+9/+9jcYllpqKalYZZCBR6LPUe2blHv77bdzp2OOOQatkUzlRonV2Yfh62MelDNImBxYsJxzzjlly66wbCrO8cRjyA3DSHCK6/POO6/JM+NQHwmqbvUl0RjhpFsSTRdPBnG6UovaIFdffXWQpk7TRdsXgJlnCk3XfEyMPPPMMw8++OA55pgj8XLkahUXIMmojxwbPCxj5Hi6hWG6dtwtQmMHD5GHKDWwTOLG1JBVNdmJAzNoCaSKZezUX375ZRqXMKeM0VDHqZf8D9F0esOSaCK3ZBrfG4pjgQojUYYYkU278DxE4N5L14kDE6mLGzBU0xXtWABT33e/+13PDTfc0DOq771O21MkbFJ6F91migqHp8Z0sTez8sorW94LK1qqnAeg2tL3urgc1TXlxCcATT+Vxixrv/SlL33xi18kcmymfJ0RK00cmFTkVFQoRUmLp0kpIR3STJw4EYB6bdSHpQJ94ZycJae971IolvEoLWGpFRUILS/NdtZbbz0w7R0YqqqNtsfciuJw2yPs/PPPb33umdfhIqnBFx3W1FgDa3wFjw1jqlLdrqdtwIW3kQxxI9HGFvxPMbfJ9la+ptEzzGhnDEa2OqbVrwB8AlBspqAqFYKAIReYPAvyAjPDVZo4sB0gCVZRIbCSFk8LSzJffPHFRx11VFXdnYlNiXBKAgoqBUmhWBYepSUsFchSMTYYlknOPvtswwNh+dSqAlWxUTCtMLfq3lk7S3388cfPPffcxx57zFM9cbAzbHoRHOe23J9++umXXnqpqsamOA2f2SN31fGCCy5Ya621jOl73vOeww47jDYwEyvXF8I//elPKto1NsWWRthEgTb2oHsbDPifYm6T7a1QSaNnJIr3/vjHP77++uvBBFv5Gj/0CUBTHw6HCRNO4J3nX3311Ysttli2poItmgHTJgQU9sZOZarKwpOROO200/785z+TiiRbb7219lxGIZvbEXvsscc555zzqU99yjavFqrvQBjIFR0///nP/+hHP1I/5ZRTHJozAght3N9///2sxwbghz70IWBarrvuOpaEpQ9/+MNrrrmmLo3G6uDXIY30izfjAb4Vb4z41FNP/dnPfrbffvtB+PGPf3y++ebbZpttxo8fr2MJHK26d9wOuSNl04TDDz/8d7/7nfqee+7ZMTYdyXjkkUf+5Cc/eec73/mLX/zC0Gy22Wa01CjCZI1PmvTkk0/+8pe/3GWXXfR985vfTN7vf//7H/vYx3JjIZzcddddAjTH/tWvfrXoooti8o1vfGNoBaA8jRcvEol23nnnueaaq7TXKm0Ggr1973vf+/3vf6+7Kclee+1lUsDfTj75ZPEI/o022shwE8ftl69//euXXnopKfQycG9605vKkGl817veteWWW7LJj370o0UDNQ7dw1lppZWeeuopA7HPPvuwE6xO1su0mqnxP6Zfw32epCI55wnHZ511ltDOJahVi+QmYwhd6txJF9qpdh96HRXAa6+9ttj/3HPPPfLIIwxF1MCAAeC6biyiwm4SSjzTgiVf0QVZJRdOEp4du/tkjKsApa6jXS5fP/GJTyDhvqtPv/nNb9T333//Wscg4WyChbH3tUa3oO19JSJLJjjHP1ZlVG7geBmTjXym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\n", + "image/jpeg": "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\n" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "dataset[2][\"image\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "lXjfJr4W6z8P", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "0f9c8018-ae97-4118-9f28-c97f3e7b6b1d" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'H ^ { \\\\prime } = \\\\beta N \\\\int d \\\\lambda \\\\biggl \\\\{ \\\\frac { 1 } { 2 \\\\beta ^ { 2 } N ^ { 2 } } \\\\partial _ { \\\\lambda } \\\\zeta ^ { \\\\dagger } \\\\partial _ { \\\\lambda } \\\\zeta + V ( \\\\lambda ) \\\\zeta ^ { \\\\dagger } \\\\zeta \\\\biggr \\\\} \\\\ .'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "dataset[2][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rKHxfZua1CrS" + }, + "source": [ + "We can also render LaTeX directly in the browser!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "nPopsxAC1CrS", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "859f1f54-03ca-42c6-83ee-9fded7ad2d07" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/latex": "$\\displaystyle \\sigma ^ { \\mu } \\frac { \\lambda ^ { a } } { 2 } A _ { \\mu } ^ { a } .$" + }, + "metadata": {} + } + ], + "source": [ + "from IPython.display import display, Math, Latex\n", + "\n", + "latex = dataset[3][\"text\"]\n", + "display(Math(latex))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K9CBpiISFa6C" + }, + "source": [ + "To format the dataset, all vision fine-tuning tasks should follow this format:\n", + "\n", + "```python\n", + "[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "oPXzJZzHEgXe" + }, + "outputs": [], + "source": [ + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "def convert_to_conversation(sample):\n", + " conversation = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": sample[\"text\"]}]},\n", + " ]\n", + " return {\"messages\": conversation}\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FY-9u-OD6_gE" + }, + "source": [ + "Let's convert the dataset into the \"correct\" format for finetuning:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "gFW2qXIr7Ezy" + }, + "outputs": [], + "source": [ + "converted_dataset = [convert_to_conversation(sample) for sample in dataset]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "The first example is now structured like below:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "gGFzmplrEy9I", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "2b05e49c-bc65-494c-cba5-e70d41c0f1a9" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'messages': [{'role': 'user',\n", + " 'content': [{'type': 'text',\n", + " 'text': 'Write the LaTeX representation for this image.'},\n", + " {'type': 'image',\n", + " 'image': }]},\n", + " {'role': 'assistant',\n", + " 'content': [{'type': 'text',\n", + " 'text': '{ \\\\frac { N } { M } } \\\\in { \\\\bf Z } , { \\\\frac { M } { P } } \\\\in { \\\\bf Z } , { \\\\frac { P } { Q } } \\\\in { \\\\bf Z }'}]}]}" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ], + "source": [ + "converted_dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MsRPBIb0JJ6c" + }, + "source": [ + "Lets take the Gemma 4 instruction chat template and use it in our base model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "exoDVEvmJN-6" + }, + "outputs": [], + "source": [ + "from unsloth import get_chat_template\n", + "\n", + "processor = get_chat_template(\n", + " processor,\n", + " \"gemma-4-thinking\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FecKS-dA82f5" + }, + "source": [ + "Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "vcat4UxA81vr", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8514dfc7-67d1-4568-fab8-8139bd56ac6b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The LaTeX representation for the equation in the image is:\n", + "\n", + "```latex\n", + "H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\zeta^\\dagger \\partial_\\lambda \\zeta + \\mathcal{V}(\\lambda) \\zeta^\\dagger \\zeta \\right\\}\n", + "```\n", + "\n", + "When rendered, it looks like this:\n", + "$H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\zeta^\\dagger \\\n" + ] + } + ], + "source": [ + "image = dataset[2][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FeAiMlQ71CrS" + }, + "source": [ + "You can see it's absolutely terrible! It doesn't follow instructions at all" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning!\n", + "\n", + "We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "95_Nn-89DhsL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d9c94f8e-d6ef-4f64-ca13-428028335b88" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = converted_dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 4,\n", + " max_grad_norm = 0.3,\n", + " warmup_ratio = 0.03,\n", + " max_steps = 60,\n", + " # num_train_epochs = 2, # Set this instead of max_steps for full training runs\n", + " learning_rate = 2e-4,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\", # For Weights and Biases or others\n", + "\n", + " # You MUST put the below items for vision finetuning:\n", + " remove_unused_columns = False,\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 2048,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "99c38b86-0096-4319-ba4b-7cf3d76681b1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = NVIDIA A100-SXM4-80GB. Max memory = 79.251 GB.\n", + "46.615 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "34c1db7c-d3b0-414c-b281-7eb01421bfbf" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 68,686 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 59,275,776 of 25,865,209,648 (0.23% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 18:34, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
12.986776
23.611241
33.235800
43.207892
52.393348
61.994182
71.238167
81.074898
91.115454
100.414163
110.488537
120.463625
130.485965
140.257269
150.223266
160.299220
170.228006
180.165416
190.214501
200.163012
210.160776
220.227581
230.252964
240.154257
250.162097
260.201924
270.192899
280.150303
290.220560
300.132235
310.154113
320.265951
330.128669
340.118749
350.169299
360.130528
370.099769
380.122619
390.148352
400.202640
410.163365
420.065318
430.185360
440.124109
450.060225
460.107721
470.129032
480.118885
490.188991
500.109477
510.080716
520.167722
530.136780
540.125553
550.158793
560.392148
570.100937
580.066817
590.181567
600.087730

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "f9f14f4d-75bb-4423-ddc3-e79677d21d8a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1187.0917 seconds used for training.\n", + "19.78 minutes used for training.\n", + "Peak reserved memory = 46.926 GB.\n", + "Peak reserved memory for training = 0.311 GB.\n", + "Peak reserved memory % of max memory = 59.212 %.\n", + "Peak reserved memory for training % of max memory = 0.392 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model! You can modify the instruction and input—just leave the output blank.\n", + "\n", + "We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "kR3gIAX-SM2q", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "76204120-8c3f-49b4-a5e2-f1e66a5b7f3a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "[ [ B _ { n } ^ { + } , b _ { 2 } ^ { - } ] , b _ { 2 } ^ { + } ] = n B _ { n } ^ { + } , \\quad [ [ B _ { n } ^ { - } , b _ { 2 } ^ { + } ] , b _ { 2 } ^ { - } ] = n B _ { n } ^ { - } .\n" + ] + } + ], + "source": [ + "image = dataset[10][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "upcOlWe7A1vc", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "a5558703-774e-4d23-9794-0c3fbc5ccad4" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "MKX_XKs_BNZR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "f214eeec-cf71-4e48-a13f-144ef5bf37ce" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The image shows a mathematical expression in tensor notation, likely from a physics context (such as general relativity or gauge theory).\n", + "\n", + "The expression is:\n", + "$$D _ { \\mu } ^ { \\alpha \\beta } \\bar { A } _ { \\mu } ^ { \\alpha \\beta } = 0 ,$$\n", + "\n", + "### Breakdown of the notation:\n", + "* **$D$**: Represents a covariant derivative.\n", + "* **$\\mu$**: The index being contracted.\n", + "* **$\\alpha, \\beta$**: Indices representing the tensor components.\n", + "* **$\\bar{A\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastVisionModel\n", + "\n", + " model, processor = FastVisionModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " load_in_4bit = True, # Set to False for 16bit LoRA\n", + " )\n", + "\n", + "sample = dataset[1]\n", + "image = sample[\"image\"].convert(\"RGB\")\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": sample[\"text\"],\n", + " },\n", + " {\n", + " \"type\": \"image\",\n", + " },\n", + " ],\n", + " },\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True)\n", + "_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "# Select ONLY 1 to save! (Both not needed!)\n", + "\n", + "# Save locally to 16bit\n", + "if False: model.save_pretrained_merged(\"unsloth_finetune\", processor,)\n", + "\n", + "# To export and save to your Hugging Face account\n", + "if False: model.push_to_hub_merged(\"YOUR_USERNAME/unsloth_finetune\", processor, token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TSjNVDCYv-yr" + }, + "source": [ + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.13.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "7a0fef44174146c98c37ecedecf45d39": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_84760c4a858e46799d253ed3ed86864b", + "IPY_MODEL_451c2f99255e481fb940b0fbf6ddcb58", + "IPY_MODEL_da843bee4e4643eba56b23c2c77aff70" + ], + "layout": "IPY_MODEL_82cbe0e382ec49faba78de7b6076b0cf" + } + }, + "84760c4a858e46799d253ed3ed86864b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_43cac410ebb9427aa7b02011287fb0e6", + "placeholder": "​", + "style": "IPY_MODEL_b6e3107751ed469f918b08dbe981c84d", + "value": "model.safetensors.index.json: " + } + }, + "451c2f99255e481fb940b0fbf6ddcb58": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0dae1b24c79f4cabba0fc8509b191360", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ee0d046105cf4d69b9bad9c06978227a", + "value": 1 + } + }, + "da843bee4e4643eba56b23c2c77aff70": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f9cffd18bda8431f8a3bede12812168d", + "placeholder": "​", + "style": "IPY_MODEL_73a74bcdebc0483db57f9bde93dc3b41", + "value": " 103k/? [00:00<00:00, 9.53MB/s]" + } + }, + "82cbe0e382ec49faba78de7b6076b0cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "43cac410ebb9427aa7b02011287fb0e6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b6e3107751ed469f918b08dbe981c84d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0dae1b24c79f4cabba0fc8509b191360": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "ee0d046105cf4d69b9bad9c06978227a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f9cffd18bda8431f8a3bede12812168d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "73a74bcdebc0483db57f9bde93dc3b41": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2832a79a4f824c4c8f95a2a626582ba6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e150eaba931d4f649f6a9c64f1dda02c", + "IPY_MODEL_358cbf15de2b4b00a1e708e7f6e29bb8", + "IPY_MODEL_6f425cd96d5349fa816d9dc0584847b2" + ], + "layout": "IPY_MODEL_4893d81e6e984c8ca738593658719209" + } + }, + "e150eaba931d4f649f6a9c64f1dda02c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a4bf50d66e8040da9d3b5271f2187dcd", + "placeholder": "​", + "style": "IPY_MODEL_49e5b3f23ed84e3cb1a57a7e63788b07", + "value": "Download complete: 100%" + } + }, + "358cbf15de2b4b00a1e708e7f6e29bb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_521e891f3e594a9e95f233aadf1c4dfa", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8c143f5422ee486f8716091a0a191ddf", + "value": 1 + } + }, + "6f425cd96d5349fa816d9dc0584847b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_dcbdcfc579364725859f64933cd2dec8", + "placeholder": "​", + "style": "IPY_MODEL_6630c1be8c1f4c50b9d17d0ba774365d", + "value": " 51.6G/51.6G [02:23<00:00, 386MB/s]" + } + }, + "4893d81e6e984c8ca738593658719209": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a4bf50d66e8040da9d3b5271f2187dcd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "49e5b3f23ed84e3cb1a57a7e63788b07": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "521e891f3e594a9e95f233aadf1c4dfa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "8c143f5422ee486f8716091a0a191ddf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "dcbdcfc579364725859f64933cd2dec8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6630c1be8c1f4c50b9d17d0ba774365d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2e2c558295f0452ea3c09bcd29685a36": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_212cb67858a0498c96f3a8bfc16e0544", + "IPY_MODEL_6d8e427e07704af581a52d81c03d289d", + "IPY_MODEL_b11e6e50cb58496db7e763c090fb72da" + ], + "layout": "IPY_MODEL_b8c82d51698e4754b611e4589809d729" + } + }, + "212cb67858a0498c96f3a8bfc16e0544": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5b5ea275ee2f47359c726ab08a022189", + "placeholder": "​", + "style": "IPY_MODEL_e0b83356e66b4095982601c6a76a91f6", + "value": "Fetching 2 files: 100%" + } + }, + "6d8e427e07704af581a52d81c03d289d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_5120f72dd76945f1b1cb000eb3bfde0f", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_27edb4245f3d4b03b64164333a90848a", + "value": 2 + } + }, + "b11e6e50cb58496db7e763c090fb72da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_79322768faff475499be0ebb67805a65", + "placeholder": "​", + "style": "IPY_MODEL_bb09f0eaaa2c4e4bb248d490501b488e", + "value": " 2/2 [02:23<00:00, 143.11s/it]" + } + }, + "b8c82d51698e4754b611e4589809d729": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5b5ea275ee2f47359c726ab08a022189": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e0b83356e66b4095982601c6a76a91f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5120f72dd76945f1b1cb000eb3bfde0f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "27edb4245f3d4b03b64164333a90848a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "79322768faff475499be0ebb67805a65": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bb09f0eaaa2c4e4bb248d490501b488e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e2d8bc90d34f45d6b68abf2b22a3e9a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ff60dfd2948b4279b6cbda74b37c33b2", + "IPY_MODEL_0e0b9c3f46aa477c8f9c6d3a26bd63cf", + "IPY_MODEL_4af204e557cb4cc28586af24956dd3b0" + ], + "layout": "IPY_MODEL_0b4f98b868f8451d8cb99f6190321c8d" + } + }, + "ff60dfd2948b4279b6cbda74b37c33b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4082b09ab6c749c49d71d368cdf85141", + "placeholder": "​", + "style": "IPY_MODEL_e98bb563f163410b99017d1985d4ca2a", + "value": "Loading weights: 100%" + } + }, + "0e0b9c3f46aa477c8f9c6d3a26bd63cf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_25048b0ead8f4484b2d5017491823090", + "max": 1013, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_28078c7802c4429b9baf4c7a7b7c72a1", + "value": 1013 + } + }, + "4af204e557cb4cc28586af24956dd3b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_509af22adf884b03ba262bd41ff8ea75", + "placeholder": "​", + "style": "IPY_MODEL_758c27fab7674b248981c8eb67d3d60e", + "value": " 1013/1013 [00:14<00:00, 553.64it/s]" + } + }, + "0b4f98b868f8451d8cb99f6190321c8d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4082b09ab6c749c49d71d368cdf85141": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e98bb563f163410b99017d1985d4ca2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "25048b0ead8f4484b2d5017491823090": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "28078c7802c4429b9baf4c7a7b7c72a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "509af22adf884b03ba262bd41ff8ea75": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "758c27fab7674b248981c8eb67d3d60e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "39da2c555af34b0dbee8a65ba82c0ef5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_2caf91d8b96246d8b0a2e7f2cc3eb326", + "IPY_MODEL_a64f5ed11fc2481aa79ff65998d216c6", + "IPY_MODEL_2081138477dc4a59b0932d099c5c91e3" + ], + "layout": "IPY_MODEL_4d1e5c4c438044188d0572c54d56f851" + } + }, + "2caf91d8b96246d8b0a2e7f2cc3eb326": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c7d8ec30f492459296878ae9b8c92f73", + "placeholder": "​", + "style": "IPY_MODEL_44b23794497242938bcb8b2b193b4758", + "value": "generation_config.json: 100%" + } + }, + "a64f5ed11fc2481aa79ff65998d216c6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0bc564d52fbd4636b18d77f49a793be0", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_724731bdf7d64e208c8da43df88d3916", + "value": 208 + } + }, + "2081138477dc4a59b0932d099c5c91e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d31c33be9b50430c84e099c561e8491a", + "placeholder": "​", + "style": "IPY_MODEL_a69f172b151a41b3afdf594e8300dd63", + "value": " 208/208 [00:00<00:00, 27.2kB/s]" + } + }, + "4d1e5c4c438044188d0572c54d56f851": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c7d8ec30f492459296878ae9b8c92f73": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "44b23794497242938bcb8b2b193b4758": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0bc564d52fbd4636b18d77f49a793be0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "724731bdf7d64e208c8da43df88d3916": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d31c33be9b50430c84e099c561e8491a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a69f172b151a41b3afdf594e8300dd63": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "853c106980d745abbcec56ab94573120": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e5385ae4aa5a4b62a1c01f1f0b7be3e6", + "IPY_MODEL_04e9e69091fe45e0b7bd59cee36f23e3", + "IPY_MODEL_5410c1cc987741f8b68318ab56336621" + ], + "layout": "IPY_MODEL_86cec3facded4f8eb655afc878cecc96" + } + }, + "e5385ae4aa5a4b62a1c01f1f0b7be3e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2ab5080fa805496d99219628cfc534c5", + "placeholder": "​", + "style": "IPY_MODEL_b01770b4e0074b2582f03bb4ac34b68f", + "value": "processor_config.json: " + } + }, + "04e9e69091fe45e0b7bd59cee36f23e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_d63b8fd5ca6a401a9c760c6405731a82", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b7ec7200facb477283dc5de798770e2f", + "value": 1 + } + }, + "5410c1cc987741f8b68318ab56336621": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1d96a405a2024cf7b380844283029ed3", + "placeholder": "​", + "style": "IPY_MODEL_60a6115cbfba408fbda48a00ace7afc1", + "value": " 1.69k/? [00:00<00:00, 174kB/s]" + } + }, + "86cec3facded4f8eb655afc878cecc96": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2ab5080fa805496d99219628cfc534c5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b01770b4e0074b2582f03bb4ac34b68f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d63b8fd5ca6a401a9c760c6405731a82": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "b7ec7200facb477283dc5de798770e2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1d96a405a2024cf7b380844283029ed3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "60a6115cbfba408fbda48a00ace7afc1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d25954e26fbd407fa5430a78ba49a0b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7b3356198bac4650b26cb10fb6724694", + "IPY_MODEL_1906304d8f6c4163b9484a4fcc0d2cde", + "IPY_MODEL_56e0cc76ccb54253adb3cd26b3113c2b" + ], + "layout": "IPY_MODEL_7704ce4caa804b7c8007f6301e774d9f" + } + }, + "7b3356198bac4650b26cb10fb6724694": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3607b98e5dfb47faa77ae97560951467", + "placeholder": "​", + "style": "IPY_MODEL_45e788079b654d2b89c4665faf42d1fd", + "value": "chat_template.jinja: " + } + }, + "1906304d8f6c4163b9484a4fcc0d2cde": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_48b508296aa54d729314e2a2c24160dd", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dcbfd0eaa87b40ee8157fe3aa489ec4d", + "value": 1 + } + }, + "56e0cc76ccb54253adb3cd26b3113c2b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b65aa8c218fe4b039bba43def6756e9c", + "placeholder": "​", + "style": "IPY_MODEL_cf60ba5586f14a93a8df74129e2b06aa", + "value": " 12.0k/? [00:00<00:00, 1.29MB/s]" + } + }, + "7704ce4caa804b7c8007f6301e774d9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3607b98e5dfb47faa77ae97560951467": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "45e788079b654d2b89c4665faf42d1fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "48b508296aa54d729314e2a2c24160dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "dcbfd0eaa87b40ee8157fe3aa489ec4d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b65aa8c218fe4b039bba43def6756e9c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cf60ba5586f14a93a8df74129e2b06aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5450e335cdc248c1bd43e5d18002ebaa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c019419080b74a96ada7632a57dd8485", + "IPY_MODEL_9d120705e8c447abb09bc20843da23f4", + "IPY_MODEL_47837cac654c4f05921f1029b6718815" + ], + "layout": "IPY_MODEL_c1ba8e990adb4c3aa63d786ec8e93af7" + } + }, + "c019419080b74a96ada7632a57dd8485": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e2e92f6bcf934ad8bf00cf6b2aef3ba4", + "placeholder": "​", + "style": "IPY_MODEL_bb44124af9914c29aa02aee3dfc214a0", + "value": "tokenizer_config.json: " + } + }, + "9d120705e8c447abb09bc20843da23f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_47ac15c001a6445c94781c8746012cd4", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_462243e2ef5d4635a9ab6df9e5779f6c", + "value": 1 + } + }, + "47837cac654c4f05921f1029b6718815": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c9de48023b9e4625ac8b32c87ffa92dd", + "placeholder": "​", + "style": "IPY_MODEL_4586b977bb6f4c739bb9fa5819cabfc6", + "value": " 15.0k/? [00:00<00:00, 1.61MB/s]" + } + }, + "c1ba8e990adb4c3aa63d786ec8e93af7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e2e92f6bcf934ad8bf00cf6b2aef3ba4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bb44124af9914c29aa02aee3dfc214a0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "47ac15c001a6445c94781c8746012cd4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "462243e2ef5d4635a9ab6df9e5779f6c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c9de48023b9e4625ac8b32c87ffa92dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4586b977bb6f4c739bb9fa5819cabfc6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "43ee4b1bf75542309a1622da87399e6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a5f0c555837c427d932cd4ab3b372889", + "IPY_MODEL_4486f8a8e17c48ac8056d1337e221050", + "IPY_MODEL_f840f357c01a49e6a77b1be045aa7d12" + ], + "layout": "IPY_MODEL_8aa47b7fd9924cf4869f9e14b5b4ead5" + } + }, + "a5f0c555837c427d932cd4ab3b372889": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c489d961ea974c40a4e1f24b44aa0a2a", + "placeholder": "​", + "style": "IPY_MODEL_f51553d1142b4697ad396bee6fb7b21d", + "value": "tokenizer.json: 100%" + } + }, + "4486f8a8e17c48ac8056d1337e221050": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2af0f039d0304149a1f997d053b84405", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_91f37acd8eb844f4a18825bdc3e1f6c2", + "value": 32169626 + } + }, + "f840f357c01a49e6a77b1be045aa7d12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6ee677fbe8094e34a85628f69273cbca", + "placeholder": "​", + "style": "IPY_MODEL_7b5b3e29daf5435a80eae703f4a23444", + "value": " 32.2M/32.2M [00:01<00:00, 161MB/s]" + } + }, + "8aa47b7fd9924cf4869f9e14b5b4ead5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c489d961ea974c40a4e1f24b44aa0a2a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f51553d1142b4697ad396bee6fb7b21d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2af0f039d0304149a1f997d053b84405": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "91f37acd8eb844f4a18825bdc3e1f6c2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6ee677fbe8094e34a85628f69273cbca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7b5b3e29daf5435a80eae703f4a23444": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e6cf365cf0674a8884e0c8ac8f8280e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7e30c5c4c96d48e3a78689e33caafcd3", + "IPY_MODEL_7de02d7843554276ad002c048a27c0d0", + "IPY_MODEL_96cfbd5b4f314ea4841878182a7efe76" + ], + "layout": "IPY_MODEL_562d09896c604940922612e0e07f9c65" + } + }, + "7e30c5c4c96d48e3a78689e33caafcd3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6f4bfaeacaa94fe9a5e6183255c23610", + "placeholder": "​", + "style": "IPY_MODEL_bda1c422c31a400abab7180489c6827a", + "value": "README.md: 100%" + } + }, + "7de02d7843554276ad002c048a27c0d0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c7ea3a7037814db68f2e49efc250dc53", + "max": 519, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_314fc72dcdde4fe0b9b59439f0008a3d", + "value": 519 + } + }, + "96cfbd5b4f314ea4841878182a7efe76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_48e085b16ef14d99b042debed39dcb6c", + "placeholder": "​", + "style": "IPY_MODEL_54a8a8e37c3d49158c65380451eb8712", + "value": " 519/519 [00:00<00:00, 60.4kB/s]" + } + }, + "562d09896c604940922612e0e07f9c65": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6f4bfaeacaa94fe9a5e6183255c23610": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bda1c422c31a400abab7180489c6827a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c7ea3a7037814db68f2e49efc250dc53": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "314fc72dcdde4fe0b9b59439f0008a3d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "48e085b16ef14d99b042debed39dcb6c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "54a8a8e37c3d49158c65380451eb8712": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9a6f19b03be84e5aa83b969363d08266": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_81f70c633bc4400e8a87c1cba5c878cb", + "IPY_MODEL_4384402858074f76a55cc80ff7ea31f4", + "IPY_MODEL_8fc9de0fd3964947a7f98a091b81d4a2" + ], + "layout": "IPY_MODEL_8c1a59d63151455e8d6008943028bfed" + } + }, + "81f70c633bc4400e8a87c1cba5c878cb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ac2d18a0024d4f9292e96f5b2ffc454d", + "placeholder": "​", + "style": "IPY_MODEL_b855d3442a164d599f2e7462f153fa95", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "4384402858074f76a55cc80ff7ea31f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_4e5d2c84e7b2409bbb1d45e6d4130821", + "max": 343805431, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9f3d00003e14495e8a4fb3cfb563e13e", + "value": 343805431 + } + }, + "8fc9de0fd3964947a7f98a091b81d4a2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7fe02defa2cb4928ae9fbd155c02caee", + "placeholder": "​", + "style": "IPY_MODEL_5762804fcc6a477dbaaff1622e67752d", + "value": " 344M/344M [00:05<00:00, 65.2MB/s]" + } + }, + "8c1a59d63151455e8d6008943028bfed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ac2d18a0024d4f9292e96f5b2ffc454d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b855d3442a164d599f2e7462f153fa95": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4e5d2c84e7b2409bbb1d45e6d4130821": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9f3d00003e14495e8a4fb3cfb563e13e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7fe02defa2cb4928ae9fbd155c02caee": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5762804fcc6a477dbaaff1622e67752d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "44475c29f3e74859a22b79e426cbff03": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a1d0d7eed4b349e69421762f608a2da0", + "IPY_MODEL_5955b2caad154badb366ab1dc729bf85", + "IPY_MODEL_3203efbc3d4b4195abe86d53b48b8b77" + ], + "layout": "IPY_MODEL_e220f3b014f946fa9751a4d39ed0303c" + } + }, + "a1d0d7eed4b349e69421762f608a2da0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_beda7d7f24cb413ebcdb42f238dc89bd", + "placeholder": "​", + "style": "IPY_MODEL_ec5e1b08549d47ca99a7857a97b94022", + "value": "data/test-00000-of-00001.parquet: 100%" + } + }, + "5955b2caad154badb366ab1dc729bf85": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1355eb5a553a4f87b4a5a6dda9b1160c", + "max": 38205016, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_67fc62df6f6a411c96cb8769f241a810", + "value": 38205016 + } + }, + "3203efbc3d4b4195abe86d53b48b8b77": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1a2dd7eb1fc94f49b65c10b677b26684", + "placeholder": "​", + "style": "IPY_MODEL_60936221bc13459c8adefcc141ac7165", + "value": " 38.2M/38.2M [00:00<00:00, 191MB/s]" + } + }, + "e220f3b014f946fa9751a4d39ed0303c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "beda7d7f24cb413ebcdb42f238dc89bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ec5e1b08549d47ca99a7857a97b94022": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1355eb5a553a4f87b4a5a6dda9b1160c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "67fc62df6f6a411c96cb8769f241a810": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1a2dd7eb1fc94f49b65c10b677b26684": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "60936221bc13459c8adefcc141ac7165": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "079918351e0f463bba0cc030663acffc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_fa068bcbf12a4f9b8d92f0dad7ee4c71", + "IPY_MODEL_20ded9b9c93a4e07a946e13bbb68062d", + "IPY_MODEL_8845926888a448f98a2d32eddfb9f710" + ], + "layout": "IPY_MODEL_a2c4067b539d42a0ab8a71a2ec05742f" + } + }, + "fa068bcbf12a4f9b8d92f0dad7ee4c71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d212975985c24093951238bf6b32f85b", + "placeholder": "​", + "style": "IPY_MODEL_3f674fdc9dbc421386f653c880926d96", + "value": "Generating train split: 100%" + } + }, + "20ded9b9c93a4e07a946e13bbb68062d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_29d34168eb7c408486892b2b17f279b9", + "max": 68686, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_00bb9e9c8b124008af2a01ed6ca53b13", + "value": 68686 + } + }, + "8845926888a448f98a2d32eddfb9f710": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_08279df17aad4a6080e6fe784d5b9e81", + "placeholder": "​", + "style": "IPY_MODEL_aaa881bedb974089931e8eee3b193769", + "value": " 68686/68686 [00:00<00:00, 124063.71 examples/s]" + } + }, + "a2c4067b539d42a0ab8a71a2ec05742f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d212975985c24093951238bf6b32f85b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3f674fdc9dbc421386f653c880926d96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "29d34168eb7c408486892b2b17f279b9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "00bb9e9c8b124008af2a01ed6ca53b13": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "08279df17aad4a6080e6fe784d5b9e81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "aaa881bedb974089931e8eee3b193769": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e89e685da18542fca578ff9bd9aaa8cb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_56e57386c76b437c8e523405dbc74d89", + "IPY_MODEL_cebedffd8b49445e9721acaa3301d4ea", + "IPY_MODEL_f59d8fb192174fce8983987a2a299e77" + ], + "layout": "IPY_MODEL_3aaf75c2b9754b6298cdf346d51a4516" + } + }, + "56e57386c76b437c8e523405dbc74d89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_01baf8e6d6b944529659448e08efe79c", + "placeholder": "​", + "style": "IPY_MODEL_0403261c40634c8daac850bd575fc966", + "value": "Generating test split: 100%" + } + }, + "cebedffd8b49445e9721acaa3301d4ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_8e8c01da153245c8b4e942dae53e2dd2", + "max": 7632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0bf222211e5a4e9cba517790a6089144", + "value": 7632 + } + }, + "f59d8fb192174fce8983987a2a299e77": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_26a7d1ec9dda441f9b1f99052b082422", + "placeholder": "​", + "style": "IPY_MODEL_b5eb5d5fe03543ac9327188d0311bcda", + "value": " 7632/7632 [00:00<00:00, 138348.46 examples/s]" + } + }, + "3aaf75c2b9754b6298cdf346d51a4516": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "01baf8e6d6b944529659448e08efe79c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0403261c40634c8daac850bd575fc966": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8e8c01da153245c8b4e942dae53e2dd2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0bf222211e5a4e9cba517790a6089144": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "26a7d1ec9dda441f9b1f99052b082422": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b5eb5d5fe03543ac9327188d0311bcda": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Text.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Text.ipynb new file mode 100644 index 0000000..18ae530 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Text.ipynb @@ -0,0 +1,7707 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "n5NrROnmsJP4" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab A100 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jjzmSqm7sJP4" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WDatJHaBsJP5" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9TnXzZYMsJP5" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "B2T3Z8F2sJP5" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lBN09c1tUlSV" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "-Xbb0cuLzwgf", + "outputId": "3d9968a4-cb68-4112-aa41-29a78c0c8ae0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 461, + "referenced_widgets": [ + "ddfff68b86604e0daa29ef5bc5b097c3", + "ad049bffb6ab409eab6268cb8b46e1d7", + "1a7eb21cd8f14d0b98517dddd5a691c3", + "8035803031e048be9cda8d78aaf83f1b", + "2c3ad97c23f840f5997f3e5554ef7b02", + "c731d59a7ea449948fa2de671225ddc2", + "bff47b44ee1a49fbb0c69a24a7d1985b", + "3753574c0ed14e6583ef6228f921efc3", + "b897d2670a8e42ac89d526b7daf7d591", + "e262ca340c0a4269a5f8571cfa85f1ce", + "6b98b989f90842e79b20bbd8007ed266", + "03d61f85075f4ccab14b1d7cb41139f0", + "76bb1448130f41bd8d36591733b2bc13", + "ac0b4b138d3b4702880b6eff4ace812e", + "7d8ce2a07d0d4b0d8c0ce2dd9bce1d8f", + "7deed7b9ad7e4d11b2e55e060295876f", + "54d6d94660dc4131acb117491bc67fe4", + "63a2d2156b0d4c9e9b62638d7b98a31a", + "e49a0432d7ff4865937f127bb42d5694", + "abf451cd86ee4736a2973e17957cb65a", + "61b85a135758473ca21478a99b294662", + "5b9428103bc0447b84830baba8cd0792", + "3af787f578db4dde81a8515af76e2d4a", + "cfb0f9b35dad41ff89f6d4c9294fb141", + "12741070e1b344c5aef74e1f4e149ef0", + "e53e734a00254b589f8bf2c46d99a157", + "9515391e235540438acccbe364707b84", + "6331c3b6d264458fa34668a0e5c29d6e", + "05727779b5eb4dcaaea43a91e7b173cd", + "7ff031eac8a2489493c94585a02af25c", + "2d505dcd97d049d6ba2ff96c835c0f56", + "e7d9e35834254739ba9c263eceec4ae3", + "b92921f4b5e44191a70aa7f297d3b26d", + "18e1bcd9e38b4de98b60ad764b20f9b4", + "c364867b67644ee7b4480907f43a6333", + "4abe4c12f83242db9b5f48ffc732c967", + "463e555166254ca295339a5b2377aa74", + "ac13c14fc8254d62b4bf2effba318efb", + "98c1b6ab11854572a5472858a08db06d", + "6ff843b22e7f48b6bb65be7de51d78a8", + "acf6196472d1429ea88f6a960f90cfcd", + "97742cb20ea3454fa324a3da91f7a23a", + "2100a1ea915747d9bdec9368a15e3efb", + "9ede245da88b4c288bf621cdba54872a", + "90186299fc68489fa74be2f6b344fd1e", + "1b5095988f394b059850d8596cc07a5e", + "5ee00d5de3554137a3833eaf6a6555c4", + "c6426c66c4f043f2871092cebc0b9a5c", + "493a6fe8bb124802bed69d23de0c508e", + "336f065bc8ea4f2795b98604beda5c56", + "03635e8c58e44e609d578b894f41ab6c", + "8f5360f02f2743ab833120c040d0da58", + "96bfe52406b44c5987543008a918c8b5", + "35c6063752e44868bf959336503a204b", + "2ee9305b680d40429a206b409dc427d8", + "15365e96b88b4592aa5a97edaf203faa", + "01731ab574d7417982c3252be468048d", + "09da0999a8a74a2daab528795edc9dfb", + "fa232e3b8272477d8ad8afa420f0b966", + "ba2ebae221444c57a7d147298a8aaaa5", + "3eb88bb5f85d4176b63e462b8387d9d1", + "c75d7c8d4f5e4f8c81a516f417f6e356", + "10a2e0f49f934d649879f1379643b5c2", + "93d00755b1c74145a989942550cb1256", + "31414eee7ac24fb08c74df53771a46d1", + "c93d71f1f5e74beeb3650aaf22518a7d", + "f391afbe2b534ac4b046f3391d030b55", + "a87b5ffeda5a4f63b9f167eb060aa960", + "899a1113f94c4a12a97dd4a246ca34f5", + "e80e0571b6a44a5ab5d8a308159d6599", + "0b611f6c3f0a4dad9a4541f53d5a1018", + "90523f78a4bb48a2a9be260a85c7d4fc", + "fd1664aa2b75488dab5f33decb6e403b", + "298cc95bd32e44399756388b2e8d6738", + "43679efd9c104bbb828ac996d6c57d21", + "5ae95fe9d7e74f10b46d784039063c14", + "abe24447de574e13b6c4b0446d2e4c49", + "e99b1841328642c496534c2d85ab2197", + "df55839ea8174c3db3b208847b6a2edf", + "37df8776bba04771bdf1b59ade53d7db", + "86ed31f6ef22482aa68f56afa4f01855", + "5d93b70b84864b638595700334b4806b", + "381310ad93e34b9ca5a5970b329288bc", + "0fb592680bd84a2b977d373c517ef948", + "169b5a0ec13a4463bf31de75863ae124", + "2cfbfed9370949bba912b19f725d8dcd", + "83389fcc5d6043da807ae3b2bca6d278", + "f018320c97c346689b9a2cee3e129bda", + "9566c043613f4065a8acd0934a4fb91a", + "2f3aad401e4a40f7a86a70fbaaa237b3", + "dd6bbe22e8b94ffa9e22e6723ee31164", + "1fb5fe9069d94a85bf295c9f43cd6a2e", + "09853f9563db40dd8f991c0f11c343e2", + "08361c6620a7421a92a237b88f74392b", + "8ff05374922c463fa0cafc3166936916", + "481b213c55944148af3be4289be99b3c", + "39d2154a00014e7287a42d48959a39cd", + "34602f08ab064669bdb72fd1a4699e14", + "289443a77521422bbbb3fb454c763b7d" + ] + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "Unsloth: Your Flash Attention 2 installation seems to be broken. Using Xformers instead. No performance changes will be seen.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| NVIDIA A100-SXM4-40GB. Num GPUs = 1. Max memory: 39.494 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 8.0. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = TRUE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors.index.json: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "ddfff68b86604e0daa29ef5bc5b097c3" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (incomplete total...): 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "03d61f85075f4ccab14b1d7cb41139f0" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Fetching 2 files: 0%| | 0/2 [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "9jGeSb9bWe0k", + "outputId": "e95da582-2668-4936-9aec-3ffdde2bb771", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The animal in the image is a sloth. Sloths have appeared in several popular films, most notably:\n", + "\n", + "* **Zootopia (2016):** Featuring the character Flash, a slow-moving sloth who works at the Department of Mammal Vehicles.\n", + "* **Ice Age (2002):** Featuring Sid, a ground sloth who is one of the main protagonists of the series.\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eh0BzbZPWtRD" + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "R3ExuK8cWuT3", + "outputId": "3a0a6496-79ef-4921-8dd5-96ba5ba77fc9", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "In the emerald hush of the canopy high,\n", + "Where the orchids bloom and the parrots fly,\n", + "Dwells a gentle soul in a velvet coat,\n", + "A slow-motion dream, a drifting boat.\n", + "\n", + "With curved, steady claws and a sleepy gaze,\n", + "He wanders the wild in a languid haze.\n", + "No rush for the fruit, no race for the prize,\n", + "Just the soft, golden light of the tropical skies.\n", + "\n", + "He breathes with the wind, he sways with the breeze,\n", + "A living extension of moss-covered trees.\n", + "In the folds of his fur, a miniature world,\n", + "Where algae and\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "6bZsfBuZDeCL" + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "LjY75GoYUCB8" + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZQkXuGYxbJ-e" + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "Mkq4RvEq7FQr", + "outputId": "43449058-686e-430f-c009-c3e795af23ac", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 113, + "referenced_widgets": [ + "91d72aaeb61042e4947b071d3938d141", + "a63c2648c298475dbbd524a7981cc2ad", + "29adf88558b64e93b179cd1087032ae2", + "807ca6b59c494877acd1d7672e2d0e42", + "4627ade20aea4966a15122cdd52f6a25", + "73068a350b9a481d9363f24053235c4b", + "db04d1ca966a43b0be0bbd3ad4ddb515", + "024c0c5a1c5542babf6cf130f0648b27", + "14a012520c1340ee9264630bb456ce95", + "2be7b0a20ea843af879c32c6d8707138", + "d60a95c9eb6d4ca5be81eb67ac34b87d", + "68995941f8e649a1a5265b073c86f84c", + "f4b859550a47428ba4988a7c582443eb", + "66402b5fde234614b92ea5786b108f5c", + "e6e4248babc74ac9ae46c47fb3d2a371", + "4caa19e33d8b4be7a1d3b083b0c1948d", + "f62d9af82c9146beab3ed27b85077af5", + "88f1deb88087491eaf91cc902772ab79", + "3c3b82e37f1249c29dcbc663dd95d4f8", + "d3bf74e15c984629aafd83ad8f5e0d92", + "9371b6a9e05847cba1b74278e68955ad", + "502e2c08bc2941448e984a1f50401c72", + "59cbb4c555d848079284ffa4f63cdb04", + "e0b731ea60c24ff98c0803c6072568b0", + "a01e4ad102e74c869953e5303fb5da79", + "956c0ca869d04bd084abff9e9ff8afa7", + "095b148b6c8d4201a4c631fd0903c11d", + "1527b6baf1e24722aecbe33f6ffd1e52", + "ba42d40812c1453ab8208bce2693e79d", + "1fd1672a2bb041e8be285cd8fb1a413e", + "5f1175f9e50e4183b99fc7106a9b39c7", + "95800a9caeed4806a66b25ead152aed2", + "476c623468944e438825f5269b5acf04" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "1ahE8Ys37JDJ", + "outputId": "11a09b9e-9fab-45cc-aef4-81b027ebc64b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "e74375a06bf84083bf0198a59d0a8204", + "d097e15ca15c4d2eb74520873c028809", + "09205f37e867471cba0c6d9bc93d1fa6", + "8ff9730f06e44b4f835a79f8aa948815", + "1984c66eaca44ac487b177b939d31122", + "42355bb88a2246d4bb25e05c6d1e6aca", + "7369d3e3e2bf4530ab7f0999b393a2ea", + "3caf02c6f3524f889a4a22e2c09ea2ec", + "3f97ac1599e5474f818d83971acc18e9", + "04e9b0514e284cf3aba462aca7906064", + "0bea037f647346fc9feff2f63659422d" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "gGFzmplrEy9I", + "outputId": "7d50b4dc-d3ff-49fd-dba6-7511ee9c7c07", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 13 + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "95_Nn-89DhsL", + "outputId": "369cc7d6-dfd2-4e4a-c117-495ffd50d06d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "872c4aa8a612431aaf11581cf8b7e966", + "cc0fdf131fe944ae8686ab413b48b40b", + "ccf366fe1da44dad97716da52be0fa95", + "559f5ce577684e7d8fbb3eeca3df7481", + "9ab84bc270d5426ea6503200962c0008", + "cdeb781f1d16460c8155bd7616790995", + "86b55c60b19b4f60b632c94ffdb3597d", + "2025f98694a14209a17310de5e27f29f", + "22e6e92bdff246b5b4f8aa2240bcba77", + "0d0d95b0a65643fdb1aac22b0fc22f25", + "bee9f63027394da28a6faa2cda06d291" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=16): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dv1NBUozV78l" + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "LtsMVtlkUhja", + "outputId": "68552bcc-1c20-48e9-8a78-505dced229c9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\n<|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Kyjy__m9KY3" + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "_rD6fl8EUxnG", + "outputId": "b44c5e2f-068f-4a31-a31e-34ed10678a6d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "' <|channel>thought\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 17 + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "outputId": "7a278f07-915e-44b9-d018-c342eb3d9256", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = NVIDIA A100-SXM4-40GB. Max memory = 39.494 GB.\n", + "18.57 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "outputId": "bed52b39-9792-4141-e4aa-3a7f8e3e6d49", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 3,000 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 61,214,720 of 31,334,301,232 (0.20% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 05:57, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
12.130297
20.630456
30.910843
41.590092
51.243832
60.751323
70.740214
80.595984
90.828650
101.148587
111.111826
120.612088
130.677837
140.893246
150.733738
160.908046
171.022293
180.960453
191.008064
200.916117
210.572186
221.075967
230.941994
240.896985
250.553296
260.467511
270.577387
280.588091
290.524273
300.754770
310.678074
320.652198
331.039165
340.474116
350.921311
360.881754
370.611182
380.940461
390.909078
400.630252
410.829833
420.835820
430.623156
440.523088
450.542758
461.208341
470.628660
480.642084
490.914339
501.025399
510.500276
520.597512
530.595572
540.555974
550.767994
560.910350
570.447900
580.765359
590.853433
600.745598

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "outputId": "881756ba-9573-4a68-ec6e-14e4cf325d93", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "390.1241 seconds used for training.\n", + "6.5 minutes used for training.\n", + "Peak reserved memory = 21.43 GB.\n", + "Peak reserved memory for training = 2.86 GB.\n", + "Peak reserved memory % of max memory = 54.261 %.\n", + "Peak reserved memory for training % of max memory = 7.242 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "kR3gIAX-SM2q", + "outputId": "cdfa1bd8-62cd-4355-cd4a-1026a16807ea", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\n<|channel>thought\\n13']" + ], + "text/html": [ + "

['<bos><|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,<turn|>\\n<|turn>model\\n<|channel>thought\\n<channel|>13<turn|>']
" + ] + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4-thinking\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CrSvZObor0lY" + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "e2pEuRb1r2Vg", + "outputId": "4c132d52-60a3-4024-8500-3a779f3dc9d3", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The shortest answer is: **Rayleigh scattering.**\n", + "\n", + "Here is the more detailed explanation of how it works:\n", + "\n", + "### 1. Sunlight is a spectrum of colors\n", + "Although sunlight looks white, it is actually made up of all the colors of the rainbow (red, orange, yellow, green,\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "upcOlWe7A1vc", + "outputId": "f2c735b5-ddc0-4664-a256-72143545e918", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 23 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "MKX_XKs_BNZR", + "outputId": "b12693a9-bca7-4e37-e9d4-1ceeed5b6907", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "As of my current knowledge, there is no official model called **Gemma-4**.\n", + "\n", + "It is possible you are thinking of one of the following:\n", + "\n", + "1. **Gemma (by Google):** This is a family of lightweight, open-weights models built from the same technology used to create the Gemini models. The current versions are **Gemma** and **Gemma 2**.\n", + "2. **GPT-4 (by OpenAI):** This is the powerful multimodal large language model that powers the paid version of ChatGPT.\n", + "3. **Llama (by Meta):** Meta has\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " use_cache = True,\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "ZV-CiKPrIFG0" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "id": "FqfebeAdT073" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "ZgcJIhJ0I_es" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "ddfff68b86604e0daa29ef5bc5b097c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ad049bffb6ab409eab6268cb8b46e1d7", + "IPY_MODEL_1a7eb21cd8f14d0b98517dddd5a691c3", + "IPY_MODEL_8035803031e048be9cda8d78aaf83f1b" + ], + "layout": "IPY_MODEL_2c3ad97c23f840f5997f3e5554ef7b02" + } + }, + "ad049bffb6ab409eab6268cb8b46e1d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c731d59a7ea449948fa2de671225ddc2", + "placeholder": "​", + "style": "IPY_MODEL_bff47b44ee1a49fbb0c69a24a7d1985b", + "value": "model.safetensors.index.json: " + } + }, + "1a7eb21cd8f14d0b98517dddd5a691c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3753574c0ed14e6583ef6228f921efc3", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b897d2670a8e42ac89d526b7daf7d591", + "value": 1 + } + }, + "8035803031e048be9cda8d78aaf83f1b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e262ca340c0a4269a5f8571cfa85f1ce", + "placeholder": "​", + "style": "IPY_MODEL_6b98b989f90842e79b20bbd8007ed266", + "value": " 120k/? [00:00<00:00, 11.4MB/s]" + } + }, + "2c3ad97c23f840f5997f3e5554ef7b02": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c731d59a7ea449948fa2de671225ddc2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bff47b44ee1a49fbb0c69a24a7d1985b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3753574c0ed14e6583ef6228f921efc3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "b897d2670a8e42ac89d526b7daf7d591": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e262ca340c0a4269a5f8571cfa85f1ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6b98b989f90842e79b20bbd8007ed266": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "03d61f85075f4ccab14b1d7cb41139f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_76bb1448130f41bd8d36591733b2bc13", + "IPY_MODEL_ac0b4b138d3b4702880b6eff4ace812e", + "IPY_MODEL_7d8ce2a07d0d4b0d8c0ce2dd9bce1d8f" + ], + "layout": "IPY_MODEL_7deed7b9ad7e4d11b2e55e060295876f" + } + }, + "76bb1448130f41bd8d36591733b2bc13": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_54d6d94660dc4131acb117491bc67fe4", + "placeholder": "​", + "style": "IPY_MODEL_63a2d2156b0d4c9e9b62638d7b98a31a", + "value": "Download complete: 100%" + } + }, + "ac0b4b138d3b4702880b6eff4ace812e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_e49a0432d7ff4865937f127bb42d5694", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_abf451cd86ee4736a2973e17957cb65a", + "value": 1 + } + }, + "7d8ce2a07d0d4b0d8c0ce2dd9bce1d8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_61b85a135758473ca21478a99b294662", + "placeholder": "​", + "style": "IPY_MODEL_5b9428103bc0447b84830baba8cd0792", + "value": " 62.5G/62.5G [03:04<00:00, 284MB/s]" + } + }, + "7deed7b9ad7e4d11b2e55e060295876f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "54d6d94660dc4131acb117491bc67fe4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "63a2d2156b0d4c9e9b62638d7b98a31a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e49a0432d7ff4865937f127bb42d5694": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "abf451cd86ee4736a2973e17957cb65a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "61b85a135758473ca21478a99b294662": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5b9428103bc0447b84830baba8cd0792": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3af787f578db4dde81a8515af76e2d4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_cfb0f9b35dad41ff89f6d4c9294fb141", + "IPY_MODEL_12741070e1b344c5aef74e1f4e149ef0", + "IPY_MODEL_e53e734a00254b589f8bf2c46d99a157" + ], + "layout": "IPY_MODEL_9515391e235540438acccbe364707b84" + } + }, + "cfb0f9b35dad41ff89f6d4c9294fb141": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6331c3b6d264458fa34668a0e5c29d6e", + "placeholder": "​", + "style": "IPY_MODEL_05727779b5eb4dcaaea43a91e7b173cd", + "value": "Fetching 2 files: 100%" + } + }, + "12741070e1b344c5aef74e1f4e149ef0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_7ff031eac8a2489493c94585a02af25c", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2d505dcd97d049d6ba2ff96c835c0f56", + "value": 2 + } + }, + "e53e734a00254b589f8bf2c46d99a157": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e7d9e35834254739ba9c263eceec4ae3", + "placeholder": "​", + "style": "IPY_MODEL_b92921f4b5e44191a70aa7f297d3b26d", + "value": " 2/2 [03:04<00:00, 184.71s/it]" + } + }, + "9515391e235540438acccbe364707b84": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6331c3b6d264458fa34668a0e5c29d6e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "05727779b5eb4dcaaea43a91e7b173cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7ff031eac8a2489493c94585a02af25c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2d505dcd97d049d6ba2ff96c835c0f56": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e7d9e35834254739ba9c263eceec4ae3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b92921f4b5e44191a70aa7f297d3b26d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "18e1bcd9e38b4de98b60ad764b20f9b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c364867b67644ee7b4480907f43a6333", + "IPY_MODEL_4abe4c12f83242db9b5f48ffc732c967", + "IPY_MODEL_463e555166254ca295339a5b2377aa74" + ], + "layout": "IPY_MODEL_ac13c14fc8254d62b4bf2effba318efb" + } + }, + "c364867b67644ee7b4480907f43a6333": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_98c1b6ab11854572a5472858a08db06d", + "placeholder": "​", + "style": "IPY_MODEL_6ff843b22e7f48b6bb65be7de51d78a8", + "value": "Loading weights: 100%" + } + }, + "4abe4c12f83242db9b5f48ffc732c967": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_acf6196472d1429ea88f6a960f90cfcd", + "max": 1188, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_97742cb20ea3454fa324a3da91f7a23a", + "value": 1188 + } + }, + "463e555166254ca295339a5b2377aa74": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2100a1ea915747d9bdec9368a15e3efb", + "placeholder": "​", + "style": "IPY_MODEL_9ede245da88b4c288bf621cdba54872a", + "value": " 1188/1188 [02:41<00:00, 97.10it/s]" + } + }, + "ac13c14fc8254d62b4bf2effba318efb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "98c1b6ab11854572a5472858a08db06d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6ff843b22e7f48b6bb65be7de51d78a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "acf6196472d1429ea88f6a960f90cfcd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "97742cb20ea3454fa324a3da91f7a23a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2100a1ea915747d9bdec9368a15e3efb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9ede245da88b4c288bf621cdba54872a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "90186299fc68489fa74be2f6b344fd1e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1b5095988f394b059850d8596cc07a5e", + "IPY_MODEL_5ee00d5de3554137a3833eaf6a6555c4", + "IPY_MODEL_c6426c66c4f043f2871092cebc0b9a5c" + ], + "layout": "IPY_MODEL_493a6fe8bb124802bed69d23de0c508e" + } + }, + "1b5095988f394b059850d8596cc07a5e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_336f065bc8ea4f2795b98604beda5c56", + "placeholder": "​", + "style": "IPY_MODEL_03635e8c58e44e609d578b894f41ab6c", + "value": "generation_config.json: 100%" + } + }, + "5ee00d5de3554137a3833eaf6a6555c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_8f5360f02f2743ab833120c040d0da58", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_96bfe52406b44c5987543008a918c8b5", + "value": 208 + } + }, + "c6426c66c4f043f2871092cebc0b9a5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_35c6063752e44868bf959336503a204b", + "placeholder": "​", + "style": "IPY_MODEL_2ee9305b680d40429a206b409dc427d8", + "value": " 208/208 [00:00<00:00, 27.5kB/s]" + } + }, + "493a6fe8bb124802bed69d23de0c508e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "336f065bc8ea4f2795b98604beda5c56": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "03635e8c58e44e609d578b894f41ab6c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8f5360f02f2743ab833120c040d0da58": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "96bfe52406b44c5987543008a918c8b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "35c6063752e44868bf959336503a204b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2ee9305b680d40429a206b409dc427d8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "15365e96b88b4592aa5a97edaf203faa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_01731ab574d7417982c3252be468048d", + "IPY_MODEL_09da0999a8a74a2daab528795edc9dfb", + "IPY_MODEL_fa232e3b8272477d8ad8afa420f0b966" + ], + "layout": "IPY_MODEL_ba2ebae221444c57a7d147298a8aaaa5" + } + }, + "01731ab574d7417982c3252be468048d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3eb88bb5f85d4176b63e462b8387d9d1", + "placeholder": "​", + "style": "IPY_MODEL_c75d7c8d4f5e4f8c81a516f417f6e356", + "value": "processor_config.json: " + } + }, + "09da0999a8a74a2daab528795edc9dfb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_10a2e0f49f934d649879f1379643b5c2", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_93d00755b1c74145a989942550cb1256", + "value": 1 + } + }, + "fa232e3b8272477d8ad8afa420f0b966": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_31414eee7ac24fb08c74df53771a46d1", + "placeholder": "​", + "style": "IPY_MODEL_c93d71f1f5e74beeb3650aaf22518a7d", + "value": " 1.69k/? [00:00<00:00, 198kB/s]" + } + }, + "ba2ebae221444c57a7d147298a8aaaa5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3eb88bb5f85d4176b63e462b8387d9d1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c75d7c8d4f5e4f8c81a516f417f6e356": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "10a2e0f49f934d649879f1379643b5c2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "93d00755b1c74145a989942550cb1256": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "31414eee7ac24fb08c74df53771a46d1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c93d71f1f5e74beeb3650aaf22518a7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f391afbe2b534ac4b046f3391d030b55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a87b5ffeda5a4f63b9f167eb060aa960", + "IPY_MODEL_899a1113f94c4a12a97dd4a246ca34f5", + "IPY_MODEL_e80e0571b6a44a5ab5d8a308159d6599" + ], + "layout": "IPY_MODEL_0b611f6c3f0a4dad9a4541f53d5a1018" + } + }, + "a87b5ffeda5a4f63b9f167eb060aa960": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_90523f78a4bb48a2a9be260a85c7d4fc", + "placeholder": "​", + "style": "IPY_MODEL_fd1664aa2b75488dab5f33decb6e403b", + "value": "chat_template.jinja: " + } + }, + "899a1113f94c4a12a97dd4a246ca34f5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_298cc95bd32e44399756388b2e8d6738", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_43679efd9c104bbb828ac996d6c57d21", + "value": 1 + } + }, + "e80e0571b6a44a5ab5d8a308159d6599": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5ae95fe9d7e74f10b46d784039063c14", + "placeholder": "​", + "style": "IPY_MODEL_abe24447de574e13b6c4b0446d2e4c49", + "value": " 12.0k/? [00:00<00:00, 1.40MB/s]" + } + }, + "0b611f6c3f0a4dad9a4541f53d5a1018": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "90523f78a4bb48a2a9be260a85c7d4fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fd1664aa2b75488dab5f33decb6e403b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "298cc95bd32e44399756388b2e8d6738": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "43679efd9c104bbb828ac996d6c57d21": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5ae95fe9d7e74f10b46d784039063c14": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "abe24447de574e13b6c4b0446d2e4c49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e99b1841328642c496534c2d85ab2197": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_df55839ea8174c3db3b208847b6a2edf", + "IPY_MODEL_37df8776bba04771bdf1b59ade53d7db", + "IPY_MODEL_86ed31f6ef22482aa68f56afa4f01855" + ], + "layout": "IPY_MODEL_5d93b70b84864b638595700334b4806b" + } + }, + "df55839ea8174c3db3b208847b6a2edf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_381310ad93e34b9ca5a5970b329288bc", + "placeholder": "​", + "style": "IPY_MODEL_0fb592680bd84a2b977d373c517ef948", + "value": "tokenizer_config.json: " + } + }, + "37df8776bba04771bdf1b59ade53d7db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_169b5a0ec13a4463bf31de75863ae124", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2cfbfed9370949bba912b19f725d8dcd", + "value": 1 + } + }, + "86ed31f6ef22482aa68f56afa4f01855": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_83389fcc5d6043da807ae3b2bca6d278", + "placeholder": "​", + "style": "IPY_MODEL_f018320c97c346689b9a2cee3e129bda", + "value": " 15.0k/? [00:00<00:00, 1.63MB/s]" + } + }, + "5d93b70b84864b638595700334b4806b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "381310ad93e34b9ca5a5970b329288bc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0fb592680bd84a2b977d373c517ef948": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "169b5a0ec13a4463bf31de75863ae124": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "2cfbfed9370949bba912b19f725d8dcd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "83389fcc5d6043da807ae3b2bca6d278": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f018320c97c346689b9a2cee3e129bda": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9566c043613f4065a8acd0934a4fb91a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_2f3aad401e4a40f7a86a70fbaaa237b3", + "IPY_MODEL_dd6bbe22e8b94ffa9e22e6723ee31164", + "IPY_MODEL_1fb5fe9069d94a85bf295c9f43cd6a2e" + ], + "layout": "IPY_MODEL_09853f9563db40dd8f991c0f11c343e2" + } + }, + "2f3aad401e4a40f7a86a70fbaaa237b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_08361c6620a7421a92a237b88f74392b", + "placeholder": "​", + "style": "IPY_MODEL_8ff05374922c463fa0cafc3166936916", + "value": "tokenizer.json: 100%" + } + }, + "dd6bbe22e8b94ffa9e22e6723ee31164": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_481b213c55944148af3be4289be99b3c", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_39d2154a00014e7287a42d48959a39cd", + "value": 32169626 + } + }, + "1fb5fe9069d94a85bf295c9f43cd6a2e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_34602f08ab064669bdb72fd1a4699e14", + "placeholder": "​", + "style": "IPY_MODEL_289443a77521422bbbb3fb454c763b7d", + "value": " 32.2M/32.2M [00:00<00:00, 161MB/s]" + } + }, + "09853f9563db40dd8f991c0f11c343e2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "08361c6620a7421a92a237b88f74392b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8ff05374922c463fa0cafc3166936916": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "481b213c55944148af3be4289be99b3c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "39d2154a00014e7287a42d48959a39cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "34602f08ab064669bdb72fd1a4699e14": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "289443a77521422bbbb3fb454c763b7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "91d72aaeb61042e4947b071d3938d141": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a63c2648c298475dbbd524a7981cc2ad", + "IPY_MODEL_29adf88558b64e93b179cd1087032ae2", + "IPY_MODEL_807ca6b59c494877acd1d7672e2d0e42" + ], + "layout": "IPY_MODEL_4627ade20aea4966a15122cdd52f6a25" + } + }, + "a63c2648c298475dbbd524a7981cc2ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_73068a350b9a481d9363f24053235c4b", + "placeholder": "​", + "style": "IPY_MODEL_db04d1ca966a43b0be0bbd3ad4ddb515", + "value": "README.md: 100%" + } + }, + "29adf88558b64e93b179cd1087032ae2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_024c0c5a1c5542babf6cf130f0648b27", + "max": 982, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_14a012520c1340ee9264630bb456ce95", + "value": 982 + } + }, + "807ca6b59c494877acd1d7672e2d0e42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2be7b0a20ea843af879c32c6d8707138", + "placeholder": "​", + "style": "IPY_MODEL_d60a95c9eb6d4ca5be81eb67ac34b87d", + "value": " 982/982 [00:00<00:00, 125kB/s]" + } + }, + "4627ade20aea4966a15122cdd52f6a25": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "73068a350b9a481d9363f24053235c4b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "db04d1ca966a43b0be0bbd3ad4ddb515": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "024c0c5a1c5542babf6cf130f0648b27": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "14a012520c1340ee9264630bb456ce95": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2be7b0a20ea843af879c32c6d8707138": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d60a95c9eb6d4ca5be81eb67ac34b87d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "68995941f8e649a1a5265b073c86f84c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_f4b859550a47428ba4988a7c582443eb", + "IPY_MODEL_66402b5fde234614b92ea5786b108f5c", + "IPY_MODEL_e6e4248babc74ac9ae46c47fb3d2a371" + ], + "layout": "IPY_MODEL_4caa19e33d8b4be7a1d3b083b0c1948d" + } + }, + "f4b859550a47428ba4988a7c582443eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f62d9af82c9146beab3ed27b85077af5", + "placeholder": "​", + "style": "IPY_MODEL_88f1deb88087491eaf91cc902772ab79", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "66402b5fde234614b92ea5786b108f5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3c3b82e37f1249c29dcbc663dd95d4f8", + "max": 116531415, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d3bf74e15c984629aafd83ad8f5e0d92", + "value": 116531415 + } + }, + "e6e4248babc74ac9ae46c47fb3d2a371": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_9371b6a9e05847cba1b74278e68955ad", + "placeholder": "​", + "style": "IPY_MODEL_502e2c08bc2941448e984a1f50401c72", + "value": " 117M/117M [00:01<00:00, 259MB/s]" + } + }, + "4caa19e33d8b4be7a1d3b083b0c1948d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f62d9af82c9146beab3ed27b85077af5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "88f1deb88087491eaf91cc902772ab79": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3c3b82e37f1249c29dcbc663dd95d4f8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d3bf74e15c984629aafd83ad8f5e0d92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9371b6a9e05847cba1b74278e68955ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "502e2c08bc2941448e984a1f50401c72": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "59cbb4c555d848079284ffa4f63cdb04": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e0b731ea60c24ff98c0803c6072568b0", + "IPY_MODEL_a01e4ad102e74c869953e5303fb5da79", + "IPY_MODEL_956c0ca869d04bd084abff9e9ff8afa7" + ], + "layout": "IPY_MODEL_095b148b6c8d4201a4c631fd0903c11d" + } + }, + "e0b731ea60c24ff98c0803c6072568b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1527b6baf1e24722aecbe33f6ffd1e52", + "placeholder": "​", + "style": "IPY_MODEL_ba42d40812c1453ab8208bce2693e79d", + "value": "Generating train split: 100%" + } + }, + "a01e4ad102e74c869953e5303fb5da79": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1fd1672a2bb041e8be285cd8fb1a413e", + "max": 100000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5f1175f9e50e4183b99fc7106a9b39c7", + "value": 100000 + } + }, + "956c0ca869d04bd084abff9e9ff8afa7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_95800a9caeed4806a66b25ead152aed2", + "placeholder": "​", + "style": "IPY_MODEL_476c623468944e438825f5269b5acf04", + "value": " 100000/100000 [00:00<00:00, 144178.01 examples/s]" + } + }, + "095b148b6c8d4201a4c631fd0903c11d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1527b6baf1e24722aecbe33f6ffd1e52": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ba42d40812c1453ab8208bce2693e79d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1fd1672a2bb041e8be285cd8fb1a413e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5f1175f9e50e4183b99fc7106a9b39c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "95800a9caeed4806a66b25ead152aed2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "476c623468944e438825f5269b5acf04": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6049cf47e5e041a4beea128794964783": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_5ba4d1ced34a475f815ec6058655d74b", + "IPY_MODEL_7f640a553df64132a426f5b7feb782ad", + "IPY_MODEL_dd010cedf382401885dc4ce94b3147c8" + ], + "layout": "IPY_MODEL_5421003613f048069cb55182938d6791" + } + }, + "5ba4d1ced34a475f815ec6058655d74b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4828ea99e77c4902859515b982960f4a", + "placeholder": "​", + "style": "IPY_MODEL_49905865471146b8b91e88a4e60a6208", + "value": "Unsloth: Standardizing formats (num_proc=16): 100%" + } + }, + "7f640a553df64132a426f5b7feb782ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_d987e0891a894c19891f2dff1a0aafba", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b9fc627b365d4a4fad300999cd193586", + "value": 3000 + } + }, + "dd010cedf382401885dc4ce94b3147c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e68d04fef6354c2e874adb5e1673591c", + "placeholder": "​", + "style": "IPY_MODEL_5d59bfca1ac44464aa9d4c6df2a4dfc6", + "value": " 3000/3000 [00:01<00:00, 215.27 examples/s]" + } + }, + "5421003613f048069cb55182938d6791": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4828ea99e77c4902859515b982960f4a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "49905865471146b8b91e88a4e60a6208": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d987e0891a894c19891f2dff1a0aafba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b9fc627b365d4a4fad300999cd193586": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e68d04fef6354c2e874adb5e1673591c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5d59bfca1ac44464aa9d4c6df2a4dfc6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e74375a06bf84083bf0198a59d0a8204": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d097e15ca15c4d2eb74520873c028809", + "IPY_MODEL_09205f37e867471cba0c6d9bc93d1fa6", + "IPY_MODEL_8ff9730f06e44b4f835a79f8aa948815" + ], + "layout": "IPY_MODEL_1984c66eaca44ac487b177b939d31122" + } + }, + "d097e15ca15c4d2eb74520873c028809": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_42355bb88a2246d4bb25e05c6d1e6aca", + "placeholder": "​", + "style": "IPY_MODEL_7369d3e3e2bf4530ab7f0999b393a2ea", + "value": "Map: 100%" + } + }, + "09205f37e867471cba0c6d9bc93d1fa6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3caf02c6f3524f889a4a22e2c09ea2ec", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3f97ac1599e5474f818d83971acc18e9", + "value": 3000 + } + }, + "8ff9730f06e44b4f835a79f8aa948815": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_04e9b0514e284cf3aba462aca7906064", + "placeholder": "​", + "style": "IPY_MODEL_0bea037f647346fc9feff2f63659422d", + "value": " 3000/3000 [00:00<00:00, 10342.06 examples/s]" + } + }, + "1984c66eaca44ac487b177b939d31122": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "42355bb88a2246d4bb25e05c6d1e6aca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7369d3e3e2bf4530ab7f0999b393a2ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3caf02c6f3524f889a4a22e2c09ea2ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3f97ac1599e5474f818d83971acc18e9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "04e9b0514e284cf3aba462aca7906064": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0bea037f647346fc9feff2f63659422d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "872c4aa8a612431aaf11581cf8b7e966": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_cc0fdf131fe944ae8686ab413b48b40b", + "IPY_MODEL_ccf366fe1da44dad97716da52be0fa95", + "IPY_MODEL_559f5ce577684e7d8fbb3eeca3df7481" + ], + "layout": "IPY_MODEL_9ab84bc270d5426ea6503200962c0008" + } + }, + "cc0fdf131fe944ae8686ab413b48b40b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cdeb781f1d16460c8155bd7616790995", + "placeholder": "​", + "style": "IPY_MODEL_86b55c60b19b4f60b632c94ffdb3597d", + "value": "Unsloth: Tokenizing ["text"] (num_proc=16): 100%" + } + }, + "ccf366fe1da44dad97716da52be0fa95": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2025f98694a14209a17310de5e27f29f", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_22e6e92bdff246b5b4f8aa2240bcba77", + "value": 3000 + } + }, + "559f5ce577684e7d8fbb3eeca3df7481": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0d0d95b0a65643fdb1aac22b0fc22f25", + "placeholder": "​", + "style": "IPY_MODEL_bee9f63027394da28a6faa2cda06d291", + "value": " 3000/3000 [01:15<00:00, 41.22 examples/s]" + } + }, + "9ab84bc270d5426ea6503200962c0008": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cdeb781f1d16460c8155bd7616790995": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "86b55c60b19b4f60b632c94ffdb3597d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2025f98694a14209a17310de5e27f29f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "22e6e92bdff246b5b4f8aa2240bcba77": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0d0d95b0a65643fdb1aac22b0fc22f25": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bee9f63027394da28a6faa2cda06d291": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "600afd872d0b4dadb9677e9d59620d58": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_03e9c6947b0b4d6fa0af144ef565d031", + "IPY_MODEL_dc810e34048d4513978b2305648244d1", + "IPY_MODEL_1c2a909bce414df7b84adedc6926c93e" + ], + "layout": "IPY_MODEL_34b591f71b084110aadd8faa7b7114ec" + } + }, + "03e9c6947b0b4d6fa0af144ef565d031": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6e803de562a14c9abc53c8b443d491f7", + "placeholder": "​", + "style": "IPY_MODEL_9ba237b2fba6415c978bd4a5bcc770ea", + "value": "Map (num_proc=16): 100%" + } + }, + "dc810e34048d4513978b2305648244d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c59fccf351e140b3b13a1e7ffcfcc831", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_78e8c0b69d874b80a2fbea663e69ba31", + "value": 3000 + } + }, + "1c2a909bce414df7b84adedc6926c93e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d50c59ac24704031adb090719c434fda", + "placeholder": "​", + "style": "IPY_MODEL_4b4f33ad34da4f6497253382c7844cda", + "value": " 3000/3000 [00:01<00:00, 3327.87 examples/s]" + } + }, + "34b591f71b084110aadd8faa7b7114ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6e803de562a14c9abc53c8b443d491f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9ba237b2fba6415c978bd4a5bcc770ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c59fccf351e140b3b13a1e7ffcfcc831": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "78e8c0b69d874b80a2fbea663e69ba31": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d50c59ac24704031adb090719c434fda": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4b4f33ad34da4f6497253382c7844cda": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6152711b99344dc6b6d141b128af930b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_13d590f781154376b848f9d756e8796c", + "IPY_MODEL_6724357188ef4e299617e98e225cb8de", + "IPY_MODEL_e6ce43521f604724b1f06544c905fe8f" + ], + "layout": "IPY_MODEL_9dab1d53f37740aba9d4305b49a7762f" + } + }, + "13d590f781154376b848f9d756e8796c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ce279b6352454b8cba47abe09ab90fbf", + "placeholder": "​", + "style": "IPY_MODEL_cf39c43b758d4dfc8a0381cf5f7a0a88", + "value": "Filter (num_proc=16): 100%" + } + }, + "6724357188ef4e299617e98e225cb8de": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c8d2257696c249acba128829c980b7af", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7455963b87ab44eebcf2ef2e2b210a76", + "value": 3000 + } + }, + "e6ce43521f604724b1f06544c905fe8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_fc174c4d0bce41b391202791257feb30", + "placeholder": "​", + "style": "IPY_MODEL_66340c02de25445d9c432e1c183e468a", + "value": " 3000/3000 [00:01<00:00, 1758.59 examples/s]" + } + }, + "9dab1d53f37740aba9d4305b49a7762f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ce279b6352454b8cba47abe09ab90fbf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cf39c43b758d4dfc8a0381cf5f7a0a88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c8d2257696c249acba128829c980b7af": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7455963b87ab44eebcf2ef2e2b210a76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "fc174c4d0bce41b391202791257feb30": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "66340c02de25445d9c432e1c183e468a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Vision.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Vision.ipynb new file mode 100644 index 0000000..2ebf928 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(31B)-Vision.ipynb @@ -0,0 +1,6404 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "2vQXvnUUsTzI" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab A100 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7j01DfVgsTzJ" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6dT42nHksTzJ" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K7fgQkATsTzK" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "vA7IKFdUsTzK" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "Mp4i13PHsTzK" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GFOEZbP7ONMs" + }, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "QmUBVEnvCDJv", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 461, + "referenced_widgets": [ + "cca48201ab524349b98bd7dc3ec0a371", + "a74922ad802c4cfe96d3f7c9d0215877", + "30e429603fbb48469d80e5ca48305216", + "2bc496ecfb4e410ba3ba46451dd38cac", + "ddb467daf231485199b6820c1c87be59", + "6c30ba7b3fc84a63b7b8975e8b17991c", + "3b10e74e5c6b421092b314f71f7e9217", + "d2bc2f8ade924beca4c2db847efa6f5d", + "eed52dc4a67d4253983ee7b20918152d", + "642d63ab9f7c451fa96a0633c1a7f23c", + "72cbdfb8889a4da0bcc0a4e5d5a67ac2", + "26121d7e6555452ab0f5ac2a6681d864", + "e239143f8ec0425db6135a5d749c2c53", + "b86cb0f30f674656aff10b0701f9f26f", + "a7cf44db72fc47b8b8f7a084b7585656", + "acbd99a66aa846d78396dcf40ebc8bd7", + "35ae415e878e486fa0caad09b8408067", + "0b4dda8099954b0d8851c05e24ed0e35", + "cbd50ad058134a36bfcd386deac87fb8", + "1d572d34d67b4d6b832203a27f44f93c", + "b988bc006f284214883cba413dfb5fc3", + "1b43696ca662419ea0c970b05d89441d", + "69394dfeff2a4286bb7088f599bf4c0b", + "a4e7a791f92449978900effc00e5100a", + "49e5b9f4cea744fc8f38a8adabc0bd42", + "08785606a9034297aa16181720c51142", + "e6e357b71bb8474d82d98ce813aa2183", + "a36232c6617141a1b0fdfe0108550ae0", + "7563a57897d846f6ba41007b0c92135e", + "da65718025e64f83a198f99f8fa48c3b", + "96e509dc48aa456da20260357e60677b", + "63f6774afc314b52b1ba82f5335d67a3", + "b4357ad98d3b4113ae9dab45333b8ee4", + "b7eddc272b2f4b0db9d910b1fa53bae1", + "c25094678b464bd0b693dcfe333da14f", + "5332bd2cc65145c49a843bc835d51373", + "903d6cf82ea44919a1739b2fbae8f16a", + "5382cb936c2b46d59e1819622ee8ef39", + "bc3b830bad5c4d78b64406b4f19cc370", + "09a61bb08189489687754346b906b875", + "91bb3728a52042aeb9947caf54dda34e", + "1aadf052247c44d8bb0081cd68234fa8", + "1e5f5a2acd9b47ed972c98ef4428f03d", + "31cbc371336f456795651381a7e3ad0a", + "0dbb262cf30643659120f8cdb5b3171c", + "abd6e0b4b3f24f1cb818aab793d61477", + "b30a2b86573844d5bf4a6f43e5bd8823", + "6c98eca1409f4e1ba2e7865b2992f51e", + "bceaf428e3fc4bcea2318512a7c6ef4b", + "5cdef7c8d58c441daaaddb9f34bc1a7d", + "5c4901ca1dd44ee69bb5bb76b1cb3fb4", + "25768d586f0f4d5cb9c86d01b13e7fa1", + "f962bb7a63094308b1ec98cd84c90637", + "9a305de1de4a4fb797d14e996e802ca0", + "29a723a6b8b7436faa14620beff25597", + "87fa7a1186c04503994d3ca6781f2fa2", + "70dd1d3746a14a5cac5fb65edb8ac231", + "6144783cd98542e3ac0488d1f1c92c35", + "d605282333054e82a1d8507be830f02f", + "dfbb2f74208243238c1dc88dcc4d45e7", + "555c3a2ab47c4cb4b872fd067c15c600", + "e60657aaf58d4373a3e777352ab720c3", + "7c9085eed1be41b8b6d61f5eef968825", + "0357ffa5f3224994a2917f7f09affff3", + "062b5afb6d9f492aa62fd5547fc6d5eb", + "6e53b93ebdf045e9b94eedd1bd489b3d", + "d2a7e731aa05474299243a698d8f8e76", + "9c8ecc577ca6479aad38d1af6c783685", + "5cd3447374284aa6a9d62e5a72f5ff3c", + "b49a335de14944a5afb36a8ec263c6c8", + "94e9455af5d94b089a5ceb122446b782", + "3aae33b4c0ef45e597513265bc4b0681", + "2efb2666390a482b913a30109a7e2472", + "0ce0b6f052db48c28f7788e95df7c1f3", + "01917cd89aef4db0aa18675636f4e981", + "58ee20c84f774dceaa69985bd3c63afa", + "9d8eb917864e4be1b788f9cfcd64e182", + "a955958aff0444a4839aafca8566065c", + "867f014d40bd409fa6c845436b050fd3", + "dd08aebf4c9b44b692534426ea948cdb", + "6e0c925129ea45b6bce91769e084e9f3", + "e3a3e391d3114a94985fd3db6cc5ee1a", + "c224a759bea64ffbbf3b645a59cd79c5", + "e696b055c6934f1186078767877ff2a2", + "319292819e264a19a27685601c70f9b6", + "bb1795785a6a44ec9b17b31b1075cbb3", + "5536ee38467e4557bbb1209cb7b4e424", + "b9c49626bcbb4e8bb6d4a01a08fab4dd", + "4cfc78a661dd4837b26a78d7dba376b0", + "ee345697fcfc4468a50627bcff074655", + "3ed7a054b0104bd09132227f1ed413ba", + "59667e10734c42218476077f7741da15", + "e1d2d9a63d3f43dca2a8e097470d2c76", + "a743692b1eae456cad70ecf0d3752493", + "d6ad093be12e4a3e9b7c75160aeb2fb9", + "746d3b1ccba940e69fc9bf50eb1986c8", + "580577e9f9a5425f9ca10479f42b3d16", + "27b4eafed4584bcda6f88f1fb82f9212", + "d6caa192c711497b856f18df2f5d9a62" + ] + }, + "outputId": "a348cecd-dff0-4511-80fb-c1c3e1079230" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "Unsloth: Your Flash Attention 2 installation seems to be broken. Using Xformers instead. No performance changes will be seen.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| NVIDIA A100-SXM4-40GB. Num GPUs = 1. Max memory: 39.494 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 8.0. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = TRUE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors.index.json: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "cca48201ab524349b98bd7dc3ec0a371" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (incomplete total...): 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "26121d7e6555452ab0f5ac2a6681d864" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Fetching 2 files: 0%| | 0/2 [00:00\n", + "### Data Prep\n", + "We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions.\n", + "\n", + "You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "LjY75GoYUCB8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "referenced_widgets": [ + "19f9e04dafa744d0bbafe658a8cd4479", + "f261579b58c94894a6c186255415e54b", + "d36d30757ab34602ab6411c282171802", + "0ac1ef374ce34494a9ade7b68c1fcb7a", + "588e76027ce9499e8e7683f00c8bd999", + "23bb3393ad0342aaa993c5109af01cbb", + "1b9c16155dec43db992c6140ea535912", + "5b938c6422c64286aed0276899c260b3", + "74fce0116e3b4cf4abde0af7563ebccb", + "a67007d24e9b4a11a35f955db150d486", + "f91df33daa9348e7abede2d855dc0ecb", + "717b21eed2084ebe9ddcf9a0da8c1c7f", + "1e690555c06540359b89b87c6ae62a9c", + "bddd2d47d2bd40fb9d68be94ebacc0d7", + "b875ef0b812d44cd8e1fd102b597149b", + "91c2f197fcf94b02bbbb780cced6c0de", + "8cd8dc2aafd04685b8cb3fb746f08005", + "f30f8e430cad427d9086bc99f6f146be", + "c048a0b91a5a4bf7803fb3d5ba994acd", + "6de4762ccf1a42e6b51f18880b37cd50", + "4d0707913c734e899854b548bc3364a7", + "bd20452eab634993b4a716a1cdd9a4ea", + "ae951bf9259b4054a23534387dc83f8d", + "647e5bcc9d3a4cf4a1e9889cd805c45e", + "a71f8702013a453c894debaa8640a215", + "04ff990ba34c43d99e872fec5f39f0a7", + "1f722501e2894a22b83ed42f482cdec7", + "f28bf1e32d7542479fe827a3723089c9", + "4c298b0109bb4734a876c69ef32e5f6b", + "51da57c93dd549b6981874d40f26049e", + "282c398a45784093a51432726ec260c5", + "b4d4af7fd215445282451eadc69f9bd5", + "b9825625d8f54c188698e0a8d5a03e0b", + "a469f167acc94d0a93fb8bf94fe5c13a", + "4153276526fc459ea16f69f29f82d8dd", + "2006a3d483f24f96b38021cb9a7e3af8", + "77b8d2488e044518add72302d4875797", + "ebb50b363f5d4fd49c35937434858d4d", + "22d14ea43aa6418786ff501f5e1e0cc1", + "1ca26cff3ae149d88a53bb1e165a299a", + "28eec1a723c9433baff472e352125935", + "15583a029d5e4a78a60f68c865d064b1", + "784a50c5430743d98d944aaed6c23479", + "81f8fcd62a8d4077830a3be2ed444cfb", + "e4a0c21c1bc341e589cce85b98ce2737", + "a14ce85211314a9ba56598ef14968b7c", + "116190e5f17946b88241a2b318522765", + "299a8904e4834fe38d81c804e0669a22", + "0a161c324ea94abf955d4824199d79bf", + "40b91e46da234c6bbef9adb542336f43", + "3a3ec79b99c8435ea208b9292b0d3bbb", + "9a55c6d9f4284fae92e4c4fd079c7905", + "9ef11b00c45d436794e9acad12715ec9", + "6d20f7eb80cf4d54a1c34e3d185ee227", + "aa2ede79b4464737a0d504e403af5791" + ] + }, + "outputId": "7654cb9e-7320-431b-d486-a0e92053facf" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/519 [00:00" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUAAAAAyCAIAAACib5WDAAAYrUlEQVR4Ae3cebSuUx0HcCSFEBHKlNZCQi2zureMyTwrY2UeQlSaXNdQxjSSMltFSJF5bjCzDMuilUUUIjSKotLtc+83+z73eYd7znve877n3vXuP56zn/389m/av2FP75l10qRJswzKQAMDDcyYGphtxmS7P1wPgl1/9N4nqoZ77I/4TOvA3dU+bP/5z39mnXXWPtnSgGwfNGC4lf/+9799oD1kkjOnA1N6tD9kPUwHELbZZ5/9hRde+Oc//zkd0Ol9FgteffXVsR/apyfHTP6dCT3zzDP/+Mc/ZpttTPvImGauYxuh9BdffPHvf//7v/71r46RpCNPM5Zc7uijj37729/+ne98J9m4Y7Riwete9zpPKb1jJIOOo6qBjPinP/3pt7zlLddcc82///1vBjCqFDtHzhxnpsIraP/nP//5IossMvfcc3/5y18mHTfuWMZky0022YSKf/rTnwrJSHSMTd8//vGP55133qabbvr888/Dg9uOsQ06jpIG4sCvvPLKxhtvbNzFboS48SiRGwnamTADS25i5+abbz7PPPMYg85j2yyz8F7J/IYbbrjyyiu/8pWvwPmGN7xB/uwAp0HSy7xggw02uO2222688cbXv/71HeAZdOmBBpiQYoAuv/zy973vfccee+xf//pXa6gMYg8YGAaJkXj/WOub3HjVVVfxsb/85S+m0JasI2EyqVs4gNACmD8rI0Go+9/+9jcYllpqKalYZZCBR6LPUe2blHv77bdzp2OOOQatkUzlRonV2Yfh62MelDNImBxYsJxzzjlly66wbCrO8cRjyA3DSHCK6/POO6/JM+NQHwmqbvUl0RjhpFsSTRdPBnG6UovaIFdffXWQpk7TRdsXgJlnCk3XfEyMPPPMMw8++OA55pgj8XLkahUXIMmojxwbPCxj5Hi6hWG6dtwtQmMHD5GHKDWwTOLG1JBVNdmJAzNoCaSKZezUX375ZRqXMKeM0VDHqZf8D9F0esOSaCK3ZBrfG4pjgQojUYYYkU278DxE4N5L14kDE6mLGzBU0xXtWABT33e/+13PDTfc0DOq771O21MkbFJ6F91migqHp8Z0sTez8sorW94LK1qqnAeg2tL3urgc1TXlxCcATT+Vxixrv/SlL33xi18kcmymfJ0RK00cmFTkVFQoRUmLp0kpIR3STJw4EYB6bdSHpQJ94ZycJae971IolvEoLWGpFRUILS/NdtZbbz0w7R0YqqqNtsfciuJw2yPs/PPPb33umdfhIqnBFx3W1FgDa3wFjw1jqlLdrqdtwIW3kQxxI9HGFvxPMbfJ9la+ptEzzGhnDEa2OqbVrwB8AlBspqAqFYKAIReYPAvyAjPDVZo4sB0gCVZRIbCSFk8LSzJffPHFRx11VFXdnYlNiXBKAgoqBUmhWBYepSUsFchSMTYYlknOPvtswwNh+dSqAlWxUTCtMLfq3lk7S3388cfPPffcxx57zFM9cbAzbHoRHOe23J9++umXXnqpqsamOA2f2SN31fGCCy5Ya621jOl73vOeww47jDYwEyvXF8I//elPKto1NsWWRthEgTb2oHsbDPifYm6T7a1QSaNnJIr3/vjHP77++uvBBFv5Gj/0CUBTHw6HCRNO4J3nX3311Ysttli2poItmgHTJgQU9sZOZarKwpOROO200/785z+TiiRbb7219lxGIZvbEXvsscc555zzqU99yjavFqrvQBjIFR0///nP/+hHP1I/5ZRTHJozAght3N9///2sxwbghz70IWBarrvuOpaEpQ9/+MNrrrmmLo3G6uDXIY30izfjAb4Vb4z41FNP/dnPfrbffvtB+PGPf3y++ebbZpttxo8fr2MJHK26d9wOuSNl04TDDz/8d7/7nfqee+7ZMTYdyXjkkUf+5Cc/eec73/mLX/zC0Gy22Wa01CjCZI1PmvTkk0/+8pe/3GWXXfR985vfTN7vf//7H/vYx3JjIZzcddddAjTH/tWvfrXoooti8o1vfGNoBaA8jRcvEol23nnnueaaq7TXKm0Ggr1973vf+/3vf6+7Kclee+1lUsDfTj75ZPEI/o022shwE8ftl69//euXXnopKfQycG9605vKkGl817veteWWW7LJj370o0UDNQ7dw1lppZWeeuopA7HPPvuwE6xO1su0mqnxP6Zfw32epCI55wnHZ511ltDOJahVi+QmYwhd6txJF9qpdh96HRXAa6+9ttj/3HPPPfLIIwxF1MCAAeC6biyiwm4SSjzTgiVf0QVZJRdOEp4du/tkjKsApa6jXS5fP/GJTyDhvqtPv/nNb9T333//Wscg4WyChbH3tUa3oO19JSJLJjjHP1ZlVG7geBmTjXym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\n", + "image/jpeg": "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\n" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "dataset[2][\"image\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "lXjfJr4W6z8P", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 70 + }, + "outputId": "cb5eb325-8bd4-46f1-e3a9-f565d5bd289a" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'H ^ { \\\\prime } = \\\\beta N \\\\int d \\\\lambda \\\\biggl \\\\{ \\\\frac { 1 } { 2 \\\\beta ^ { 2 } N ^ { 2 } } \\\\partial _ { \\\\lambda } \\\\zeta ^ { \\\\dagger } \\\\partial _ { \\\\lambda } \\\\zeta + V ( \\\\lambda ) \\\\zeta ^ { \\\\dagger } \\\\zeta \\\\biggr \\\\} \\\\ .'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "dataset[2][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rKHxfZua1CrS" + }, + "source": [ + "We can also render LaTeX directly in the browser!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "nPopsxAC1CrS", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "df37c129-7a34-43ce-962f-183f266bdb80" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/latex": "$\\displaystyle \\sigma ^ { \\mu } \\frac { \\lambda ^ { a } } { 2 } A _ { \\mu } ^ { a } .$" + }, + "metadata": {} + } + ], + "source": [ + "from IPython.display import display, Math, Latex\n", + "\n", + "latex = dataset[3][\"text\"]\n", + "display(Math(latex))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K9CBpiISFa6C" + }, + "source": [ + "To format the dataset, all vision fine-tuning tasks should follow this format:\n", + "\n", + "```python\n", + "[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "oPXzJZzHEgXe" + }, + "outputs": [], + "source": [ + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "def convert_to_conversation(sample):\n", + " conversation = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": sample[\"text\"]}]},\n", + " ]\n", + " return {\"messages\": conversation}\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FY-9u-OD6_gE" + }, + "source": [ + "Let's convert the dataset into the \"correct\" format for finetuning:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "gFW2qXIr7Ezy" + }, + "outputs": [], + "source": [ + "converted_dataset = [convert_to_conversation(sample) for sample in dataset]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "The first example is now structured like below:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "gGFzmplrEy9I", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "df44e584-c376-4d2d-c483-4285428edc37" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'messages': [{'role': 'user',\n", + " 'content': [{'type': 'text',\n", + " 'text': 'Write the LaTeX representation for this image.'},\n", + " {'type': 'image',\n", + " 'image': }]},\n", + " {'role': 'assistant',\n", + " 'content': [{'type': 'text',\n", + " 'text': '{ \\\\frac { N } { M } } \\\\in { \\\\bf Z } , { \\\\frac { M } { P } } \\\\in { \\\\bf Z } , { \\\\frac { P } { Q } } \\\\in { \\\\bf Z }'}]}]}" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ], + "source": [ + "converted_dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MsRPBIb0JJ6c" + }, + "source": [ + "Lets take the Gemma 4 instruction chat template and use it in our base model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "exoDVEvmJN-6" + }, + "outputs": [], + "source": [ + "from unsloth import get_chat_template\n", + "\n", + "processor = get_chat_template(\n", + " processor,\n", + " \"gemma-4-thinking\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FecKS-dA82f5" + }, + "source": [ + "Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "vcat4UxA81vr", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d5089c79-8359-4dbe-bd66-2b1253310113" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The LaTeX code for the equation in the image is:\n", + "\n", + "```latex\n", + "H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\zeta^\\dagger \\partial_\\lambda \\zeta + \\mathcal{V}(\\lambda) \\zeta^\\dagger \\zeta \\right\\} .\n", + "```\n", + "\n", + "**Rendered Equation:**\n", + "$$H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\zeta^\\dagger \\partial_\\\n" + ] + } + ], + "source": [ + "image = dataset[2][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FeAiMlQ71CrS" + }, + "source": [ + "You can see it's absolutely terrible! It doesn't follow instructions at all" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning!\n", + "\n", + "We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "95_Nn-89DhsL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1bedc6bd-3573-43d6-b930-46f1312d0870" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = converted_dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 4,\n", + " max_grad_norm = 0.3,\n", + " warmup_ratio = 0.03,\n", + " max_steps = 60,\n", + " # num_train_epochs = 2, # Set this instead of max_steps for full training runs\n", + " learning_rate = 2e-4,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\", # For Weights and Biases or others\n", + "\n", + " # You MUST put the below items for vision finetuning:\n", + " remove_unused_columns = False,\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 2048,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "30eaeb52-6380-4bef-fe5f-5fab21c3c0d2" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = NVIDIA A100-SXM4-40GB. Max memory = 39.494 GB.\n", + "19.482 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "9842dd7e-0b1f-4f83-de92-982c021bc768" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 68,686 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 266,963,456 of 31,540,049,968 (0.85% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 06:15, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
13.049649
23.714972
33.310120
43.078652
52.219565
61.768622
71.029011
80.927911
90.854767
100.424313
110.466835
120.503272
130.467726
140.267040
150.208669
160.212328
170.198571
180.158870
190.196536
200.138079
210.152322
220.187750
230.286993
240.156409
250.143032
260.183632
270.215106
280.153457
290.236711
300.231810
310.184119
320.195166
330.162600
340.160010
350.181705
360.173868
370.118509
380.167147
390.144002
400.210267
410.188537
420.131262
430.186414
440.167026
450.114353
460.124952
470.200051
480.136990
490.224131
500.128734
510.124725
520.211169
530.180625
540.172517
550.232271
560.448664
570.129194
580.109717
590.223892
600.146485

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "dc83f244-231c-483d-83d0-c2d0ebe620f4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "410.1801 seconds used for training.\n", + "6.84 minutes used for training.\n", + "Peak reserved memory = 21.363 GB.\n", + "Peak reserved memory for training = 1.881 GB.\n", + "Peak reserved memory % of max memory = 54.092 %.\n", + "Peak reserved memory for training % of max memory = 4.763 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model! You can modify the instruction and input—just leave the output blank.\n", + "\n", + "We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "kR3gIAX-SM2q", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "46954df8-cab3-4a85-f4ad-176d7251c998" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "\\left[ \\left[ B _ { n } ^ { + } , b _ { 2 } ^ { - } \\right] , b _ { 2 } ^ { + } \\right] = n B _ { n } ^ { + } , \\quad \\left[ \\left[ B _ { n } ^ { - } , b _ { 2 } ^ { + } \\right] , b _ { 2 } ^ { - } \\right] = n B _ { n } ^ { - } .\n" + ] + } + ], + "source": [ + "image = dataset[10][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "upcOlWe7A1vc", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4a815ae8-22d9-47ee-ad27-aee38c2b10e9" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "MKX_XKs_BNZR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1ab27847-31a6-4565-d766-485d4c548dab" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "<|channel>thought\n", + "The image contains a mathematical equation written in LaTeX notation:\n", + "\n", + "$$ D _ { \\mu } ^ { \\alpha \\beta } \\bar { A } _ { \\mu } ^ { \\alpha \\beta } = 0 , $$\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastVisionModel\n", + "\n", + " model, processor = FastVisionModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " load_in_4bit = True, # Set to False for 16bit LoRA\n", + " )\n", + "\n", + "sample = dataset[1]\n", + "image = sample[\"image\"].convert(\"RGB\")\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": sample[\"text\"],\n", + " },\n", + " {\n", + " \"type\": \"image\",\n", + " },\n", + " ],\n", + " },\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True)\n", + "_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "# Select ONLY 1 to save! (Both not needed!)\n", + "\n", + "# Save locally to 16bit\n", + "if False: model.save_pretrained_merged(\"unsloth_finetune\", processor,)\n", + "\n", + "# To export and save to your Hugging Face account\n", + "if False: model.push_to_hub_merged(\"YOUR_USERNAME/unsloth_finetune\", processor, token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TSjNVDCYv-yr" + }, + "source": [ + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.13.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "cca48201ab524349b98bd7dc3ec0a371": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a74922ad802c4cfe96d3f7c9d0215877", + "IPY_MODEL_30e429603fbb48469d80e5ca48305216", + "IPY_MODEL_2bc496ecfb4e410ba3ba46451dd38cac" + ], + "layout": "IPY_MODEL_ddb467daf231485199b6820c1c87be59" + } + }, + "a74922ad802c4cfe96d3f7c9d0215877": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6c30ba7b3fc84a63b7b8975e8b17991c", + "placeholder": "​", + "style": "IPY_MODEL_3b10e74e5c6b421092b314f71f7e9217", + "value": "model.safetensors.index.json: " + } + }, + "30e429603fbb48469d80e5ca48305216": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_d2bc2f8ade924beca4c2db847efa6f5d", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_eed52dc4a67d4253983ee7b20918152d", + "value": 1 + } + }, + "2bc496ecfb4e410ba3ba46451dd38cac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_642d63ab9f7c451fa96a0633c1a7f23c", + "placeholder": "​", + "style": "IPY_MODEL_72cbdfb8889a4da0bcc0a4e5d5a67ac2", + "value": " 120k/? [00:00<00:00, 11.1MB/s]" + } + }, + "ddb467daf231485199b6820c1c87be59": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6c30ba7b3fc84a63b7b8975e8b17991c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3b10e74e5c6b421092b314f71f7e9217": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d2bc2f8ade924beca4c2db847efa6f5d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "eed52dc4a67d4253983ee7b20918152d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "642d63ab9f7c451fa96a0633c1a7f23c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "72cbdfb8889a4da0bcc0a4e5d5a67ac2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "26121d7e6555452ab0f5ac2a6681d864": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e239143f8ec0425db6135a5d749c2c53", + "IPY_MODEL_b86cb0f30f674656aff10b0701f9f26f", + "IPY_MODEL_a7cf44db72fc47b8b8f7a084b7585656" + ], + "layout": "IPY_MODEL_acbd99a66aa846d78396dcf40ebc8bd7" + } + }, + "e239143f8ec0425db6135a5d749c2c53": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_35ae415e878e486fa0caad09b8408067", + "placeholder": "​", + "style": "IPY_MODEL_0b4dda8099954b0d8851c05e24ed0e35", + "value": "Download complete: 100%" + } + }, + "b86cb0f30f674656aff10b0701f9f26f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_cbd50ad058134a36bfcd386deac87fb8", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1d572d34d67b4d6b832203a27f44f93c", + "value": 1 + } + }, + "a7cf44db72fc47b8b8f7a084b7585656": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b988bc006f284214883cba413dfb5fc3", + "placeholder": "​", + "style": "IPY_MODEL_1b43696ca662419ea0c970b05d89441d", + "value": " 62.5G/62.5G [02:48<00:00, 396MB/s]" + } + }, + "acbd99a66aa846d78396dcf40ebc8bd7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "35ae415e878e486fa0caad09b8408067": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0b4dda8099954b0d8851c05e24ed0e35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "cbd50ad058134a36bfcd386deac87fb8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "1d572d34d67b4d6b832203a27f44f93c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b988bc006f284214883cba413dfb5fc3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1b43696ca662419ea0c970b05d89441d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "69394dfeff2a4286bb7088f599bf4c0b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a4e7a791f92449978900effc00e5100a", + "IPY_MODEL_49e5b9f4cea744fc8f38a8adabc0bd42", + "IPY_MODEL_08785606a9034297aa16181720c51142" + ], + "layout": "IPY_MODEL_e6e357b71bb8474d82d98ce813aa2183" + } + }, + "a4e7a791f92449978900effc00e5100a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a36232c6617141a1b0fdfe0108550ae0", + "placeholder": "​", + "style": "IPY_MODEL_7563a57897d846f6ba41007b0c92135e", + "value": "Fetching 2 files: 100%" + } + }, + "49e5b9f4cea744fc8f38a8adabc0bd42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_da65718025e64f83a198f99f8fa48c3b", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_96e509dc48aa456da20260357e60677b", + "value": 2 + } + }, + "08785606a9034297aa16181720c51142": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_63f6774afc314b52b1ba82f5335d67a3", + "placeholder": "​", + "style": "IPY_MODEL_b4357ad98d3b4113ae9dab45333b8ee4", + "value": " 2/2 [02:48<00:00, 168.12s/it]" + } + }, + "e6e357b71bb8474d82d98ce813aa2183": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a36232c6617141a1b0fdfe0108550ae0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7563a57897d846f6ba41007b0c92135e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "da65718025e64f83a198f99f8fa48c3b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "96e509dc48aa456da20260357e60677b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "63f6774afc314b52b1ba82f5335d67a3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b4357ad98d3b4113ae9dab45333b8ee4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b7eddc272b2f4b0db9d910b1fa53bae1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_c25094678b464bd0b693dcfe333da14f", + "IPY_MODEL_5332bd2cc65145c49a843bc835d51373", + "IPY_MODEL_903d6cf82ea44919a1739b2fbae8f16a" + ], + "layout": "IPY_MODEL_5382cb936c2b46d59e1819622ee8ef39" + } + }, + "c25094678b464bd0b693dcfe333da14f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_bc3b830bad5c4d78b64406b4f19cc370", + "placeholder": "​", + "style": "IPY_MODEL_09a61bb08189489687754346b906b875", + "value": "Loading weights: 100%" + } + }, + "5332bd2cc65145c49a843bc835d51373": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_91bb3728a52042aeb9947caf54dda34e", + "max": 1188, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1aadf052247c44d8bb0081cd68234fa8", + "value": 1188 + } + }, + "903d6cf82ea44919a1739b2fbae8f16a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1e5f5a2acd9b47ed972c98ef4428f03d", + "placeholder": "​", + "style": "IPY_MODEL_31cbc371336f456795651381a7e3ad0a", + "value": " 1188/1188 [02:43<00:00, 87.31it/s]" + } + }, + "5382cb936c2b46d59e1819622ee8ef39": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bc3b830bad5c4d78b64406b4f19cc370": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "09a61bb08189489687754346b906b875": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "91bb3728a52042aeb9947caf54dda34e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1aadf052247c44d8bb0081cd68234fa8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1e5f5a2acd9b47ed972c98ef4428f03d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "31cbc371336f456795651381a7e3ad0a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0dbb262cf30643659120f8cdb5b3171c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_abd6e0b4b3f24f1cb818aab793d61477", + "IPY_MODEL_b30a2b86573844d5bf4a6f43e5bd8823", + "IPY_MODEL_6c98eca1409f4e1ba2e7865b2992f51e" + ], + "layout": "IPY_MODEL_bceaf428e3fc4bcea2318512a7c6ef4b" + } + }, + "abd6e0b4b3f24f1cb818aab793d61477": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5cdef7c8d58c441daaaddb9f34bc1a7d", + "placeholder": "​", + "style": "IPY_MODEL_5c4901ca1dd44ee69bb5bb76b1cb3fb4", + "value": "generation_config.json: 100%" + } + }, + "b30a2b86573844d5bf4a6f43e5bd8823": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_25768d586f0f4d5cb9c86d01b13e7fa1", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f962bb7a63094308b1ec98cd84c90637", + "value": 208 + } + }, + "6c98eca1409f4e1ba2e7865b2992f51e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_9a305de1de4a4fb797d14e996e802ca0", + "placeholder": "​", + "style": "IPY_MODEL_29a723a6b8b7436faa14620beff25597", + "value": " 208/208 [00:00<00:00, 25.4kB/s]" + } + }, + "bceaf428e3fc4bcea2318512a7c6ef4b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5cdef7c8d58c441daaaddb9f34bc1a7d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5c4901ca1dd44ee69bb5bb76b1cb3fb4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "25768d586f0f4d5cb9c86d01b13e7fa1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f962bb7a63094308b1ec98cd84c90637": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9a305de1de4a4fb797d14e996e802ca0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "29a723a6b8b7436faa14620beff25597": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "87fa7a1186c04503994d3ca6781f2fa2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_70dd1d3746a14a5cac5fb65edb8ac231", + "IPY_MODEL_6144783cd98542e3ac0488d1f1c92c35", + "IPY_MODEL_d605282333054e82a1d8507be830f02f" + ], + "layout": "IPY_MODEL_dfbb2f74208243238c1dc88dcc4d45e7" + } + }, + "70dd1d3746a14a5cac5fb65edb8ac231": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_555c3a2ab47c4cb4b872fd067c15c600", + "placeholder": "​", + "style": "IPY_MODEL_e60657aaf58d4373a3e777352ab720c3", + "value": "processor_config.json: " + } + }, + "6144783cd98542e3ac0488d1f1c92c35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_7c9085eed1be41b8b6d61f5eef968825", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0357ffa5f3224994a2917f7f09affff3", + "value": 1 + } + }, + "d605282333054e82a1d8507be830f02f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_062b5afb6d9f492aa62fd5547fc6d5eb", + "placeholder": "​", + "style": "IPY_MODEL_6e53b93ebdf045e9b94eedd1bd489b3d", + "value": " 1.69k/? [00:00<00:00, 184kB/s]" + } + }, + "dfbb2f74208243238c1dc88dcc4d45e7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "555c3a2ab47c4cb4b872fd067c15c600": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e60657aaf58d4373a3e777352ab720c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7c9085eed1be41b8b6d61f5eef968825": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "0357ffa5f3224994a2917f7f09affff3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "062b5afb6d9f492aa62fd5547fc6d5eb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6e53b93ebdf045e9b94eedd1bd489b3d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d2a7e731aa05474299243a698d8f8e76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9c8ecc577ca6479aad38d1af6c783685", + "IPY_MODEL_5cd3447374284aa6a9d62e5a72f5ff3c", + "IPY_MODEL_b49a335de14944a5afb36a8ec263c6c8" + ], + "layout": "IPY_MODEL_94e9455af5d94b089a5ceb122446b782" + } + }, + "9c8ecc577ca6479aad38d1af6c783685": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3aae33b4c0ef45e597513265bc4b0681", + "placeholder": "​", + "style": "IPY_MODEL_2efb2666390a482b913a30109a7e2472", + "value": "chat_template.jinja: " + } + }, + "5cd3447374284aa6a9d62e5a72f5ff3c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0ce0b6f052db48c28f7788e95df7c1f3", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_01917cd89aef4db0aa18675636f4e981", + "value": 1 + } + }, + "b49a335de14944a5afb36a8ec263c6c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_58ee20c84f774dceaa69985bd3c63afa", + "placeholder": "​", + "style": "IPY_MODEL_9d8eb917864e4be1b788f9cfcd64e182", + "value": " 12.0k/? [00:00<00:00, 1.44MB/s]" + } + }, + "94e9455af5d94b089a5ceb122446b782": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3aae33b4c0ef45e597513265bc4b0681": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2efb2666390a482b913a30109a7e2472": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0ce0b6f052db48c28f7788e95df7c1f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "01917cd89aef4db0aa18675636f4e981": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "58ee20c84f774dceaa69985bd3c63afa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9d8eb917864e4be1b788f9cfcd64e182": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a955958aff0444a4839aafca8566065c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_867f014d40bd409fa6c845436b050fd3", + "IPY_MODEL_dd08aebf4c9b44b692534426ea948cdb", + "IPY_MODEL_6e0c925129ea45b6bce91769e084e9f3" + ], + "layout": "IPY_MODEL_e3a3e391d3114a94985fd3db6cc5ee1a" + } + }, + "867f014d40bd409fa6c845436b050fd3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c224a759bea64ffbbf3b645a59cd79c5", + "placeholder": "​", + "style": "IPY_MODEL_e696b055c6934f1186078767877ff2a2", + "value": "tokenizer_config.json: " + } + }, + "dd08aebf4c9b44b692534426ea948cdb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_319292819e264a19a27685601c70f9b6", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bb1795785a6a44ec9b17b31b1075cbb3", + "value": 1 + } + }, + "6e0c925129ea45b6bce91769e084e9f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5536ee38467e4557bbb1209cb7b4e424", + "placeholder": "​", + "style": "IPY_MODEL_b9c49626bcbb4e8bb6d4a01a08fab4dd", + "value": " 15.0k/? [00:00<00:00, 1.62MB/s]" + } + }, + "e3a3e391d3114a94985fd3db6cc5ee1a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c224a759bea64ffbbf3b645a59cd79c5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e696b055c6934f1186078767877ff2a2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "319292819e264a19a27685601c70f9b6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "bb1795785a6a44ec9b17b31b1075cbb3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5536ee38467e4557bbb1209cb7b4e424": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b9c49626bcbb4e8bb6d4a01a08fab4dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4cfc78a661dd4837b26a78d7dba376b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ee345697fcfc4468a50627bcff074655", + "IPY_MODEL_3ed7a054b0104bd09132227f1ed413ba", + "IPY_MODEL_59667e10734c42218476077f7741da15" + ], + "layout": "IPY_MODEL_e1d2d9a63d3f43dca2a8e097470d2c76" + } + }, + "ee345697fcfc4468a50627bcff074655": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a743692b1eae456cad70ecf0d3752493", + "placeholder": "​", + "style": "IPY_MODEL_d6ad093be12e4a3e9b7c75160aeb2fb9", + "value": "tokenizer.json: 100%" + } + }, + "3ed7a054b0104bd09132227f1ed413ba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_746d3b1ccba940e69fc9bf50eb1986c8", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_580577e9f9a5425f9ca10479f42b3d16", + "value": 32169626 + } + }, + "59667e10734c42218476077f7741da15": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_27b4eafed4584bcda6f88f1fb82f9212", + "placeholder": "​", + "style": "IPY_MODEL_d6caa192c711497b856f18df2f5d9a62", + "value": " 32.2M/32.2M [00:00<00:00, 87.6MB/s]" + } + }, + "e1d2d9a63d3f43dca2a8e097470d2c76": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a743692b1eae456cad70ecf0d3752493": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d6ad093be12e4a3e9b7c75160aeb2fb9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "746d3b1ccba940e69fc9bf50eb1986c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "580577e9f9a5425f9ca10479f42b3d16": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "27b4eafed4584bcda6f88f1fb82f9212": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d6caa192c711497b856f18df2f5d9a62": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "19f9e04dafa744d0bbafe658a8cd4479": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_f261579b58c94894a6c186255415e54b", + "IPY_MODEL_d36d30757ab34602ab6411c282171802", + "IPY_MODEL_0ac1ef374ce34494a9ade7b68c1fcb7a" + ], + "layout": "IPY_MODEL_588e76027ce9499e8e7683f00c8bd999" + } + }, + "f261579b58c94894a6c186255415e54b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_23bb3393ad0342aaa993c5109af01cbb", + "placeholder": "​", + "style": "IPY_MODEL_1b9c16155dec43db992c6140ea535912", + "value": "README.md: 100%" + } + }, + "d36d30757ab34602ab6411c282171802": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_5b938c6422c64286aed0276899c260b3", + "max": 519, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_74fce0116e3b4cf4abde0af7563ebccb", + "value": 519 + } + }, + "0ac1ef374ce34494a9ade7b68c1fcb7a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a67007d24e9b4a11a35f955db150d486", + "placeholder": "​", + "style": "IPY_MODEL_f91df33daa9348e7abede2d855dc0ecb", + "value": " 519/519 [00:00<00:00, 60.7kB/s]" + } + }, + "588e76027ce9499e8e7683f00c8bd999": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "23bb3393ad0342aaa993c5109af01cbb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1b9c16155dec43db992c6140ea535912": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5b938c6422c64286aed0276899c260b3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "74fce0116e3b4cf4abde0af7563ebccb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a67007d24e9b4a11a35f955db150d486": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f91df33daa9348e7abede2d855dc0ecb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "717b21eed2084ebe9ddcf9a0da8c1c7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1e690555c06540359b89b87c6ae62a9c", + "IPY_MODEL_bddd2d47d2bd40fb9d68be94ebacc0d7", + "IPY_MODEL_b875ef0b812d44cd8e1fd102b597149b" + ], + "layout": "IPY_MODEL_91c2f197fcf94b02bbbb780cced6c0de" + } + }, + "1e690555c06540359b89b87c6ae62a9c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8cd8dc2aafd04685b8cb3fb746f08005", + "placeholder": "​", + "style": "IPY_MODEL_f30f8e430cad427d9086bc99f6f146be", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "bddd2d47d2bd40fb9d68be94ebacc0d7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c048a0b91a5a4bf7803fb3d5ba994acd", + "max": 343805431, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6de4762ccf1a42e6b51f18880b37cd50", + "value": 343805431 + } + }, + "b875ef0b812d44cd8e1fd102b597149b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4d0707913c734e899854b548bc3364a7", + "placeholder": "​", + "style": "IPY_MODEL_bd20452eab634993b4a716a1cdd9a4ea", + "value": " 344M/344M [00:02<00:00, 397MB/s]" + } + }, + "91c2f197fcf94b02bbbb780cced6c0de": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8cd8dc2aafd04685b8cb3fb746f08005": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f30f8e430cad427d9086bc99f6f146be": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c048a0b91a5a4bf7803fb3d5ba994acd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6de4762ccf1a42e6b51f18880b37cd50": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4d0707913c734e899854b548bc3364a7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bd20452eab634993b4a716a1cdd9a4ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ae951bf9259b4054a23534387dc83f8d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_647e5bcc9d3a4cf4a1e9889cd805c45e", + "IPY_MODEL_a71f8702013a453c894debaa8640a215", + "IPY_MODEL_04ff990ba34c43d99e872fec5f39f0a7" + ], + "layout": "IPY_MODEL_1f722501e2894a22b83ed42f482cdec7" + } + }, + "647e5bcc9d3a4cf4a1e9889cd805c45e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f28bf1e32d7542479fe827a3723089c9", + "placeholder": "​", + "style": "IPY_MODEL_4c298b0109bb4734a876c69ef32e5f6b", + "value": "data/test-00000-of-00001.parquet: 100%" + } + }, + "a71f8702013a453c894debaa8640a215": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_51da57c93dd549b6981874d40f26049e", + "max": 38205016, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_282c398a45784093a51432726ec260c5", + "value": 38205016 + } + }, + "04ff990ba34c43d99e872fec5f39f0a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b4d4af7fd215445282451eadc69f9bd5", + "placeholder": "​", + "style": "IPY_MODEL_b9825625d8f54c188698e0a8d5a03e0b", + "value": " 38.2M/38.2M [00:00<00:00, 190MB/s]" + } + }, + "1f722501e2894a22b83ed42f482cdec7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f28bf1e32d7542479fe827a3723089c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4c298b0109bb4734a876c69ef32e5f6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "51da57c93dd549b6981874d40f26049e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "282c398a45784093a51432726ec260c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b4d4af7fd215445282451eadc69f9bd5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b9825625d8f54c188698e0a8d5a03e0b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a469f167acc94d0a93fb8bf94fe5c13a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_4153276526fc459ea16f69f29f82d8dd", + "IPY_MODEL_2006a3d483f24f96b38021cb9a7e3af8", + "IPY_MODEL_77b8d2488e044518add72302d4875797" + ], + "layout": "IPY_MODEL_ebb50b363f5d4fd49c35937434858d4d" + } + }, + "4153276526fc459ea16f69f29f82d8dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_22d14ea43aa6418786ff501f5e1e0cc1", + "placeholder": "​", + "style": "IPY_MODEL_1ca26cff3ae149d88a53bb1e165a299a", + "value": "Generating train split: 100%" + } + }, + "2006a3d483f24f96b38021cb9a7e3af8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_28eec1a723c9433baff472e352125935", + "max": 68686, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_15583a029d5e4a78a60f68c865d064b1", + "value": 68686 + } + }, + "77b8d2488e044518add72302d4875797": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_784a50c5430743d98d944aaed6c23479", + "placeholder": "​", + "style": "IPY_MODEL_81f8fcd62a8d4077830a3be2ed444cfb", + "value": " 68686/68686 [00:00<00:00, 123273.91 examples/s]" + } + }, + "ebb50b363f5d4fd49c35937434858d4d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "22d14ea43aa6418786ff501f5e1e0cc1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1ca26cff3ae149d88a53bb1e165a299a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "28eec1a723c9433baff472e352125935": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "15583a029d5e4a78a60f68c865d064b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "784a50c5430743d98d944aaed6c23479": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "81f8fcd62a8d4077830a3be2ed444cfb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e4a0c21c1bc341e589cce85b98ce2737": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a14ce85211314a9ba56598ef14968b7c", + "IPY_MODEL_116190e5f17946b88241a2b318522765", + "IPY_MODEL_299a8904e4834fe38d81c804e0669a22" + ], + "layout": "IPY_MODEL_0a161c324ea94abf955d4824199d79bf" + } + }, + "a14ce85211314a9ba56598ef14968b7c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_40b91e46da234c6bbef9adb542336f43", + "placeholder": "​", + "style": "IPY_MODEL_3a3ec79b99c8435ea208b9292b0d3bbb", + "value": "Generating test split: 100%" + } + }, + "116190e5f17946b88241a2b318522765": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_9a55c6d9f4284fae92e4c4fd079c7905", + "max": 7632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9ef11b00c45d436794e9acad12715ec9", + "value": 7632 + } + }, + "299a8904e4834fe38d81c804e0669a22": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6d20f7eb80cf4d54a1c34e3d185ee227", + "placeholder": "​", + "style": "IPY_MODEL_aa2ede79b4464737a0d504e403af5791", + "value": " 7632/7632 [00:00<00:00, 135563.13 examples/s]" + } + }, + "0a161c324ea94abf955d4824199d79bf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "40b91e46da234c6bbef9adb542336f43": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3a3ec79b99c8435ea208b9292b0d3bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9a55c6d9f4284fae92e4c4fd079c7905": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9ef11b00c45d436794e9acad12715ec9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6d20f7eb80cf4d54a1c34e3d185ee227": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "aa2ede79b4464737a0d504e403af5791": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Audio.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Audio.ipynb new file mode 100644 index 0000000..c59e8d4 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Audio.ipynb @@ -0,0 +1,5745 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "4RQuEItXqjUN" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "STd3-4v9qjUO" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5r82a21yqjUP" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2pK4zPKsqjUP" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "csoGx5FzqjUQ" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "hhrWHOOFqjUQ" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 397, + "referenced_widgets": [ + "81fe811cdf2e40c7a020c6e1f097cd02", + "f6590b74c331415d8f0fcee104f97e58", + "31398a58983d41ed8d94842c07415e8c", + "f9e4ff751fc041e4b5be42b72e17b882", + "caea4099c7034f208fd13c63553ee560", + "83192d6972f94f9b9a15a739071788b4", + "4d6001fc4d6d4697a930679d653d27fb", + "3b9e9316b3ac4966ace4c5e1c4d67fef", + "f30c08ae79e44226b06b309a7ec669bf", + "c64809e43c084f7eb3e65a3ba91ee80f", + "fda067b1baf544eca44913a43c3f001b", + "45f04faa71274efa8317e471ab73df6a", + "13b6799823d64421a2ba3ef6c4961b39", + "7f5e953704d44cf7ba384302d214eb55", + "8976a2562ce148c38981cd0325eceeae", + "63024153abcd4f0e81cdff2c184ed280", + "db2f1572dd82426e9ba78ac3f4e28093", + "f2059b9eb34142fab10d1dae70057451", + "591782010deb4fa98f362ba97d42b9c3", + "72aa31f055ae42b08e2b6d6a8ac9ad70", + "f6d3ae159edc4736858f12c8783015ee", + "64aca0cc3a1e467090334c92643dfe7e", + "04d4131c40f14de2b114abeaea1d3826", + "68cc0f42113a4f27818d9cae45a94f12", + "2f65fe0251104228bdf8d75f2efd0654", + "669fcdcecc064750844f95e36a004ff8", + "01410e3b39df424aa026edb00683ce33", + "273b695a8b3d4634a22062ee99424813", + "a3c62f1549f84c30b1d0f84bedd9e5a4", + "b246f71f9b6648d09ef6928a7f0bbdd7", + "58cbb0c1da41492d9b46e5e83bfca52b", + "647449f158594e1a9b832e738bcae2af", + "e24bfd8d4e3348eba9569636f65a6b65", + "693e732ffcc44d8dbc47486387654633", + "b88e8cd127e943d0a684db44deed876f", + "a5b8bbbb241d48d78e1a3c46fef8bcc7", + "848c2eb0e73c4d1cbcb85f8446039006", + "a0eca54ca2d34b899bcef8ccfc6cb83c", + "b4a66cfed2e948aba00fd34091174cda", + "868be719d25c493188ee325aa0ea9f54", + "2c52a24ff42c4e52b053e72d6f07ea36", + "8de6249b9d684a22b8b60de8851bfae6", + "2f8c19159cc44fdbb5c9b7be4995e201", + "c622d436711b4e3d8f1939bbd8f85d00", + "378f1be25c5b45eeb18a64fbfe0fb40c", + "de257ad63c5a4504832a924cc44fc485", + "b7ddcd119e1c42e8b880f021482f1b15", + "bfbcf756decf48e9989f5782adfefd9e", + "f839e2ad69694edabfa0b7a0f3b51041", + "87352f69737a40a58b026f1b283af684", + "9599429dce8a464ebe38e518669ee265", + "5ca635ba959a47b6860e5d94fb25cc8f", + "c39b230ccb804319888e8b57ed0b6634", + "2d7db58670d4478abab9e945eb503cf6", + "8c03e642a64b44499135db3eb2cccf8e", + "f4e6db57edf643719111255a7adf3407", + "904fac86bfbb4071b956a3dd03d95df3", + "bb9c7a2b598947de99356500943eb2e0", + "44727df2f31c4367a47f20308f9129d8", + "cc847310b49a496f953be34f1ba0a6ba", + "4f664b28437248548e0cd5e19a5f3fbe", + "e5fcaad65cc3426a939e53d288368eac", + "022e4158503b437b81d3004414ff32d2", + "315a245ef752448b801a33c5c01f74bc", + "2fdfd142d38b42b0852adc8c6992b63d", + "d332c968458f4e859f505b38c9c722fe", + "f80dd089c148441ca453d00ce380f91f", + "f6797c8912d841dca0a8adb6b273069e", + "b698bc4e75a446d3a27a9a206cb5d232", + "9cafc24fe0704dd6870d1c9d196bbbe8", + "2763f369d1344c5486b8c78e79073369", + "20d34e4cb7e34e7f84034253770a7930", + "7d86d845c7dd4f9b8a1d336d2360f4b7", + "2f23ce19221d4e37a8b1ce6e70feed67", + "f30d5c5c5e344a569e3a04486295d501", + "3f0de1b87f344d3a9d7e91d28b7366f0", + "bd004ca4b1114f7ba045cfeca32cf351" + ] + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:16:21.155888Z", + "iopub.status.busy": "2025-07-20T12:16:21.155077Z", + "iopub.status.idle": "2025-07-20T12:17:36.514669Z", + "shell.execute_reply": "2025-07-20T12:17:36.513831Z", + "shell.execute_reply.started": "2025-07-20T12:16:21.155861Z" + }, + "id": "-Xbb0cuLzwgf", + "outputId": "15906da4-6b34-4cae-bbb2-c5a43a732d40", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Unsloth: QLoRA and full finetuning all not selected. Switching to 16bit LoRA.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00Let's Evaluate Gemma 4 Baseline Performance on German Transcription" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:46:26.982493Z", + "iopub.status.busy": "2025-07-20T12:46:26.982188Z", + "iopub.status.idle": "2025-07-20T12:46:28.166576Z", + "shell.execute_reply": "2025-07-20T12:46:28.165889Z", + "shell.execute_reply.started": "2025-07-20T12:46:26.982472Z" + }, + "id": "GHBGeJhYcorh", + "trusted": true, + "outputId": "a5640863-e23c-403b-c8fc-7e151376cef5", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145, + "referenced_widgets": [ + "377d9407a51a4afbb5e2ac3082ec7286", + "201602a3b2ab4cef81f050f8aa5bdee7", + "1667672dbc2649db83027b1b29e68a7f", + "825cb6dfd0744bd390edd6f0e7026ece", + "010105d818c94d9194d670e16e3df612", + "983e57d6d3c344f48d54c4c134dd6247", + "c91c8bffca8b4929946d93e0df229a83", + "65ffffa2ccd443deb7c5c5bdc448a852", + "66b30527c4594eda928fae52411673b8", + "998ab65506514bb2928732c805853ea8", + "945a62bbaf7e45a09e2b705c345cc615", + "5286fa400cf14de49f465f7a7a9d4b4f", + "d9cde02d9c94465aa5e48510be47dad7", + "3d2dff947c7d4a65b6a538929aa038a2", + "6a0cb366fcf044d696006c20872eb225", + "5a4ce86e944d4fac9e4834c8e78520e0", + "39dc7790b1f449b9afcab6f70adf06d4", + "71a3a19710ea445eb5af3ee5a3c72e7e", + "00e96565af7c42838df39ed1fe6e130d", + "f4f69ac8b98041d182ba596aff68e104", + "3220f7b1d6c846c5876ba68bb62770b1", + "02279527eb8940b3939da867aa5f4415", + "689827e4e746485898285218bb324ae7", + "d8430623a8b94ea5ad270db056ce70e8", + "7e0a033b1c18437a9610f23f70d5185a", + "a84862f54c724637be4ced2683fcc422", + "4e30bc04c974417689ae67031d69d14a", + "2817c7c341e442c3a4b2ad2daf075efe", + "3447c8ec5ee847c2bee5d297b2783dd7", + "1c8e63219be941c8b55c10245b79c3cb", + "8aa2a11e654148699c6403fbc83dfbbd", + "a314b22b91354a25a14101dccacc7aea", + "a57cd4d7142841249ec3d46a603e27f1", + "227ff7810c1e442e8ea8bd2eb7897bca", + "7651bdb7b49440189e09e316b2f96279", + "c54c874fdf7e4a11bee22f8f1aff1da2", + "4b56c3a68ba34df08c7b64e88fdbc7ef", + "8111e2f9278947459aae516bc0db01ef", + "3634546c0261453dba5223f64922f55e", + "0e0dae87b5d14e0483a43308f8d3fd87", + "dcccf14fcfd44f57a5e989bc14bc32af", + "21e9929cd39b4216b0b4682af9d72ed2", + "55fb4a3a90e9475bab2d7acee9f84a15", + "99c3fcf6bc24410fb68c3c09867b99db" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/540 [00:00" + ], + "text/html": [ + "\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "from IPython.display import Audio, display\n", + "print(test_audio['text'])\n", + "Audio(test_audio['audio']['array'],rate = test_audio['audio']['sampling_rate'])" + ] + }, + { + "cell_type": "markdown", + "source": [ + "And the translation of the audio from German to English is:\n", + "\n", + "> I—I hold myself directly accountable. That much is, of course, clear: namely, that there are political interests involved in trade—in the exchange of goods—and that political influences are at play. The question is: that should not be the alternative." + ], + "metadata": { + "id": "3XGomsRxl5d_" + } + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:18:05.249062Z", + "iopub.status.busy": "2025-07-20T12:18:05.248355Z", + "iopub.status.idle": "2025-07-20T12:18:37.319606Z", + "shell.execute_reply": "2025-07-20T12:18:37.318802Z", + "shell.execute_reply.started": "2025-07-20T12:18:05.249040Z" + }, + "id": "BJr_D4O9Z2Zh", + "outputId": "ef71193a-3564-4263-ad73-bf738ae7e9c9", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sie sich direkt mich an und ist mir völlig klar, was politische Interessen gibt im Handel im Austausch mit Waren, dass es politische Einflüsse gibt. Die globale ist die Alternative soll es nicht sein.\n", + "\n" + ] + } + ], + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": test_audio['audio']['array']},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " }\n", + "]\n", + "\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Yc0nI6Gzcori" + }, + "source": [ + "

Baseline Model Performance: 32.43% Word Error Rate (WER) for this sample !

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text and audio parts" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:46:48.481871Z", + "iopub.status.busy": "2025-07-20T12:46:48.481594Z", + "iopub.status.idle": "2025-07-20T12:46:55.013627Z", + "shell.execute_reply": "2025-07-20T12:46:55.012955Z", + "shell.execute_reply.started": "2025-07-20T12:46:48.481854Z" + }, + "id": "6bZsfBuZDeCL", + "trusted": true + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # False if not finetuning vision layers\n", + " finetune_language_layers = True, # False if not finetuning language layers\n", + " finetune_attention_modules = True, # False if not finetuning attention layers\n", + " finetune_mlp_modules = True, # False if not finetuning MLP layers\n", + "\n", + " r = 8, # The larger, the higher the accuracy, but might overfit\n", + " lora_alpha = 16, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + " use_rslora = False, # We support rank stabilized LoRA\n", + " loftq_config = None, # And LoftQ\n", + " target_modules = [\n", + " \"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", + " \"gate_proj\", \"up_proj\", \"down_proj\",\n", + "\n", + " # Audio layers\n", + " \"post\", \"linear_start\", \"linear_end\",\n", + " \"embedding_projection\",\n", + " \"ffw_layer_1\", \"ffw_layer_2\",\n", + " \"output_proj\",\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We adapt the `kadirnar/Emilia-DE-B000000` dataset for our German ASR task using Gemma 4 multi-modal chat format. Each audio-text pair is structured into a conversation with `system`, `user`, and `assistant` roles. The processor then converts this into the final training format:\n", + "\n", + "```\n", + "<|turn>system\n", + "You are an assistant that transcribes speech accurately.\n", + "<|turn>user\n", + "<|audio|>Please transcribe this audio.\n", + "<|turn>model\n", + "Ich, ich rechne direkt mich an." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:47:03.723745Z", + "iopub.status.busy": "2025-07-20T12:47:03.723405Z", + "iopub.status.idle": "2025-07-20T12:47:03.729197Z", + "shell.execute_reply": "2025-07-20T12:47:03.728434Z", + "shell.execute_reply.started": "2025-07-20T12:47:03.723714Z" + }, + "id": "o8caH7vlcorj", + "trusted": true + }, + "outputs": [], + "source": [ + "def format_intersection_data(samples: dict) -> dict[str, list]:\n", + " \"\"\"Format intersection dataset to match expected message format\"\"\"\n", + " formatted_samples = {\"messages\": []}\n", + " for idx in range(len(samples[\"audio\"])):\n", + " audio = samples[\"audio\"][idx][\"array\"]\n", + " label = str(samples[\"text\"][idx])\n", + "\n", + " message = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": audio},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\":[{\"type\": \"text\", \"text\": label}]\n", + " }\n", + " ]\n", + " formatted_samples[\"messages\"].append(message)\n", + " return formatted_samples" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:47:08.489955Z", + "iopub.status.busy": "2025-07-20T12:47:08.489357Z", + "iopub.status.idle": "2025-07-20T12:47:09.221727Z", + "shell.execute_reply": "2025-07-20T12:47:09.221018Z", + "shell.execute_reply.started": "2025-07-20T12:47:08.489932Z" + }, + "id": "k7CQ3jvDcorj", + "trusted": true, + "outputId": "aeb84230-1e13-4ea1-8c68-8ff8052a8ed5", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "d43bc9476e28487fb14ce0c595ec0413", + "84995d7865524e02989f85122ed00a4e", + "bcd254a4b3204c73ad5b7ccf1dcef3fd", + "b536e273e6914ef38cb9a76748da6c9e", + "e65976960e6c4f7bb3c3eafc429e3414", + "e27d4f411212460e82ea052d16891606", + "e20ed67e0b284c05aba64768e11e519d", + "b93e8d0586814af5812faa092da9d86b", + "a335bf7b2c4e44528dce6bfdc72c3a97", + "9596d3bec56a4d3eb7c7d85347f45db4", + "ebbbb62c1f9c44da8ac5587bec9bb243" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map (num_proc=4): 0%| | 0/3000 [00:00\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:48:17.004874Z", + "iopub.status.busy": "2025-07-20T12:48:17.004079Z", + "iopub.status.idle": "2025-07-20T12:48:17.279559Z", + "shell.execute_reply": "2025-07-20T12:48:17.278695Z", + "shell.execute_reply.started": "2025-07-20T12:48:17.004848Z" + }, + "id": "95_Nn-89DhsL", + "trusted": true, + "outputId": "f495ba58-6aed-4fc2-bb7a-6b41db9e5f5c", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "# Use UnslothVisionDataCollator which handles audio token alignment correctly\n", + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 8,\n", + " gradient_accumulation_steps = 1,\n", + " warmup_ratio = 0.03,\n", + " # num_train_epochs = 1, # Use for full training runs\n", + " max_steps = 60,\n", + " learning_rate = 5e-5,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\",\n", + " remove_unused_columns = False,\n", + "\n", + " # The below are a must for audio finetuning:\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 8192,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "trusted": true, + "outputId": "94dda14b-e31e-4767-a50b-77e10d404fdd", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "9.664 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:48:20.209164Z", + "iopub.status.busy": "2025-07-20T12:48:20.208832Z", + "iopub.status.idle": "2025-07-20T13:42:42.607026Z", + "shell.execute_reply": "2025-07-20T13:42:42.606099Z", + "shell.execute_reply.started": "2025-07-20T12:48:20.209142Z" + }, + "id": "yqxqAZ7KJ4oL", + "outputId": "1d493c13-629c-4dd5-804a-ab76d7ba4786", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 3,000 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 8 | Gradient accumulation steps = 1\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (8 x 1 x 1) = 8\n", + " \"-____-\" Trainable parameters = 18,237,440 of 5,141,415,456 (0.35% trained)\n", + "Caching is incompatible with gradient checkpointing in Gemma4TextDecoderLayer. Setting `past_key_values=None`.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 01:52, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
116.656757
216.980976
316.712601
416.727814
516.962500
616.116722
714.512408
813.387623
913.035607
1011.445036
1111.030166
1210.789420
1310.289940
148.890602
158.548616
168.881482
178.596722
187.866756
197.271352
206.942740
216.609519
226.196516
236.201073
245.180562
255.545625
265.184031
274.980759
284.628974
294.494946
304.073771
313.741437
324.186295
334.365701
343.872540
354.338237
363.886693
373.677906
383.996698
393.182209
403.487222
413.710633
423.023618
433.892579
443.624817
453.996858
463.806535
473.086546
483.591533
493.202632
503.103097
513.445866
523.171514
533.542655
543.233638
553.718076
563.130233
573.508533
583.527344
593.706471
603.161814

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "trusted": true, + "outputId": "c2a372bc-2110-438d-abb5-217aacacd66a", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "149.1358 seconds used for training.\n", + "2.49 minutes used for training.\n", + "Peak reserved memory = 11.242 GB.\n", + "Peak reserved memory for training = 1.578 GB.\n", + "Peak reserved memory % of max memory = 77.196 %.\n", + "Peak reserved memory for training % of max memory = 10.836 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-07-20T13:57:34.004664Z", + "iopub.status.busy": "2025-07-20T13:57:34.004306Z", + "iopub.status.idle": "2025-07-20T13:57:59.332316Z", + "shell.execute_reply": "2025-07-20T13:57:59.331671Z", + "shell.execute_reply.started": "2025-07-20T13:57:34.004639Z" + }, + "id": "kR3gIAX-SM2q", + "outputId": "3cdee613-1d20-4c15-fe02-d3b0b5a95b2f", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sie sich direkt mich an und ist mir völlig klar, was politische Interessen gibt im Handel im Austausch mit Waren, dass es politische Einflüsse gibt. Die globale ist die Alternative soll es nicht sein.\n", + "\n" + ] + } + ], + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": test_audio['audio']['array']},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " }\n", + "]\n", + "\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "upcOlWe7A1vc", + "trusted": true, + "outputId": "181b8fb3-c43a-46f5-cd1e-d05ad6b3c7ab", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "MKX_XKs_BNZR", + "trusted": true, + "outputId": "9dbc6e55-b0ab-42a3-992c-985b3bd336e6", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "I am Gemma 4, a Large Language Model developed by Google DeepMind. I am an open weights model.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, processor = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(processor, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "iHjt_SMYsd3P", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4\", processor)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "ZV-CiKPrIFG0", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", processor,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "FqfebeAdT073", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " processor,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "ZgcJIhJ0I_es", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " processor,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kaggle": { + "accelerator": "nvidiaTeslaT4", + "dataSources": [], + "dockerImageVersionId": 31040, + "isGpuEnabled": true, + "isInternetEnabled": true, + "language": "python", + "sourceType": "notebook" + }, + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "81fe811cdf2e40c7a020c6e1f097cd02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_f6590b74c331415d8f0fcee104f97e58", + "IPY_MODEL_31398a58983d41ed8d94842c07415e8c", + "IPY_MODEL_f9e4ff751fc041e4b5be42b72e17b882" + ], + "layout": "IPY_MODEL_caea4099c7034f208fd13c63553ee560" + } + }, + "f6590b74c331415d8f0fcee104f97e58": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_83192d6972f94f9b9a15a739071788b4", + "placeholder": "​", + "style": "IPY_MODEL_4d6001fc4d6d4697a930679d653d27fb", + "value": "model.safetensors: 100%" + } + }, + "31398a58983d41ed8d94842c07415e8c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3b9e9316b3ac4966ace4c5e1c4d67fef", + "max": 10246621918, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f30c08ae79e44226b06b309a7ec669bf", + "value": 10246621918 + } + }, + "f9e4ff751fc041e4b5be42b72e17b882": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c64809e43c084f7eb3e65a3ba91ee80f", + "placeholder": "​", + "style": "IPY_MODEL_fda067b1baf544eca44913a43c3f001b", + "value": " 10.2G/10.2G [01:58<00:00, 71.4MB/s]" + } + }, + "caea4099c7034f208fd13c63553ee560": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "83192d6972f94f9b9a15a739071788b4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4d6001fc4d6d4697a930679d653d27fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3b9e9316b3ac4966ace4c5e1c4d67fef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f30c08ae79e44226b06b309a7ec669bf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c64809e43c084f7eb3e65a3ba91ee80f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fda067b1baf544eca44913a43c3f001b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "45f04faa71274efa8317e471ab73df6a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_13b6799823d64421a2ba3ef6c4961b39", + "IPY_MODEL_7f5e953704d44cf7ba384302d214eb55", + "IPY_MODEL_8976a2562ce148c38981cd0325eceeae" + ], + "layout": "IPY_MODEL_63024153abcd4f0e81cdff2c184ed280" + } + }, + "13b6799823d64421a2ba3ef6c4961b39": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_db2f1572dd82426e9ba78ac3f4e28093", + "placeholder": "​", + "style": "IPY_MODEL_f2059b9eb34142fab10d1dae70057451", + "value": "Loading weights: 100%" + } + }, + "7f5e953704d44cf7ba384302d214eb55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_591782010deb4fa98f362ba97d42b9c3", + "max": 2011, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_72aa31f055ae42b08e2b6d6a8ac9ad70", + "value": 2011 + } + }, + "8976a2562ce148c38981cd0325eceeae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_f6d3ae159edc4736858f12c8783015ee", + "placeholder": "​", + "style": "IPY_MODEL_64aca0cc3a1e467090334c92643dfe7e", + "value": " 2011/2011 [00:43<00:00, 186.35it/s]" + } + }, + "63024153abcd4f0e81cdff2c184ed280": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "db2f1572dd82426e9ba78ac3f4e28093": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f2059b9eb34142fab10d1dae70057451": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "591782010deb4fa98f362ba97d42b9c3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "72aa31f055ae42b08e2b6d6a8ac9ad70": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f6d3ae159edc4736858f12c8783015ee": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "64aca0cc3a1e467090334c92643dfe7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "04d4131c40f14de2b114abeaea1d3826": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_68cc0f42113a4f27818d9cae45a94f12", + "IPY_MODEL_2f65fe0251104228bdf8d75f2efd0654", + "IPY_MODEL_669fcdcecc064750844f95e36a004ff8" + ], + "layout": "IPY_MODEL_01410e3b39df424aa026edb00683ce33" + } + }, + "68cc0f42113a4f27818d9cae45a94f12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_273b695a8b3d4634a22062ee99424813", + "placeholder": "​", + "style": "IPY_MODEL_a3c62f1549f84c30b1d0f84bedd9e5a4", + "value": "generation_config.json: 100%" + } + }, + "2f65fe0251104228bdf8d75f2efd0654": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_b246f71f9b6648d09ef6928a7f0bbdd7", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_58cbb0c1da41492d9b46e5e83bfca52b", + "value": 208 + } + }, + "669fcdcecc064750844f95e36a004ff8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_647449f158594e1a9b832e738bcae2af", + "placeholder": "​", + "style": "IPY_MODEL_e24bfd8d4e3348eba9569636f65a6b65", + "value": " 208/208 [00:00<00:00, 20.6kB/s]" + } + }, + "01410e3b39df424aa026edb00683ce33": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "273b695a8b3d4634a22062ee99424813": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a3c62f1549f84c30b1d0f84bedd9e5a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b246f71f9b6648d09ef6928a7f0bbdd7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "58cbb0c1da41492d9b46e5e83bfca52b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "647449f158594e1a9b832e738bcae2af": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e24bfd8d4e3348eba9569636f65a6b65": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "693e732ffcc44d8dbc47486387654633": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b88e8cd127e943d0a684db44deed876f", + "IPY_MODEL_a5b8bbbb241d48d78e1a3c46fef8bcc7", + "IPY_MODEL_848c2eb0e73c4d1cbcb85f8446039006" + ], + "layout": "IPY_MODEL_a0eca54ca2d34b899bcef8ccfc6cb83c" + } + }, + "b88e8cd127e943d0a684db44deed876f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b4a66cfed2e948aba00fd34091174cda", + "placeholder": "​", + "style": "IPY_MODEL_868be719d25c493188ee325aa0ea9f54", + "value": "processor_config.json: " + } + }, + "a5b8bbbb241d48d78e1a3c46fef8bcc7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2c52a24ff42c4e52b053e72d6f07ea36", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8de6249b9d684a22b8b60de8851bfae6", + "value": 1 + } + }, + "848c2eb0e73c4d1cbcb85f8446039006": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2f8c19159cc44fdbb5c9b7be4995e201", + "placeholder": "​", + "style": "IPY_MODEL_c622d436711b4e3d8f1939bbd8f85d00", + "value": " 1.69k/? [00:00<00:00, 104kB/s]" + } + }, + "a0eca54ca2d34b899bcef8ccfc6cb83c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b4a66cfed2e948aba00fd34091174cda": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "868be719d25c493188ee325aa0ea9f54": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2c52a24ff42c4e52b053e72d6f07ea36": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "8de6249b9d684a22b8b60de8851bfae6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2f8c19159cc44fdbb5c9b7be4995e201": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c622d436711b4e3d8f1939bbd8f85d00": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "378f1be25c5b45eeb18a64fbfe0fb40c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_de257ad63c5a4504832a924cc44fc485", + "IPY_MODEL_b7ddcd119e1c42e8b880f021482f1b15", + "IPY_MODEL_bfbcf756decf48e9989f5782adfefd9e" + ], + "layout": "IPY_MODEL_f839e2ad69694edabfa0b7a0f3b51041" + } + }, + "de257ad63c5a4504832a924cc44fc485": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_87352f69737a40a58b026f1b283af684", + "placeholder": "​", + "style": "IPY_MODEL_9599429dce8a464ebe38e518669ee265", + "value": "chat_template.jinja: " + } + }, + "b7ddcd119e1c42e8b880f021482f1b15": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_5ca635ba959a47b6860e5d94fb25cc8f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c39b230ccb804319888e8b57ed0b6634", + "value": 1 + } + }, + "bfbcf756decf48e9989f5782adfefd9e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2d7db58670d4478abab9e945eb503cf6", + "placeholder": "​", + "style": "IPY_MODEL_8c03e642a64b44499135db3eb2cccf8e", + "value": " 11.9k/? [00:00<00:00, 881kB/s]" + } + }, + "f839e2ad69694edabfa0b7a0f3b51041": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "87352f69737a40a58b026f1b283af684": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9599429dce8a464ebe38e518669ee265": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5ca635ba959a47b6860e5d94fb25cc8f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "c39b230ccb804319888e8b57ed0b6634": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2d7db58670d4478abab9e945eb503cf6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8c03e642a64b44499135db3eb2cccf8e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f4e6db57edf643719111255a7adf3407": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_904fac86bfbb4071b956a3dd03d95df3", + "IPY_MODEL_bb9c7a2b598947de99356500943eb2e0", + "IPY_MODEL_44727df2f31c4367a47f20308f9129d8" + ], + "layout": "IPY_MODEL_cc847310b49a496f953be34f1ba0a6ba" + } + }, + "904fac86bfbb4071b956a3dd03d95df3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4f664b28437248548e0cd5e19a5f3fbe", + "placeholder": "​", + "style": "IPY_MODEL_e5fcaad65cc3426a939e53d288368eac", + "value": "tokenizer_config.json: " + } + }, + "bb9c7a2b598947de99356500943eb2e0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_022e4158503b437b81d3004414ff32d2", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_315a245ef752448b801a33c5c01f74bc", + "value": 1 + } + }, + "44727df2f31c4367a47f20308f9129d8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2fdfd142d38b42b0852adc8c6992b63d", + "placeholder": "​", + "style": "IPY_MODEL_d332c968458f4e859f505b38c9c722fe", + "value": " 14.9k/? [00:00<00:00, 1.27MB/s]" + } + }, + "cc847310b49a496f953be34f1ba0a6ba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4f664b28437248548e0cd5e19a5f3fbe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e5fcaad65cc3426a939e53d288368eac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "022e4158503b437b81d3004414ff32d2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "315a245ef752448b801a33c5c01f74bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2fdfd142d38b42b0852adc8c6992b63d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d332c968458f4e859f505b38c9c722fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f80dd089c148441ca453d00ce380f91f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_f6797c8912d841dca0a8adb6b273069e", + "IPY_MODEL_b698bc4e75a446d3a27a9a206cb5d232", + "IPY_MODEL_9cafc24fe0704dd6870d1c9d196bbbe8" + ], + "layout": "IPY_MODEL_2763f369d1344c5486b8c78e79073369" + } + }, + "f6797c8912d841dca0a8adb6b273069e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_20d34e4cb7e34e7f84034253770a7930", + "placeholder": "​", + "style": "IPY_MODEL_7d86d845c7dd4f9b8a1d336d2360f4b7", + "value": "tokenizer.json: 100%" + } + }, + "b698bc4e75a446d3a27a9a206cb5d232": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2f23ce19221d4e37a8b1ce6e70feed67", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f30d5c5c5e344a569e3a04486295d501", + "value": 32169626 + } + }, + "9cafc24fe0704dd6870d1c9d196bbbe8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3f0de1b87f344d3a9d7e91d28b7366f0", + "placeholder": "​", + "style": "IPY_MODEL_bd004ca4b1114f7ba045cfeca32cf351", + "value": " 32.2M/32.2M [00:00<00:00, 94.4MB/s]" + } + }, + "2763f369d1344c5486b8c78e79073369": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "20d34e4cb7e34e7f84034253770a7930": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7d86d845c7dd4f9b8a1d336d2360f4b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2f23ce19221d4e37a8b1ce6e70feed67": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f30d5c5c5e344a569e3a04486295d501": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3f0de1b87f344d3a9d7e91d28b7366f0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bd004ca4b1114f7ba045cfeca32cf351": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "377d9407a51a4afbb5e2ac3082ec7286": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_201602a3b2ab4cef81f050f8aa5bdee7", + "IPY_MODEL_1667672dbc2649db83027b1b29e68a7f", + "IPY_MODEL_825cb6dfd0744bd390edd6f0e7026ece" + ], + "layout": "IPY_MODEL_010105d818c94d9194d670e16e3df612" + } + }, + "201602a3b2ab4cef81f050f8aa5bdee7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_983e57d6d3c344f48d54c4c134dd6247", + "placeholder": "​", + "style": "IPY_MODEL_c91c8bffca8b4929946d93e0df229a83", + "value": "README.md: 100%" + } + }, + "1667672dbc2649db83027b1b29e68a7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_65ffffa2ccd443deb7c5c5bdc448a852", + "max": 540, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_66b30527c4594eda928fae52411673b8", + "value": 540 + } + }, + "825cb6dfd0744bd390edd6f0e7026ece": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_998ab65506514bb2928732c805853ea8", + "placeholder": "​", + "style": "IPY_MODEL_945a62bbaf7e45a09e2b705c345cc615", + "value": " 540/540 [00:00<00:00, 58.4kB/s]" + } + }, + "010105d818c94d9194d670e16e3df612": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "983e57d6d3c344f48d54c4c134dd6247": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c91c8bffca8b4929946d93e0df229a83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "65ffffa2ccd443deb7c5c5bdc448a852": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "66b30527c4594eda928fae52411673b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "998ab65506514bb2928732c805853ea8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "945a62bbaf7e45a09e2b705c345cc615": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5286fa400cf14de49f465f7a7a9d4b4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d9cde02d9c94465aa5e48510be47dad7", + "IPY_MODEL_3d2dff947c7d4a65b6a538929aa038a2", + "IPY_MODEL_6a0cb366fcf044d696006c20872eb225" + ], + "layout": "IPY_MODEL_5a4ce86e944d4fac9e4834c8e78520e0" + } + }, + "d9cde02d9c94465aa5e48510be47dad7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_39dc7790b1f449b9afcab6f70adf06d4", + "placeholder": "​", + "style": "IPY_MODEL_71a3a19710ea445eb5af3ee5a3c72e7e", + "value": "data/train-00000-of-00002.parquet: 100%" + } + }, + "3d2dff947c7d4a65b6a538929aa038a2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_00e96565af7c42838df39ed1fe6e130d", + "max": 494804366, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f4f69ac8b98041d182ba596aff68e104", + "value": 494804366 + } + }, + "6a0cb366fcf044d696006c20872eb225": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3220f7b1d6c846c5876ba68bb62770b1", + "placeholder": "​", + "style": "IPY_MODEL_02279527eb8940b3939da867aa5f4415", + "value": " 495M/495M [00:04<00:00, 146MB/s]" + } + }, + "5a4ce86e944d4fac9e4834c8e78520e0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "39dc7790b1f449b9afcab6f70adf06d4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "71a3a19710ea445eb5af3ee5a3c72e7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "00e96565af7c42838df39ed1fe6e130d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f4f69ac8b98041d182ba596aff68e104": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3220f7b1d6c846c5876ba68bb62770b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "02279527eb8940b3939da867aa5f4415": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "689827e4e746485898285218bb324ae7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d8430623a8b94ea5ad270db056ce70e8", + "IPY_MODEL_7e0a033b1c18437a9610f23f70d5185a", + "IPY_MODEL_a84862f54c724637be4ced2683fcc422" + ], + "layout": "IPY_MODEL_4e30bc04c974417689ae67031d69d14a" + } + }, + "d8430623a8b94ea5ad270db056ce70e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2817c7c341e442c3a4b2ad2daf075efe", + "placeholder": "​", + "style": "IPY_MODEL_3447c8ec5ee847c2bee5d297b2783dd7", + "value": "data/train-00001-of-00002.parquet: 100%" + } + }, + "7e0a033b1c18437a9610f23f70d5185a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1c8e63219be941c8b55c10245b79c3cb", + "max": 502613920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8aa2a11e654148699c6403fbc83dfbbd", + "value": 502613920 + } + }, + "a84862f54c724637be4ced2683fcc422": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a314b22b91354a25a14101dccacc7aea", + "placeholder": "​", + "style": "IPY_MODEL_a57cd4d7142841249ec3d46a603e27f1", + "value": " 503M/503M [00:12<00:00, 28.0MB/s]" + } + }, + "4e30bc04c974417689ae67031d69d14a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2817c7c341e442c3a4b2ad2daf075efe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3447c8ec5ee847c2bee5d297b2783dd7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1c8e63219be941c8b55c10245b79c3cb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8aa2a11e654148699c6403fbc83dfbbd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a314b22b91354a25a14101dccacc7aea": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a57cd4d7142841249ec3d46a603e27f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "227ff7810c1e442e8ea8bd2eb7897bca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7651bdb7b49440189e09e316b2f96279", + "IPY_MODEL_c54c874fdf7e4a11bee22f8f1aff1da2", + "IPY_MODEL_4b56c3a68ba34df08c7b64e88fdbc7ef" + ], + "layout": "IPY_MODEL_8111e2f9278947459aae516bc0db01ef" + } + }, + "7651bdb7b49440189e09e316b2f96279": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3634546c0261453dba5223f64922f55e", + "placeholder": "​", + "style": "IPY_MODEL_0e0dae87b5d14e0483a43308f8d3fd87", + "value": "Generating train split: 100%" + } + }, + "c54c874fdf7e4a11bee22f8f1aff1da2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_dcccf14fcfd44f57a5e989bc14bc32af", + "max": 12038, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_21e9929cd39b4216b0b4682af9d72ed2", + "value": 12038 + } + }, + "4b56c3a68ba34df08c7b64e88fdbc7ef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_55fb4a3a90e9475bab2d7acee9f84a15", + "placeholder": "​", + "style": "IPY_MODEL_99c3fcf6bc24410fb68c3c09867b99db", + "value": " 12038/12038 [00:24<00:00, 470.80 examples/s]" + } + }, + "8111e2f9278947459aae516bc0db01ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3634546c0261453dba5223f64922f55e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0e0dae87b5d14e0483a43308f8d3fd87": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "dcccf14fcfd44f57a5e989bc14bc32af": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "21e9929cd39b4216b0b4682af9d72ed2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "55fb4a3a90e9475bab2d7acee9f84a15": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "99c3fcf6bc24410fb68c3c09867b99db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d43bc9476e28487fb14ce0c595ec0413": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_84995d7865524e02989f85122ed00a4e", + "IPY_MODEL_bcd254a4b3204c73ad5b7ccf1dcef3fd", + "IPY_MODEL_b536e273e6914ef38cb9a76748da6c9e" + ], + "layout": "IPY_MODEL_e65976960e6c4f7bb3c3eafc429e3414" + } + }, + "84995d7865524e02989f85122ed00a4e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e27d4f411212460e82ea052d16891606", + "placeholder": "​", + "style": "IPY_MODEL_e20ed67e0b284c05aba64768e11e519d", + "value": "Map (num_proc=4): 100%" + } + }, + "bcd254a4b3204c73ad5b7ccf1dcef3fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_b93e8d0586814af5812faa092da9d86b", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a335bf7b2c4e44528dce6bfdc72c3a97", + "value": 3000 + } + }, + "b536e273e6914ef38cb9a76748da6c9e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_9596d3bec56a4d3eb7c7d85347f45db4", + "placeholder": "​", + "style": "IPY_MODEL_ebbbb62c1f9c44da8ac5587bec9bb243", + "value": " 3000/3000 [00:54<00:00, 76.02 examples/s]" + } + }, + "e65976960e6c4f7bb3c3eafc429e3414": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e27d4f411212460e82ea052d16891606": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e20ed67e0b284c05aba64768e11e519d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b93e8d0586814af5812faa092da9d86b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a335bf7b2c4e44528dce6bfdc72c3a97": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9596d3bec56a4d3eb7c7d85347f45db4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ebbbb62c1f9c44da8ac5587bec9bb243": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Text.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Text.ipynb new file mode 100644 index 0000000..6f60fc1 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Text.ipynb @@ -0,0 +1,7119 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Lu6trOyZlsLl" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "y1CStbv9lsLl" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-dDBYtlOlsLm" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r8rhPwTKlsLm" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "6FRKDTtwlsLm" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lBN09c1tUlSV" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 397, + "referenced_widgets": [ + "3d2921a997f043c781203236278c6444", + "33f7c35206e7496c8b68189c982f6c96", + "feb2769cdd91429186c2cad2d519e5e8", + "49109d6abdda4b5987afb03c8ca82133", + "c73912ed1a48494895d8d8d5953ba656", + "c9899707f4ed4df9afdf80b91a75b2fc", + "cbc932cc9d654db7afaadced26c8ef7a", + "2be52eb70e904219a3a2256a3d466dc1", + "3a8f32dbbda14e33a997a0a361c5042f", + "2f6b8dafccee4a7386efd09f13d3f30a", + "41eb3536d2b04d6aae65a11b87a09d3c", + "67c4746cc365404d80e4187c371b2503", + "b21842e752724217971c9f16ec028704", + "52985a9a27ca465da304a09d532165a8", + "e33733c0fad5429e9b8f017a62860bc3", + "0181be8f1f67481aa6d90a6d34b3d27b", + "0762c9ebd93843dd8c5a0bc0e44f21e6", + "5698ed0353e74431b3658499cbb6184c", + "0d48488f4d5a427a84527c913213fc17", + "518191a0c4994a398e788e31a1612e46", + "007fc851909b46b08b199ac4540a8391", + "8697d011c5814742b7e5872c26c3a840", + "e4db4b7388a24022b4166fb8398d84f6", + "1a99b2cc5a834557be169221d5e5e922", + "9f3c0e0b175d4d029a27b4425e190fdf", + "fab9219a5f4f4ba094c7e3b79eee978f", + "6b0b45c64c2f42bcad42097be582b582", + "479c805860804745ac0addaebca04c08", + "2af827637bc14b99966ac252e71ca1d3", + "e01ca3fe18bd4f0faef2bf4df4faa892", + "a37f76bac8d34ac982c7d6642c82d0ef", + "bd43efb495044372b169c927f8d0584e", + "58f143afe4ed43efa145bacb1d9bf542", + "a5be5bfba3ec4648aa6ccd34f2eed259", + "1b1b4f5f31a745ee98072cd87c99df89", + "dab210ff7ce2430caf1e2d4302f8565a", + "e2e043fe9da2485e9afd571d06bc27c7", + "fe08286d945446788aa1a44dac8f7263", + "0c82571976a040d3a0f6596cdca32b6e", + "d5d3bf30ac524d00b0cc3982fb66386f", + "84bbfab05a234b12ba5a2d38015c9f1a", + "fea38f649a9e47b4a6185d85a62669a0", + "0ef55274df7042b5ae47880fb72d82cc", + "68b984644256400f9024e9d37998bd2f", + "3a0184a9cfef443385dd49f20f12cfc1", + "6535c0b518144e108ac22d4c523aef32", + "83f222f05c974fa191d0f4fd6186b1b5", + "70f3613a5f1f4661b8b9aff8295bf7bb", + "2c80fe8defd7468da10b89d8de1f96b1", + "af02af0771fe4f6e9d5f8123b6db676d", + "6fe995128adb4c08b07cee2a7de09454", + "653651f81f3349bdbee628cd37aafa91", + "172bc6be7ccb4efe80b6bf255f426e0a", + "dc4c8288184c4a69b1f19cdb5167e581", + "51884ea25fd94727889e54da2fe4b311", + "04f2d1fee6cf4450854a90afcca7352a", + "204b778594564833814db99c06ca4fbb", + "c914b297689a4b69b9d02b01fb0f4d78", + "843a0d013b794eaa8927086df2a38ae7", + "46c5ab9910614cb599b2694bb322658a", + "bb7b78efc82c43f78b8579e0027b5ff4", + "f0e4f49d60694bc5a603b3a37c7b6a0d", + "db61162e59c94b4fa10ff4a4c0c97343", + "0485e800a81f43b1943423f901bd1a4f", + "b55db2c45b4048cda35766d236e4e84c", + "26b5672854ef4849a6d3d6ec7429d87b", + "0e51754fe18440349b35bcc438b1bf02", + "be57bb04bde04a58bb37d91bfbf3b51c", + "05b6d19db7c447a9ae7d380f9d7765d8", + "aeb32719f54e42a4b08a53cd5363a0d5", + "fde969cdd088420e972b911db636ae2d", + "27af09daa2374b7f9ce779aa7192b178", + "d22ddd345a85405c90fbceb0c623522d", + "3f54b22697044f4cb7c4555d1e443eaf", + "3169b2afaf5c4bc8bfd94d87aaca04b0", + "5d6cb7d0eec540e4873f290ad0c51856", + "111000cfd1af4e2db1f2c2557cd7206a" + ] + }, + "id": "-Xbb0cuLzwgf", + "outputId": "9c607d3f-f9ab-4716-d225-f3e351d135a1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Unsloth: QLoRA and full finetuning all not selected. Switching to 16bit LoRA.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9jGeSb9bWe0k", + "outputId": "fea060ef-c599-475e-b3fe-d6bf33d15a7c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The animal in the image is a **sloth**.\n", + "\n", + "Since you haven't provided any specific context (like a movie poster, a scene, or a specific source), I cannot tell you *which* films this specific sloth features in.\n", + "\n", + "**To help me answer your question, please provide more context, such as:**\n", + "\n", + "1. **A picture or a clip from a film.**\n", + "2. **The name of a movie you are thinking of.**\n", + "3. **Any other information you have about where you saw this animal.**\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eh0BzbZPWtRD" + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "R3ExuK8cWuT3", + "outputId": "f35f34d0-67fa-4693-ced3-1b5c3694db29" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "In emerald canopy, where sunlight streams,\n", + "And moss-draped branches weave their silent dreams,\n", + "There hangs a creature, slow and low,\n", + "A sloth, in nature's gentle flow.\n", + "\n", + "With fur the shade of bark and leaf,\n", + "A quiet grace, beyond belief.\n", + "He moves with purpose, soft and deep,\n", + "While the hurried world is fast asleep.\n", + "\n", + "A master of the languid pace,\n", + "A gentle smile upon his face.\n", + "He clings to limbs with steady hold,\n", + "A story in his stillness told.\n", + "\n", + "The world rushes by in streaks of light,\n", + "But he moves through amber\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wZrmFRZpZtGf" + }, + "source": [ + "# Gemma 4 can also hear!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 76 + }, + "id": "68crYajNZtw1", + "outputId": "6983d839-522c-4d43-82f3-1f13adf867ff" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "from IPython.display import Audio, display\n", + "Audio(\"https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "k3vrdoa0Z01X" + }, + "outputs": [], + "source": [ + "!wget -qqq https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3 -O audio.mp3" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BJr_D4O9Z2Zh", + "outputId": "d3bd6949-cd9a-413a-ea31-03f8ae798f1b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The audio is about the belief that a nation should commit itself to achieving the goal of landing a man on the moon and returning him safely to the Earth before this decade is out.\n", + "\n" + ] + } + ], + "source": [ + "audio_file = \"audio.mp3\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio about?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L15JuAmmaOkB" + }, + "source": [ + "# Let's combine all 3 modalities together!" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "is37bsDZaRwV", + "outputId": "ac8a7bb9-aea5-44b0-f6a6-b276dac72236" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The image is of a koala, and the audio is a speech about a nation committing to landing a man on the moon and returning him safely within a decade. The two are unrelated.\n", + "\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio and image about? \"\\\n", + " \"How are they related?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6bZsfBuZDeCL", + "outputId": "0dfe237b-52ce-4215-b38b-de73ff7fb01b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Making `model.base_model.model.model.language_model` require gradients\n" + ] + } + ], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "LjY75GoYUCB8" + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZQkXuGYxbJ-e" + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 113, + "referenced_widgets": [ + "870cc718caea4b09a6ac7d43bcc34b4c", + "0dce530f23a24cddab63d607f3b94965", + "bfa5e47f4ec74dfc83cf4c9f72b7953f", + "c7b4dc08d4ae40af9a2ab2b78a1dad0f", + "c7e64de97ac6421499e2ad9f67bc419a", + "2807725d165b4877929693661171736c", + "d7d6863aea5a4db2bfdda6c708291dcc", + "74d4f2959b4047c89182c1ec63df08e2", + "184954dceb45488483a30405f1cf550c", + "6e9a6f1ec4e142558c91ed9f80398f00", + "4c07e50fbb6c42d7ba20b7f084d52b71", + "80cc55a66a5f4305bcf1eccd67b7693b", + "ddda884ec6c54903b9bd741e5ab0cd8d", + "eac214a702d14084965a8be6e1e0db6d", + "f1f42573c8564030b75d7af02a9f7f7e", + "c9f8619f01b04e5996e62f7842ba499b", + "621afa2e11564f148fe1b41d33b306fe", + "1fbb8fbc099f43ff85df3adb39b7f5c4", + "3db6e53661084022ac038dd2ca442cee", + "90c6842f23544dd4bb04f1e4680cedc5", + "7e853b0ed3b943e4aa31fa0d483d3013", + "23b50cb43c144d5fb129571c793b1059", + "59296292f4e2444589b75c2839758a6d", + "d8bb24a7e9db4b1a9087f6cc54e9d819", + "0911afbaf58c47cabfb0699552aaf1bb", + "48a152c98a374fdbbb661bd90e82c46e", + "e38f05f599024a47bf3dd607a39e05ad", + "ba075479987849dd888b0b1bc9f4add4", + "511d5c2a1d634ab1839d803830cc014e", + "b171c249f897489487353a4169875212", + "b47e4c66ac1a41bda658d59ec27920a9", + "cf60f97b2e7f4061a19b2106308c1595", + "ed59a95a95c743c6bd169a0c5da95f67" + ] + }, + "id": "Mkq4RvEq7FQr", + "outputId": "b60787f8-5ff1-4ac5-c4ca-725f3f5abf73" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "30d566f7f7cd4f26a57fcd9df0310bdc", + "59291b76f1fb44adbdf509d43359bf71", + "6b5887f069914368ae613bb2be3c8d33", + "b246910de0dc431089632dd353ebeb29", + "c1229f0b7b6e49daaa72dc04d6c03df9", + "3a28dde28ae84bfd993354af8402df68", + "b812bec84a814eb79442ec2028d7ad3d", + "fb523ac744564bc4961e51b91a46b0a8", + "9795836b1c24448bacf121ecdcff86f6", + "6bc70efc138f4c0c8d619b32623966bb", + "f78de814eb3a445993231ab3855a3801" + ] + }, + "id": "1ahE8Ys37JDJ", + "outputId": "a8c460ca-41ba-4bb5-a6f7-139ddd663ee5" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 105 + }, + "id": "gGFzmplrEy9I", + "outputId": "eecc6464-06a8-4b9a-8694-05b5c5201abf" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 17 + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "96c5653090984af8843866b1ee7c35b1", + "7f32dee0a2ab4ed8bb99042ff5daf2da", + "d990a3318024413983e1e38369e6dfb1", + "97372097bc6442cd8e2cd518edffc2a1", + "c36c6d5aab3b49ebb00885dc6ef6efba", + "cf45f9592f0140449cec334a3607c4dc", + "96118ea74ed049b1877344e3fa1e1bb5", + "09ab14ae65364f67b19aa6e0f0421e5e", + "fc6de80b1d174253bf1c6419cd32ddae", + "4b347b13474545c4be6eb5992112ca5d", + "39574ff310c54895b267b9bf1dcddb2a" + ] + }, + "id": "95_Nn-89DhsL", + "outputId": "13e4e38f-cc4c-4456-86c0-211cb101542b" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=6): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dv1NBUozV78l" + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 105 + }, + "id": "LtsMVtlkUhja", + "outputId": "61386897-8d1f-4bd1-8c37-54cf5e26409f" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Kyjy__m9KY3" + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 105 + }, + "id": "_rD6fl8EUxnG", + "outputId": "cc23b442-0129-4226-b7b8-56c39ef80d11" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "' In programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2ejIt2xSNKKp", + "outputId": "945b9e2e-c2bd-4ffd-906d-d7d7450437be" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "10.098 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "yqxqAZ7KJ4oL", + "outputId": "c4804f43-ad0d-48be-fcfc-a89558cc74b9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 2,991 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 12,668,928 of 5,135,846,944 (0.25% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 03:11, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
111.235785
212.824577
312.463327
412.219341
512.442764
611.932236
712.602695
812.851998
910.863073
109.147686
119.397802
128.469434
138.135841
146.840250
157.372794
166.193974
176.062288
186.291557
196.233539
205.865170
215.440270
225.247680
235.856437
245.654868
255.209495
265.182337
275.069244
284.234691
294.857911
304.938684
314.718597
324.803062
334.649268
344.894489
354.491835
364.749773
374.720836
384.491292
394.462323
403.844747
414.891779
424.629851
434.111910
443.651132
454.298693
464.591220
474.157773
484.565719
493.915479
503.632185
514.593100
523.698324
534.600374
544.302113
553.800784
564.000387
574.510599
584.181003
593.902064
604.236151

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pCqnaKmlO1U9", + "outputId": "f19a554f-1476-4256-a1ad-211c9a800ede" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "222.9893 seconds used for training.\n", + "3.72 minutes used for training.\n", + "Peak reserved memory = 10.836 GB.\n", + "Peak reserved memory for training = 0.738 GB.\n", + "Peak reserved memory % of max memory = 74.408 %.\n", + "Peak reserved memory for training % of max memory = 5.068 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kR3gIAX-SM2q", + "outputId": "c8379be3-ca9a-4791-920c-9b6cdd46511a" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\nThe next number in the sequence is **13**.\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones:\\n\\n* $1 + 1 = 2$\\n* $1 + 2 = 3$\\n* $2 + 3 = 5']" + ], + "text/html": [ + "

['<bos><|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,<turn|>\\n<|turn>model\\nThe next number in the sequence is **13**.\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones:\\n\\n* $1 + 1 = 2$\\n* $1 + 2 = 3$\\n* $2 + 3 = 5']
" + ] + }, + "metadata": {}, + "execution_count": 25 + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CrSvZObor0lY" + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e2pEuRb1r2Vg", + "outputId": "b7611dba-3cdc-455b-c201-cce7b36b2fb9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The sky appears blue due to a phenomenon called **Rayleigh scattering**. Here's a breakdown of why this happens:\n", + "\n", + "### 1. Sunlight is Made of Different Colors\n", + "\n", + "Sunlight, which appears white to us, is actually composed of a spectrum of different colors (the colors of the rainbow: red, orange\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "upcOlWe7A1vc", + "outputId": "3844523c-69ab-4501-dbe7-80fd84852cdf" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MKX_XKs_BNZR", + "outputId": "db79fc3b-4187-48fc-b26c-8e7725425121" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "I am Gemma-4, a Large Language Model developed by Google DeepMind. I am an open weights model.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "ZV-CiKPrIFG0" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "FqfebeAdT073" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "ZgcJIhJ0I_es" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "3d2921a997f043c781203236278c6444": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_33f7c35206e7496c8b68189c982f6c96", + "IPY_MODEL_feb2769cdd91429186c2cad2d519e5e8", + "IPY_MODEL_49109d6abdda4b5987afb03c8ca82133" + ], + "layout": "IPY_MODEL_c73912ed1a48494895d8d8d5953ba656" + } + }, + "33f7c35206e7496c8b68189c982f6c96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c9899707f4ed4df9afdf80b91a75b2fc", + "placeholder": "​", + "style": "IPY_MODEL_cbc932cc9d654db7afaadced26c8ef7a", + "value": "model.safetensors: 100%" + } + }, + "feb2769cdd91429186c2cad2d519e5e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2be52eb70e904219a3a2256a3d466dc1", + "max": 10246621918, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3a8f32dbbda14e33a997a0a361c5042f", + "value": 10246621918 + } + }, + "49109d6abdda4b5987afb03c8ca82133": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2f6b8dafccee4a7386efd09f13d3f30a", + "placeholder": "​", + "style": "IPY_MODEL_41eb3536d2b04d6aae65a11b87a09d3c", + "value": " 10.2G/10.2G [04:00<00:00, 137MB/s]" + } + }, + "c73912ed1a48494895d8d8d5953ba656": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c9899707f4ed4df9afdf80b91a75b2fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cbc932cc9d654db7afaadced26c8ef7a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2be52eb70e904219a3a2256a3d466dc1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3a8f32dbbda14e33a997a0a361c5042f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2f6b8dafccee4a7386efd09f13d3f30a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "41eb3536d2b04d6aae65a11b87a09d3c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "67c4746cc365404d80e4187c371b2503": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b21842e752724217971c9f16ec028704", + "IPY_MODEL_52985a9a27ca465da304a09d532165a8", + "IPY_MODEL_e33733c0fad5429e9b8f017a62860bc3" + ], + "layout": "IPY_MODEL_0181be8f1f67481aa6d90a6d34b3d27b" + } + }, + "b21842e752724217971c9f16ec028704": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0762c9ebd93843dd8c5a0bc0e44f21e6", + "placeholder": "​", + "style": "IPY_MODEL_5698ed0353e74431b3658499cbb6184c", + "value": "Loading weights: 100%" + } + }, + "52985a9a27ca465da304a09d532165a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0d48488f4d5a427a84527c913213fc17", + "max": 2011, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_518191a0c4994a398e788e31a1612e46", + "value": 2011 + } + }, + "e33733c0fad5429e9b8f017a62860bc3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_007fc851909b46b08b199ac4540a8391", + "placeholder": "​", + "style": "IPY_MODEL_8697d011c5814742b7e5872c26c3a840", + "value": " 2011/2011 [00:42<00:00, 193.38it/s]" + } + }, + "0181be8f1f67481aa6d90a6d34b3d27b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0762c9ebd93843dd8c5a0bc0e44f21e6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5698ed0353e74431b3658499cbb6184c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0d48488f4d5a427a84527c913213fc17": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "518191a0c4994a398e788e31a1612e46": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "007fc851909b46b08b199ac4540a8391": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8697d011c5814742b7e5872c26c3a840": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e4db4b7388a24022b4166fb8398d84f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1a99b2cc5a834557be169221d5e5e922", + "IPY_MODEL_9f3c0e0b175d4d029a27b4425e190fdf", + "IPY_MODEL_fab9219a5f4f4ba094c7e3b79eee978f" + ], + "layout": "IPY_MODEL_6b0b45c64c2f42bcad42097be582b582" + } + }, + "1a99b2cc5a834557be169221d5e5e922": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_479c805860804745ac0addaebca04c08", + "placeholder": "​", + "style": "IPY_MODEL_2af827637bc14b99966ac252e71ca1d3", + "value": "generation_config.json: 100%" + } + }, + "9f3c0e0b175d4d029a27b4425e190fdf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_e01ca3fe18bd4f0faef2bf4df4faa892", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a37f76bac8d34ac982c7d6642c82d0ef", + "value": 208 + } + }, + "fab9219a5f4f4ba094c7e3b79eee978f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_bd43efb495044372b169c927f8d0584e", + "placeholder": "​", + "style": "IPY_MODEL_58f143afe4ed43efa145bacb1d9bf542", + "value": " 208/208 [00:00<00:00, 19.5kB/s]" + } + }, + "6b0b45c64c2f42bcad42097be582b582": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "479c805860804745ac0addaebca04c08": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2af827637bc14b99966ac252e71ca1d3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e01ca3fe18bd4f0faef2bf4df4faa892": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a37f76bac8d34ac982c7d6642c82d0ef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "bd43efb495044372b169c927f8d0584e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "58f143afe4ed43efa145bacb1d9bf542": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a5be5bfba3ec4648aa6ccd34f2eed259": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1b1b4f5f31a745ee98072cd87c99df89", + "IPY_MODEL_dab210ff7ce2430caf1e2d4302f8565a", + "IPY_MODEL_e2e043fe9da2485e9afd571d06bc27c7" + ], + "layout": "IPY_MODEL_fe08286d945446788aa1a44dac8f7263" + } + }, + "1b1b4f5f31a745ee98072cd87c99df89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0c82571976a040d3a0f6596cdca32b6e", + "placeholder": "​", + "style": "IPY_MODEL_d5d3bf30ac524d00b0cc3982fb66386f", + "value": "processor_config.json: " + } + }, + "dab210ff7ce2430caf1e2d4302f8565a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_84bbfab05a234b12ba5a2d38015c9f1a", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fea38f649a9e47b4a6185d85a62669a0", + "value": 1 + } + }, + "e2e043fe9da2485e9afd571d06bc27c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0ef55274df7042b5ae47880fb72d82cc", + "placeholder": "​", + "style": "IPY_MODEL_68b984644256400f9024e9d37998bd2f", + "value": " 1.69k/? [00:00<00:00, 115kB/s]" + } + }, + "fe08286d945446788aa1a44dac8f7263": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0c82571976a040d3a0f6596cdca32b6e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d5d3bf30ac524d00b0cc3982fb66386f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "84bbfab05a234b12ba5a2d38015c9f1a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "fea38f649a9e47b4a6185d85a62669a0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0ef55274df7042b5ae47880fb72d82cc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "68b984644256400f9024e9d37998bd2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3a0184a9cfef443385dd49f20f12cfc1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_6535c0b518144e108ac22d4c523aef32", + "IPY_MODEL_83f222f05c974fa191d0f4fd6186b1b5", + "IPY_MODEL_70f3613a5f1f4661b8b9aff8295bf7bb" + ], + "layout": "IPY_MODEL_2c80fe8defd7468da10b89d8de1f96b1" + } + }, + "6535c0b518144e108ac22d4c523aef32": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_af02af0771fe4f6e9d5f8123b6db676d", + "placeholder": "​", + "style": "IPY_MODEL_6fe995128adb4c08b07cee2a7de09454", + "value": "chat_template.jinja: " + } + }, + "83f222f05c974fa191d0f4fd6186b1b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_653651f81f3349bdbee628cd37aafa91", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_172bc6be7ccb4efe80b6bf255f426e0a", + "value": 1 + } + }, + "70f3613a5f1f4661b8b9aff8295bf7bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_dc4c8288184c4a69b1f19cdb5167e581", + "placeholder": "​", + "style": "IPY_MODEL_51884ea25fd94727889e54da2fe4b311", + "value": " 11.9k/? [00:00<00:00, 923kB/s]" + } + }, + "2c80fe8defd7468da10b89d8de1f96b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "af02af0771fe4f6e9d5f8123b6db676d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6fe995128adb4c08b07cee2a7de09454": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "653651f81f3349bdbee628cd37aafa91": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "172bc6be7ccb4efe80b6bf255f426e0a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "dc4c8288184c4a69b1f19cdb5167e581": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "51884ea25fd94727889e54da2fe4b311": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "04f2d1fee6cf4450854a90afcca7352a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_204b778594564833814db99c06ca4fbb", + "IPY_MODEL_c914b297689a4b69b9d02b01fb0f4d78", + "IPY_MODEL_843a0d013b794eaa8927086df2a38ae7" + ], + "layout": "IPY_MODEL_46c5ab9910614cb599b2694bb322658a" + } + }, + "204b778594564833814db99c06ca4fbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_bb7b78efc82c43f78b8579e0027b5ff4", + "placeholder": "​", + "style": "IPY_MODEL_f0e4f49d60694bc5a603b3a37c7b6a0d", + "value": "tokenizer_config.json: " + } + }, + "c914b297689a4b69b9d02b01fb0f4d78": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_db61162e59c94b4fa10ff4a4c0c97343", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0485e800a81f43b1943423f901bd1a4f", + "value": 1 + } + }, + "843a0d013b794eaa8927086df2a38ae7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b55db2c45b4048cda35766d236e4e84c", + "placeholder": "​", + "style": "IPY_MODEL_26b5672854ef4849a6d3d6ec7429d87b", + "value": " 14.9k/? [00:00<00:00, 1.33MB/s]" + } + }, + "46c5ab9910614cb599b2694bb322658a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "bb7b78efc82c43f78b8579e0027b5ff4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f0e4f49d60694bc5a603b3a37c7b6a0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "db61162e59c94b4fa10ff4a4c0c97343": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "0485e800a81f43b1943423f901bd1a4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b55db2c45b4048cda35766d236e4e84c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "26b5672854ef4849a6d3d6ec7429d87b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0e51754fe18440349b35bcc438b1bf02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_be57bb04bde04a58bb37d91bfbf3b51c", + "IPY_MODEL_05b6d19db7c447a9ae7d380f9d7765d8", + "IPY_MODEL_aeb32719f54e42a4b08a53cd5363a0d5" + ], + "layout": "IPY_MODEL_fde969cdd088420e972b911db636ae2d" + } + }, + "be57bb04bde04a58bb37d91bfbf3b51c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_27af09daa2374b7f9ce779aa7192b178", + "placeholder": "​", + "style": "IPY_MODEL_d22ddd345a85405c90fbceb0c623522d", + "value": "tokenizer.json: 100%" + } + }, + "05b6d19db7c447a9ae7d380f9d7765d8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3f54b22697044f4cb7c4555d1e443eaf", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3169b2afaf5c4bc8bfd94d87aaca04b0", + "value": 32169626 + } + }, + "aeb32719f54e42a4b08a53cd5363a0d5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_5d6cb7d0eec540e4873f290ad0c51856", + "placeholder": "​", + "style": "IPY_MODEL_111000cfd1af4e2db1f2c2557cd7206a", + "value": " 32.2M/32.2M [00:01<00:00, 161MB/s]" + } + }, + "fde969cdd088420e972b911db636ae2d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "27af09daa2374b7f9ce779aa7192b178": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d22ddd345a85405c90fbceb0c623522d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3f54b22697044f4cb7c4555d1e443eaf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3169b2afaf5c4bc8bfd94d87aaca04b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5d6cb7d0eec540e4873f290ad0c51856": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "111000cfd1af4e2db1f2c2557cd7206a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "870cc718caea4b09a6ac7d43bcc34b4c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_0dce530f23a24cddab63d607f3b94965", + "IPY_MODEL_bfa5e47f4ec74dfc83cf4c9f72b7953f", + "IPY_MODEL_c7b4dc08d4ae40af9a2ab2b78a1dad0f" + ], + "layout": "IPY_MODEL_c7e64de97ac6421499e2ad9f67bc419a" + } + }, + "0dce530f23a24cddab63d607f3b94965": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_2807725d165b4877929693661171736c", + "placeholder": "​", + "style": "IPY_MODEL_d7d6863aea5a4db2bfdda6c708291dcc", + "value": "README.md: 100%" + } + }, + "bfa5e47f4ec74dfc83cf4c9f72b7953f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_74d4f2959b4047c89182c1ec63df08e2", + "max": 982, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_184954dceb45488483a30405f1cf550c", + "value": 982 + } + }, + "c7b4dc08d4ae40af9a2ab2b78a1dad0f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6e9a6f1ec4e142558c91ed9f80398f00", + "placeholder": "​", + "style": "IPY_MODEL_4c07e50fbb6c42d7ba20b7f084d52b71", + "value": " 982/982 [00:00<00:00, 83.5kB/s]" + } + }, + "c7e64de97ac6421499e2ad9f67bc419a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2807725d165b4877929693661171736c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d7d6863aea5a4db2bfdda6c708291dcc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "74d4f2959b4047c89182c1ec63df08e2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "184954dceb45488483a30405f1cf550c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6e9a6f1ec4e142558c91ed9f80398f00": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4c07e50fbb6c42d7ba20b7f084d52b71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "80cc55a66a5f4305bcf1eccd67b7693b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ddda884ec6c54903b9bd741e5ab0cd8d", + "IPY_MODEL_eac214a702d14084965a8be6e1e0db6d", + "IPY_MODEL_f1f42573c8564030b75d7af02a9f7f7e" + ], + "layout": "IPY_MODEL_c9f8619f01b04e5996e62f7842ba499b" + } + }, + "ddda884ec6c54903b9bd741e5ab0cd8d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_621afa2e11564f148fe1b41d33b306fe", + "placeholder": "​", + "style": "IPY_MODEL_1fbb8fbc099f43ff85df3adb39b7f5c4", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "eac214a702d14084965a8be6e1e0db6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3db6e53661084022ac038dd2ca442cee", + "max": 116531415, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_90c6842f23544dd4bb04f1e4680cedc5", + "value": 116531415 + } + }, + "f1f42573c8564030b75d7af02a9f7f7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7e853b0ed3b943e4aa31fa0d483d3013", + "placeholder": "​", + "style": "IPY_MODEL_23b50cb43c144d5fb129571c793b1059", + "value": " 117M/117M [00:02<00:00, 311MB/s]" + } + }, + "c9f8619f01b04e5996e62f7842ba499b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "621afa2e11564f148fe1b41d33b306fe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1fbb8fbc099f43ff85df3adb39b7f5c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3db6e53661084022ac038dd2ca442cee": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "90c6842f23544dd4bb04f1e4680cedc5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7e853b0ed3b943e4aa31fa0d483d3013": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "23b50cb43c144d5fb129571c793b1059": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "59296292f4e2444589b75c2839758a6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d8bb24a7e9db4b1a9087f6cc54e9d819", + "IPY_MODEL_0911afbaf58c47cabfb0699552aaf1bb", + "IPY_MODEL_48a152c98a374fdbbb661bd90e82c46e" + ], + "layout": "IPY_MODEL_e38f05f599024a47bf3dd607a39e05ad" + } + }, + "d8bb24a7e9db4b1a9087f6cc54e9d819": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ba075479987849dd888b0b1bc9f4add4", + "placeholder": "​", + "style": "IPY_MODEL_511d5c2a1d634ab1839d803830cc014e", + "value": "Generating train split: 100%" + } + }, + "0911afbaf58c47cabfb0699552aaf1bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_b171c249f897489487353a4169875212", + "max": 100000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b47e4c66ac1a41bda658d59ec27920a9", + "value": 100000 + } + }, + "48a152c98a374fdbbb661bd90e82c46e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cf60f97b2e7f4061a19b2106308c1595", + "placeholder": "​", + "style": "IPY_MODEL_ed59a95a95c743c6bd169a0c5da95f67", + "value": " 100000/100000 [00:02<00:00, 90920.64 examples/s]" + } + }, + "e38f05f599024a47bf3dd607a39e05ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ba075479987849dd888b0b1bc9f4add4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "511d5c2a1d634ab1839d803830cc014e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b171c249f897489487353a4169875212": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b47e4c66ac1a41bda658d59ec27920a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "cf60f97b2e7f4061a19b2106308c1595": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ed59a95a95c743c6bd169a0c5da95f67": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "881902dee94e49be9939fdaef8bbdac2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9bbb3dd8995e49e18f041f310b0d9a72", + "IPY_MODEL_12d669b8572a4cc8ba6afc9a2da30fa0", + "IPY_MODEL_a09c3a078bb945c48fee4b3b8037daf1" + ], + "layout": "IPY_MODEL_5151ccca2dfd4660ae814c2737391129" + } + }, + "9bbb3dd8995e49e18f041f310b0d9a72": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_74df6a21d36b43bdaabcc750e5474354", + "placeholder": "​", + "style": "IPY_MODEL_8acd8628e9f54e03b87ad0e1dff9619f", + "value": "Unsloth: Standardizing formats (num_proc=6): 100%" + } + }, + "12d669b8572a4cc8ba6afc9a2da30fa0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_a4b2070844204cf68759dc5e9b667d8d", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6be139bc02564a30afe2a0ff6e1f2a83", + "value": 3000 + } + }, + "a09c3a078bb945c48fee4b3b8037daf1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c0c119b98e7146f893c0e6090aa06a19", + "placeholder": "​", + "style": "IPY_MODEL_ea6fc9d5e7b64b348cc3c3c9e8b7e4af", + "value": " 3000/3000 [00:01<00:00, 980.41 examples/s]" + } + }, + "5151ccca2dfd4660ae814c2737391129": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "74df6a21d36b43bdaabcc750e5474354": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8acd8628e9f54e03b87ad0e1dff9619f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a4b2070844204cf68759dc5e9b667d8d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6be139bc02564a30afe2a0ff6e1f2a83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c0c119b98e7146f893c0e6090aa06a19": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ea6fc9d5e7b64b348cc3c3c9e8b7e4af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "30d566f7f7cd4f26a57fcd9df0310bdc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_59291b76f1fb44adbdf509d43359bf71", + "IPY_MODEL_6b5887f069914368ae613bb2be3c8d33", + "IPY_MODEL_b246910de0dc431089632dd353ebeb29" + ], + "layout": "IPY_MODEL_c1229f0b7b6e49daaa72dc04d6c03df9" + } + }, + "59291b76f1fb44adbdf509d43359bf71": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_3a28dde28ae84bfd993354af8402df68", + "placeholder": "​", + "style": "IPY_MODEL_b812bec84a814eb79442ec2028d7ad3d", + "value": "Map: 100%" + } + }, + "6b5887f069914368ae613bb2be3c8d33": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_fb523ac744564bc4961e51b91a46b0a8", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9795836b1c24448bacf121ecdcff86f6", + "value": 3000 + } + }, + "b246910de0dc431089632dd353ebeb29": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6bc70efc138f4c0c8d619b32623966bb", + "placeholder": "​", + "style": "IPY_MODEL_f78de814eb3a445993231ab3855a3801", + "value": " 3000/3000 [00:00<00:00, 10132.26 examples/s]" + } + }, + "c1229f0b7b6e49daaa72dc04d6c03df9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3a28dde28ae84bfd993354af8402df68": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b812bec84a814eb79442ec2028d7ad3d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "fb523ac744564bc4961e51b91a46b0a8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9795836b1c24448bacf121ecdcff86f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6bc70efc138f4c0c8d619b32623966bb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f78de814eb3a445993231ab3855a3801": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "96c5653090984af8843866b1ee7c35b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7f32dee0a2ab4ed8bb99042ff5daf2da", + "IPY_MODEL_d990a3318024413983e1e38369e6dfb1", + "IPY_MODEL_97372097bc6442cd8e2cd518edffc2a1" + ], + "layout": "IPY_MODEL_c36c6d5aab3b49ebb00885dc6ef6efba" + } + }, + "7f32dee0a2ab4ed8bb99042ff5daf2da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cf45f9592f0140449cec334a3607c4dc", + "placeholder": "​", + "style": "IPY_MODEL_96118ea74ed049b1877344e3fa1e1bb5", + "value": "Unsloth: Tokenizing ["text"] (num_proc=6): 100%" + } + }, + "d990a3318024413983e1e38369e6dfb1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_09ab14ae65364f67b19aa6e0f0421e5e", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fc6de80b1d174253bf1c6419cd32ddae", + "value": 3000 + } + }, + "97372097bc6442cd8e2cd518edffc2a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4b347b13474545c4be6eb5992112ca5d", + "placeholder": "​", + "style": "IPY_MODEL_39574ff310c54895b267b9bf1dcddb2a", + "value": " 3000/3000 [00:51<00:00, 70.97 examples/s]" + } + }, + "c36c6d5aab3b49ebb00885dc6ef6efba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cf45f9592f0140449cec334a3607c4dc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "96118ea74ed049b1877344e3fa1e1bb5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "09ab14ae65364f67b19aa6e0f0421e5e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fc6de80b1d174253bf1c6419cd32ddae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4b347b13474545c4be6eb5992112ca5d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "39574ff310c54895b267b9bf1dcddb2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "31723fdf26d244e89793dd7b1a3bff02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_85e6c38a1df843688653d8367d3de389", + "IPY_MODEL_f9c4032c491d4d5b89638ca095568e56", + "IPY_MODEL_52fe26d316a442298bca3c28f2946dca" + ], + "layout": "IPY_MODEL_625a05721ba7449bae90f00fb9559fe2" + } + }, + "85e6c38a1df843688653d8367d3de389": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7970266ec39d421fa9b1d7827b815c8c", + "placeholder": "​", + "style": "IPY_MODEL_72ba9f0b55784a40b9af2b0d9a29485b", + "value": "Map (num_proc=6): 100%" + } + }, + "f9c4032c491d4d5b89638ca095568e56": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_4b67bd9f67794c9c8ac5aa72b0e6c7be", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d8fc545583854c73a37467ab6c35a05e", + "value": 3000 + } + }, + "52fe26d316a442298bca3c28f2946dca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ba41ad69efdb47b193a4870c35bfab00", + "placeholder": "​", + "style": "IPY_MODEL_4982f785bf94489d86c4e80a6ee1946d", + "value": " 3000/3000 [00:02<00:00, 2492.96 examples/s]" + } + }, + "625a05721ba7449bae90f00fb9559fe2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7970266ec39d421fa9b1d7827b815c8c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "72ba9f0b55784a40b9af2b0d9a29485b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4b67bd9f67794c9c8ac5aa72b0e6c7be": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d8fc545583854c73a37467ab6c35a05e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ba41ad69efdb47b193a4870c35bfab00": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4982f785bf94489d86c4e80a6ee1946d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "16043e0b5c6c4a3f8a2c6bf80a836f7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_115e710c34b4476a9e60c59c880357f4", + "IPY_MODEL_9fd27298f3384d1aaea0e9ee9cccbd25", + "IPY_MODEL_310d507dbe244b498ba5a1ab0b79546d" + ], + "layout": "IPY_MODEL_ee02c1c324db4838aee30cc2c2e5e9f0" + } + }, + "115e710c34b4476a9e60c59c880357f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_20817f41ac254ed994a943c5a397d506", + "placeholder": "​", + "style": "IPY_MODEL_67b9724f2c8e48c5ae00eb545a1217dd", + "value": "Filter (num_proc=6): 100%" + } + }, + "9fd27298f3384d1aaea0e9ee9cccbd25": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_8a28a80231fb45d6a0e04dab8ab07df9", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_997f89d4cc0946279726b4c00f4b6b2f", + "value": 3000 + } + }, + "310d507dbe244b498ba5a1ab0b79546d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_9b274c43ab604e338fe2e00449fc945b", + "placeholder": "​", + "style": "IPY_MODEL_2d4265df9bad4cd3bc136b7a1eaf3f34", + "value": " 3000/3000 [00:04<00:00, 451.55 examples/s]" + } + }, + "ee02c1c324db4838aee30cc2c2e5e9f0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "20817f41ac254ed994a943c5a397d506": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "67b9724f2c8e48c5ae00eb545a1217dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8a28a80231fb45d6a0e04dab8ab07df9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "997f89d4cc0946279726b4c00f4b6b2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9b274c43ab604e338fe2e00449fc945b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2d4265df9bad4cd3bc136b7a1eaf3f34": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Vision.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Vision.ipynb new file mode 100644 index 0000000..0e0aa9d --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)-Vision.ipynb @@ -0,0 +1,5673 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "2vQXvnUUsTzI" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7j01DfVgsTzJ" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6dT42nHksTzJ" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K7fgQkATsTzK" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vA7IKFdUsTzK" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Mp4i13PHsTzK" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GFOEZbP7ONMs" + }, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QmUBVEnvCDJv", + "outputId": "9920a66c-4176-44e9-d8a4-f6bbf2e37f48", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 397, + "referenced_widgets": [ + "9dbba5cc07984692a5cb9310c37294d1", + "3ac2b9eb631b49bab460d80e68135ab2", + "9a1b953f27b2419eb3302fee6ecbcc17", + "2a4ecf86f482417081d8645efdbe864d", + "b0f65d2867744352a1ff5fb2551cab67", + "a5b07bff219c4a33b0060c3ff3a12320", + "9d2f16071d4a429c8c9dbc588ec71b56", + "ec43f7e43c54441a8e13f42b8d21c306", + "7947ae62e3814e139e33e889e4753d24", + "aa18b4a0d9964a15a8699f461491a50f", + "4eca3234dd45475d8daa4d38ad818413", + "c45ec80780064eb698252b9f8268d18a", + "3008a3d0e4dc44a79304f6a398d914a7", + "c1e1699a15934316981527944b1acc1c", + "49a5c555942842ecb8c52d085c97a72c", + "a19a4d1df8db4cdc963d0374b0a3ead0", + "29be362f9fec42398fa8c358b0c9671c", + "008f1fd0286e4192adb7f8ac89f3191a", + "3af0e66e54f54a75906e08c9a6f2442e", + "c5bbad21d0eb4fd288dfc16c468be6da", + "07bec6bd94cd4c43b5c4f691969f9e4b", + "86f337af3a05478593337b916a108e5f", + "7edbbaac43b349be94f3a35f0c6d77d1", + "2a207602d4e04defa6294fd60cdcde4d", + "f3ef6cdedf1d49919d7fff94eb744b12", + "d6dd94e831ae4bb68380e6b1ec616c6a", + "ec11bc623d2d4f69bb514ffdac4bea7e", + "fcf6969b6ca04e74b57a1f0c5b857a3c", + "a63ad4bb24d34dfa9d7758bb17c76656", + "aa962a031a974a5c9c0995f01ee44d3d", + "86b32de59f744db8957f6830aa78882c", + "b6c332d8dbf149b38350f20728eb2d1b", + "ef8855bc019c406a8139203673af4a65", + "d1f0e4cdafd14357a9cb8dcac07f9da2", + "671fd02e35244c7ba8253a9d8a214bfa", + "b5c12d22f2c8436984be989f04dc1b82", + "329aef97734640fe858eb10cd898c1f0", + "96406b4153124e8ba124145e30bd74dd", + "8d320330f70248688d5acb3ec09a382c", + "6226c59b27fc4cf38d62ce5c7c69e375", + "344ea1b499e94bce91ae471cb39c6267", + "686d888d3aa24aa1acc943a78e7ab394", + "cb9060f87c9a44b18b1370dd8ccfec6a", + "5ee05bbd6830432a9f1a92c71e8f870f", + "acff987614e2454182fdd285f84cbfe2", + "b2bdbe39bdde4891958840f88e74ed7b", + "cd8bca8f57c84bfdaa8f76002d01ca50", + "e9c068d524664334b01fb6f1db19295e", + "8dac8e16ac9145ca9aae00456f0b9c74", + "09d2ce198cbd4148ad721aa825d62d6d", + "4789199cf5964285b8e550ad4fbed48e", + "3b8b062634424ea69075e48a06c6dc8f", + "a8637a53374d4a37b3b410e4408bf4ee", + "0ab3c43906724b08bcf869a5655bff30", + "aa515530e9494a28a24f90fdd9204a96", + "a60cd51dbd1d4404989c69a5b7e95f96", + "4f47d85c7a2c414e9cfb8f9e6e87df4c", + "e237c0a6a6814576a3100f68b329d4cb", + "a5705ad4707d4a3faacdd2d37eb63fbc", + "42bd62697c1649ec98f504930e56c396", + "0661e6df71fd4df88a185d9cadab56f0", + "e615ee8b03ce4bd494315a4ad2df8b9a", + "766ffc619cf04a378d7c1186c74f87ba", + "efadf09207c0427cb0d29f48bebe2ac7", + "d2a87fd0f3d04145a5bd9dd1ed75395b", + "d38821cad5ac4f62bdbbfed1bbd3ffb6", + "418feb293e1143c7bd3a057697e02b88", + "7ca38ff83b274ddf908d1250c613b590", + "526d7159b777407ea1c3fd34d44024df", + "28b52765c091458d8c411a5aa3d3c4ed", + "0501889c836b49bf90e4a9f3cca16b44", + "df2390fa32f0482a9b7d3fd10f4d19b0", + "67cfb5f857da465cae4575ce0e12449d", + "1dcda7554eb342cbb660bf8a78272ecc", + "1d23ab2873814345a58a8c12438196df", + "b2a50fc0c2a44c82a7015f11713c6181", + "8e47b9fa36ee4c128414a714d3ae9547" + ] + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Unsloth: QLoRA and full finetuning all not selected. Switching to 16bit LoRA.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00\n", + "### Data Prep\n", + "We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions.\n", + "\n", + "You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LjY75GoYUCB8", + "outputId": "e5477a1e-acac-46ce-8c00-bb48ace0df50", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "referenced_widgets": [ + "87fb532c204143a6957b498382749619", + "76e88b170834473aa4e41f8ecede6545", + "594a65dcffb442cb9a7d264e17d26bea", + "5eca7ef2432f43fc9ff2bb88a017c0e7", + "4a703d9591cf467ba73f98a0bad9b169", + "690042bf19924111809748d2f3fdf5e2", + "19dbff1fba52476aa320072b0c5ca0ad", + "446de647345c4d96a4f0bc20527a9239", + "24c3d3519e5e4203801f6db21b174d75", + "b630883c3e984eea892ecf0c23942c74", + "5f93397ffbde4cbf8c494f0e6495deab", + "f04af098beb745dd83eeebb4a129df16", + "16642b8f9da245e58595e8b59a898803", + "1b39506c9fa943f18c99e9a9ab29f2e1", + "5c14213926ab404a815a6a6fb0b10e5d", + "abcb4e51c128476b97a5cabcb51925ae", + "99c7aa8c8a96453dbcc5ed8ae8d55e39", + "94b4e20a08f741d89475873612d9f014", + "eb8b4370227e4969a1c8a2649f219b6a", + "0d7ed4045cb74d75a90e6ab2304fc9f5", + "575c74bd5eed4c0bba0a5741a32e8595", + "3f07f2d9645949f688ab4d577ae4d0e7", + "749cf884ca664718be7e2279d3609193", + "d820ee3337494b92869ff7c58133f785", + "a71b8168cc54466bb4980cfee5c36b43", + "0aa9fbdf33a043bdadb42e7c9ac60fe1", + "ac278d22afd8443ba318472ee187b9ce", + "7da52b5a12eb4e22939cab415d177fdf", + "f33bb1bb79af4929beee2fd8ac8e1762", + "4b17c47b96a54844bf5e197d0cf497a2", + "1f52b1d75d2b429b957f14dc74919e60", + "235f72da403d40138566ee21c219d3a3", + "b25d1876d9504dc2b0ab0cdce4dd1545", + "b57b52f00850496e8def6847da587a40", + "7dff2ef63de54684b7b61ae037d051b1", + "b15f4b8f28094b0cab0da27ed817e261", + "49baa628d8b4481ba6dac63b13e80cd6", + "7619a6b05a5643158620b12646757974", + "b3283fd17387482f9f127a8ff8089f23", + "08eece15f66b4367825ec48c7e3961cb", + "c49366b385fa41b083bfb208d54add54", + "d4e5d57774cf4c9caa352a1ada066fab", + "dfa1df1b47d647a3a4385b901ed58f57", + "6e3ec422ca96449b81f7358fe050b380", + "abdbeadfb7f24651967c24fedd7b0f2f", + "250587f17d6845ebbee21a51597382b2", + "2197baef18b84247a61bd69563cbb695", + "843fe7d70a2c4085beb423d355aeb472", + "a1fa450ee45f44dcbe67b73cfa56df3b", + "05811e6740f44784a58660daa042a371", + "fdfc87dd989c4f39948610991bd7b5d3", + "ec238c8a4a624904a8629adc272bdf15", + "e97dcacab83d4b968bae440040e1513b", + "46e1156b616243cabf185557950e5f07", + "896090ab3ee442f3b04339560948b222" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/519 [00:00" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUAAAAAyCAIAAACib5WDAAAYrUlEQVR4Ae3cebSuUx0HcCSFEBHKlNZCQi2zureMyTwrY2UeQlSaXNdQxjSSMltFSJF5bjCzDMuilUUUIjSKotLtc+83+z73eYd7znve877n3vXuP56zn/389m/av2FP75l10qRJswzKQAMDDcyYGphtxmS7P1wPgl1/9N4nqoZ77I/4TOvA3dU+bP/5z39mnXXWPtnSgGwfNGC4lf/+9799oD1kkjOnA1N6tD9kPUwHELbZZ5/9hRde+Oc//zkd0Ol9FgteffXVsR/apyfHTP6dCT3zzDP/+Mc/ZpttTPvImGauYxuh9BdffPHvf//7v/71r46RpCNPM5Zc7uijj37729/+ne98J9m4Y7Riwete9zpPKb1jJIOOo6qBjPinP/3pt7zlLddcc82///1vBjCqFDtHzhxnpsIraP/nP//5IossMvfcc3/5y18mHTfuWMZky0022YSKf/rTnwrJSHSMTd8//vGP55133qabbvr888/Dg9uOsQ06jpIG4sCvvPLKxhtvbNzFboS48SiRGwnamTADS25i5+abbz7PPPMYg85j2yyz8F7J/IYbbrjyyiu/8pWvwPmGN7xB/uwAp0HSy7xggw02uO2222688cbXv/71HeAZdOmBBpiQYoAuv/zy973vfccee+xf//pXa6gMYg8YGAaJkXj/WOub3HjVVVfxsb/85S+m0JasI2EyqVs4gNACmD8rI0Go+9/+9jcYllpqKalYZZCBR6LPUe2blHv77bdzp2OOOQatkUzlRonV2Yfh62MelDNImBxYsJxzzjlly66wbCrO8cRjyA3DSHCK6/POO6/JM+NQHwmqbvUl0RjhpFsSTRdPBnG6UovaIFdffXWQpk7TRdsXgJlnCk3XfEyMPPPMMw8++OA55pgj8XLkahUXIMmojxwbPCxj5Hi6hWG6dtwtQmMHD5GHKDWwTOLG1JBVNdmJAzNoCaSKZezUX375ZRqXMKeM0VDHqZf8D9F0esOSaCK3ZBrfG4pjgQojUYYYkU278DxE4N5L14kDE6mLGzBU0xXtWABT33e/+13PDTfc0DOq771O21MkbFJ6F91migqHp8Z0sTez8sorW94LK1qqnAeg2tL3urgc1TXlxCcATT+Vxixrv/SlL33xi18kcmymfJ0RK00cmFTkVFQoRUmLp0kpIR3STJw4EYB6bdSHpQJ94ZycJae971IolvEoLWGpFRUILS/NdtZbbz0w7R0YqqqNtsfciuJw2yPs/PPPb33umdfhIqnBFx3W1FgDa3wFjw1jqlLdrqdtwIW3kQxxI9HGFvxPMbfJ9la+ptEzzGhnDEa2OqbVrwB8AlBspqAqFYKAIReYPAvyAjPDVZo4sB0gCVZRIbCSFk8LSzJffPHFRx11VFXdnYlNiXBKAgoqBUmhWBYepSUsFchSMTYYlknOPvtswwNh+dSqAlWxUTCtMLfq3lk7S3388cfPPffcxx57zFM9cbAzbHoRHOe23J9++umXXnqpqsamOA2f2SN31fGCCy5Ya621jOl73vOeww47jDYwEyvXF8I//elPKto1NsWWRthEgTb2oHsbDPifYm6T7a1QSaNnJIr3/vjHP77++uvBBFv5Gj/0CUBTHw6HCRNO4J3nX3311Ysttli2poItmgHTJgQU9sZOZarKwpOROO200/785z+TiiRbb7219lxGIZvbEXvsscc555zzqU99yjavFqrvQBjIFR0///nP/+hHP1I/5ZRTHJozAght3N9///2sxwbghz70IWBarrvuOpaEpQ9/+MNrrrmmLo3G6uDXIY30izfjAb4Vb4z41FNP/dnPfrbffvtB+PGPf3y++ebbZpttxo8fr2MJHK26d9wOuSNl04TDDz/8d7/7nfqee+7ZMTYdyXjkkUf+5Cc/eec73/mLX/zC0Gy22Wa01CjCZI1PmvTkk0/+8pe/3GWXXfR985vfTN7vf//7H/vYx3JjIZzcddddAjTH/tWvfrXoooti8o1vfGNoBaA8jRcvEol23nnnueaaq7TXKm0Ggr1973vf+/3vf6+7Kclee+1lUsDfTj75ZPEI/o022shwE8ftl69//euXXnopKfQycG9605vKkGl817veteWWW7LJj370o0UDNQ7dw1lppZWeeuopA7HPPvuwE6xO1su0mqnxP6Zfw32epCI55wnHZ511ltDOJahVi+QmYwhd6txJF9qpdh96HRXAa6+9ttj/3HPPPfLIIwxF1MCAAeC6biyiwm4SSjzTgiVf0QVZJRdOEp4du/tkjKsApa6jXS5fP/GJTyDhvqtPv/nNb9T333//Wscg4WyChbH3tUa3oO19JSJLJjjHP1ZlVG7geBmTjXym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\n", + "image/jpeg": "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\n" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "dataset[2][\"image\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lXjfJr4W6z8P", + "outputId": "3d2c1834-b446-436e-81d9-0375434fd9a6", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'H ^ { \\\\prime } = \\\\beta N \\\\int d \\\\lambda \\\\biggl \\\\{ \\\\frac { 1 } { 2 \\\\beta ^ { 2 } N ^ { 2 } } \\\\partial _ { \\\\lambda } \\\\zeta ^ { \\\\dagger } \\\\partial _ { \\\\lambda } \\\\zeta + V ( \\\\lambda ) \\\\zeta ^ { \\\\dagger } \\\\zeta \\\\biggr \\\\} \\\\ .'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "dataset[2][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rKHxfZua1CrS" + }, + "source": [ + "We can also render LaTeX directly in the browser!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nPopsxAC1CrS", + "outputId": "ec105cce-33b7-4bc1-f4db-45de7e8befb3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/latex": "$\\displaystyle \\sigma ^ { \\mu } \\frac { \\lambda ^ { a } } { 2 } A _ { \\mu } ^ { a } .$" + }, + "metadata": {} + } + ], + "source": [ + "from IPython.display import display, Math, Latex\n", + "\n", + "latex = dataset[3][\"text\"]\n", + "display(Math(latex))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K9CBpiISFa6C" + }, + "source": [ + "To format the dataset, all vision fine-tuning tasks should follow this format:\n", + "\n", + "```python\n", + "[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oPXzJZzHEgXe" + }, + "outputs": [], + "source": [ + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "def convert_to_conversation(sample):\n", + " conversation = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": sample[\"text\"]}]},\n", + " ]\n", + " return {\"messages\": conversation}\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FY-9u-OD6_gE" + }, + "source": [ + "Let's convert the dataset into the \"correct\" format for finetuning:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gFW2qXIr7Ezy" + }, + "outputs": [], + "source": [ + "converted_dataset = [convert_to_conversation(sample) for sample in dataset]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "The first example is now structured like below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gGFzmplrEy9I", + "outputId": "b38a50f0-7526-4be4-8a1c-97558df918b4", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'messages': [{'role': 'user',\n", + " 'content': [{'type': 'text',\n", + " 'text': 'Write the LaTeX representation for this image.'},\n", + " {'type': 'image',\n", + " 'image': }]},\n", + " {'role': 'assistant',\n", + " 'content': [{'type': 'text',\n", + " 'text': '{ \\\\frac { N } { M } } \\\\in { \\\\bf Z } , { \\\\frac { M } { P } } \\\\in { \\\\bf Z } , { \\\\frac { P } { Q } } \\\\in { \\\\bf Z }'}]}]}" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ], + "source": [ + "converted_dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MsRPBIb0JJ6c" + }, + "source": [ + "Lets take the Gemma 4 instruction chat template and use it in our base model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "exoDVEvmJN-6" + }, + "outputs": [], + "source": [ + "from unsloth import get_chat_template\n", + "\n", + "processor = get_chat_template(\n", + " processor,\n", + " \"gemma-4\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FecKS-dA82f5" + }, + "source": [ + "Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vcat4UxA81vr", + "outputId": "d033736e-e80f-490f-f189-6e09ea98817f", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "```latex\n", + "H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\xi^\\dagger \\partial_\\lambda \\xi + V(\\lambda) \\xi^\\dagger \\xi \\right\\}.\n", + "```\n" + ] + } + ], + "source": [ + "image = dataset[2][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FeAiMlQ71CrS" + }, + "source": [ + "You can see it's absolutely terrible! It doesn't follow instructions at all" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning!\n", + "\n", + "We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "95_Nn-89DhsL", + "outputId": "13282f82-d3fe-438b-d0f8-e47f4582fb17", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = converted_dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 4,\n", + " max_grad_norm = 0.3,\n", + " warmup_ratio = 0.03,\n", + " max_steps = 60,\n", + " # num_train_epochs = 2, # Set this instead of max_steps for full training runs\n", + " learning_rate = 2e-4,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\", # For Weights and Biases or others\n", + "\n", + " # You MUST put the below items for vision finetuning:\n", + " remove_unused_columns = False,\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 2048,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "outputId": "54133bfb-63f2-4d2d-bbe1-cea95d077a83", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "10.307 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "outputId": "3d8a59ac-ec41-419e-f25f-ddee3f9dea89", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 68,686 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 59,719,680 of 5,182,897,696 (1.15% trained)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 03:09, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
113.119604
214.200603
314.389761
414.693236
514.118143
610.960572
78.097441
86.393641
94.937364
104.203208
113.456124
123.272719
132.971413
142.495770
152.417672
162.748857
172.540635
182.330746
192.280551
202.012815
212.011085
222.002847
231.918156
241.896314
251.834707
261.854128
271.651750
281.860624
291.869892
301.532480
311.548356
322.402746
331.781458
341.850275
351.509472
361.659287
371.609388
381.703836
391.961015
402.099207
411.570554
421.179479
431.736481
441.550761
451.548448
461.569731
471.550730
481.422475
491.556145
501.559651
511.485411
521.749113
531.348081
541.384408
551.508071
562.067807
571.268674
581.504525
591.869724
601.731446

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "outputId": "b505ad75-49e6-416d-8f9b-6673d1d98d64", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "217.1113 seconds used for training.\n", + "3.62 minutes used for training.\n", + "Peak reserved memory = 10.764 GB.\n", + "Peak reserved memory for training = 0.457 GB.\n", + "Peak reserved memory % of max memory = 73.913 %.\n", + "Peak reserved memory for training % of max memory = 3.138 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model! You can modify the instruction and input—just leave the output blank.\n", + "\n", + "We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kR3gIAX-SM2q", + "outputId": "1da42901-c48a-4396-f463-386ff4bf2685", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\\[\\left[[B_{n}^{\\pm}, b_{2}^{\\pm}\\right], b_{2}^{\\mp}\\right] = nB_{n}^{+}, \\quad \\left[[B_{n}^{-}, b_{2}^{\\pm}\\right], b_{2}^{\\mp}\\right] = nB_{n}^{-}.\\]\n" + ] + } + ], + "source": [ + "image = dataset[10][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "upcOlWe7A1vc", + "outputId": "32663620-c6cf-4ce5-8e16-12ac5c196988", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "MKX_XKs_BNZR", + "outputId": "ac64eeb1-fb27-44c8-8a6d-198ad3daac3d", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The image shows a mathematical equation:\n", + "\n", + "$$D_{\\mu}^{\\alpha \\beta} \\bar{A}_{\\mu}^{\\alpha \\beta} = 0,$$\n", + "\n", + "This equation is a condition or a constraint within a specific physical theory, likely related to quantum field theory, particle physics, or general relativity, given the use of indices ($\\mu, \\alpha, \\beta$) and the notation $\\bar{A}$.\n", + "\n", + "**Interpretation of the terms (based on common physics notation):**\n", + "\n", + "* **$D_{\\mu}^{\\alpha \\beta}$:** This likely represents a covariant derivative (or a related tensor/operator) acting on some field\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastVisionModel\n", + "\n", + " model, processor = FastVisionModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " load_in_4bit = True, # Set to False for 16bit LoRA\n", + " )\n", + "\n", + "sample = dataset[1]\n", + "image = sample[\"image\"].convert(\"RGB\")\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": sample[\"text\"],\n", + " },\n", + " {\n", + " \"type\": \"image\",\n", + " },\n", + " ],\n", + " },\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True)\n", + "_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "# Select ONLY 1 to save! (Both not needed!)\n", + "\n", + "# Save locally to 16bit\n", + "if False: model.save_pretrained_merged(\"unsloth_finetune\", processor,)\n", + "\n", + "# To export and save to your Hugging Face account\n", + "if False: model.push_to_hub_merged(\"YOUR_USERNAME/unsloth_finetune\", processor, token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TSjNVDCYv-yr" + }, + "source": [ + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.13.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "9dbba5cc07984692a5cb9310c37294d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_3ac2b9eb631b49bab460d80e68135ab2", + "IPY_MODEL_9a1b953f27b2419eb3302fee6ecbcc17", + "IPY_MODEL_2a4ecf86f482417081d8645efdbe864d" + ], + "layout": "IPY_MODEL_b0f65d2867744352a1ff5fb2551cab67" + } + }, + "3ac2b9eb631b49bab460d80e68135ab2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a5b07bff219c4a33b0060c3ff3a12320", + "placeholder": "​", + "style": "IPY_MODEL_9d2f16071d4a429c8c9dbc588ec71b56", + "value": "model.safetensors: 100%" + } + }, + "9a1b953f27b2419eb3302fee6ecbcc17": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ec43f7e43c54441a8e13f42b8d21c306", + "max": 10246621918, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7947ae62e3814e139e33e889e4753d24", + "value": 10246621918 + } + }, + "2a4ecf86f482417081d8645efdbe864d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_aa18b4a0d9964a15a8699f461491a50f", + "placeholder": "​", + "style": "IPY_MODEL_4eca3234dd45475d8daa4d38ad818413", + "value": " 10.2G/10.2G [00:26<00:00, 526MB/s]" + } + }, + "b0f65d2867744352a1ff5fb2551cab67": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a5b07bff219c4a33b0060c3ff3a12320": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9d2f16071d4a429c8c9dbc588ec71b56": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ec43f7e43c54441a8e13f42b8d21c306": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7947ae62e3814e139e33e889e4753d24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "aa18b4a0d9964a15a8699f461491a50f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4eca3234dd45475d8daa4d38ad818413": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c45ec80780064eb698252b9f8268d18a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_3008a3d0e4dc44a79304f6a398d914a7", + "IPY_MODEL_c1e1699a15934316981527944b1acc1c", + "IPY_MODEL_49a5c555942842ecb8c52d085c97a72c" + ], + "layout": "IPY_MODEL_a19a4d1df8db4cdc963d0374b0a3ead0" + } + }, + "3008a3d0e4dc44a79304f6a398d914a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_29be362f9fec42398fa8c358b0c9671c", + "placeholder": "​", + "style": "IPY_MODEL_008f1fd0286e4192adb7f8ac89f3191a", + "value": "Loading weights: 100%" + } + }, + "c1e1699a15934316981527944b1acc1c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3af0e66e54f54a75906e08c9a6f2442e", + "max": 2011, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c5bbad21d0eb4fd288dfc16c468be6da", + "value": 2011 + } + }, + "49a5c555942842ecb8c52d085c97a72c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_07bec6bd94cd4c43b5c4f691969f9e4b", + "placeholder": "​", + "style": "IPY_MODEL_86f337af3a05478593337b916a108e5f", + "value": " 2011/2011 [00:04<00:00, 689.32it/s]" + } + }, + "a19a4d1df8db4cdc963d0374b0a3ead0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "29be362f9fec42398fa8c358b0c9671c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "008f1fd0286e4192adb7f8ac89f3191a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3af0e66e54f54a75906e08c9a6f2442e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c5bbad21d0eb4fd288dfc16c468be6da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "07bec6bd94cd4c43b5c4f691969f9e4b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "86f337af3a05478593337b916a108e5f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7edbbaac43b349be94f3a35f0c6d77d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_2a207602d4e04defa6294fd60cdcde4d", + "IPY_MODEL_f3ef6cdedf1d49919d7fff94eb744b12", + "IPY_MODEL_d6dd94e831ae4bb68380e6b1ec616c6a" + ], + "layout": "IPY_MODEL_ec11bc623d2d4f69bb514ffdac4bea7e" + } + }, + "2a207602d4e04defa6294fd60cdcde4d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_fcf6969b6ca04e74b57a1f0c5b857a3c", + "placeholder": "​", + "style": "IPY_MODEL_a63ad4bb24d34dfa9d7758bb17c76656", + "value": "generation_config.json: 100%" + } + }, + "f3ef6cdedf1d49919d7fff94eb744b12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_aa962a031a974a5c9c0995f01ee44d3d", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_86b32de59f744db8957f6830aa78882c", + "value": 208 + } + }, + "d6dd94e831ae4bb68380e6b1ec616c6a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b6c332d8dbf149b38350f20728eb2d1b", + "placeholder": "​", + "style": "IPY_MODEL_ef8855bc019c406a8139203673af4a65", + "value": " 208/208 [00:00<00:00, 26.5kB/s]" + } + }, + "ec11bc623d2d4f69bb514ffdac4bea7e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fcf6969b6ca04e74b57a1f0c5b857a3c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a63ad4bb24d34dfa9d7758bb17c76656": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "aa962a031a974a5c9c0995f01ee44d3d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "86b32de59f744db8957f6830aa78882c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b6c332d8dbf149b38350f20728eb2d1b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ef8855bc019c406a8139203673af4a65": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d1f0e4cdafd14357a9cb8dcac07f9da2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_671fd02e35244c7ba8253a9d8a214bfa", + "IPY_MODEL_b5c12d22f2c8436984be989f04dc1b82", + "IPY_MODEL_329aef97734640fe858eb10cd898c1f0" + ], + "layout": "IPY_MODEL_96406b4153124e8ba124145e30bd74dd" + } + }, + "671fd02e35244c7ba8253a9d8a214bfa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8d320330f70248688d5acb3ec09a382c", + "placeholder": "​", + "style": "IPY_MODEL_6226c59b27fc4cf38d62ce5c7c69e375", + "value": "processor_config.json: " + } + }, + "b5c12d22f2c8436984be989f04dc1b82": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_344ea1b499e94bce91ae471cb39c6267", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_686d888d3aa24aa1acc943a78e7ab394", + "value": 1 + } + }, + "329aef97734640fe858eb10cd898c1f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cb9060f87c9a44b18b1370dd8ccfec6a", + "placeholder": "​", + "style": "IPY_MODEL_5ee05bbd6830432a9f1a92c71e8f870f", + "value": " 1.69k/? [00:00<00:00, 180kB/s]" + } + }, + "96406b4153124e8ba124145e30bd74dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8d320330f70248688d5acb3ec09a382c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6226c59b27fc4cf38d62ce5c7c69e375": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "344ea1b499e94bce91ae471cb39c6267": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "686d888d3aa24aa1acc943a78e7ab394": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "cb9060f87c9a44b18b1370dd8ccfec6a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5ee05bbd6830432a9f1a92c71e8f870f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "acff987614e2454182fdd285f84cbfe2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b2bdbe39bdde4891958840f88e74ed7b", + "IPY_MODEL_cd8bca8f57c84bfdaa8f76002d01ca50", + "IPY_MODEL_e9c068d524664334b01fb6f1db19295e" + ], + "layout": "IPY_MODEL_8dac8e16ac9145ca9aae00456f0b9c74" + } + }, + "b2bdbe39bdde4891958840f88e74ed7b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_09d2ce198cbd4148ad721aa825d62d6d", + "placeholder": "​", + "style": "IPY_MODEL_4789199cf5964285b8e550ad4fbed48e", + "value": "chat_template.jinja: " + } + }, + "cd8bca8f57c84bfdaa8f76002d01ca50": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3b8b062634424ea69075e48a06c6dc8f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a8637a53374d4a37b3b410e4408bf4ee", + "value": 1 + } + }, + "e9c068d524664334b01fb6f1db19295e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0ab3c43906724b08bcf869a5655bff30", + "placeholder": "​", + "style": "IPY_MODEL_aa515530e9494a28a24f90fdd9204a96", + "value": " 11.9k/? [00:00<00:00, 1.24MB/s]" + } + }, + "8dac8e16ac9145ca9aae00456f0b9c74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "09d2ce198cbd4148ad721aa825d62d6d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4789199cf5964285b8e550ad4fbed48e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3b8b062634424ea69075e48a06c6dc8f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "a8637a53374d4a37b3b410e4408bf4ee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0ab3c43906724b08bcf869a5655bff30": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "aa515530e9494a28a24f90fdd9204a96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a60cd51dbd1d4404989c69a5b7e95f96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_4f47d85c7a2c414e9cfb8f9e6e87df4c", + "IPY_MODEL_e237c0a6a6814576a3100f68b329d4cb", + "IPY_MODEL_a5705ad4707d4a3faacdd2d37eb63fbc" + ], + "layout": "IPY_MODEL_42bd62697c1649ec98f504930e56c396" + } + }, + "4f47d85c7a2c414e9cfb8f9e6e87df4c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0661e6df71fd4df88a185d9cadab56f0", + "placeholder": "​", + "style": "IPY_MODEL_e615ee8b03ce4bd494315a4ad2df8b9a", + "value": "tokenizer_config.json: " + } + }, + "e237c0a6a6814576a3100f68b329d4cb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_766ffc619cf04a378d7c1186c74f87ba", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_efadf09207c0427cb0d29f48bebe2ac7", + "value": 1 + } + }, + "a5705ad4707d4a3faacdd2d37eb63fbc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d2a87fd0f3d04145a5bd9dd1ed75395b", + "placeholder": "​", + "style": "IPY_MODEL_d38821cad5ac4f62bdbbfed1bbd3ffb6", + "value": " 14.9k/? [00:00<00:00, 1.67MB/s]" + } + }, + "42bd62697c1649ec98f504930e56c396": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0661e6df71fd4df88a185d9cadab56f0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e615ee8b03ce4bd494315a4ad2df8b9a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "766ffc619cf04a378d7c1186c74f87ba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "efadf09207c0427cb0d29f48bebe2ac7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d2a87fd0f3d04145a5bd9dd1ed75395b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d38821cad5ac4f62bdbbfed1bbd3ffb6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "418feb293e1143c7bd3a057697e02b88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7ca38ff83b274ddf908d1250c613b590", + "IPY_MODEL_526d7159b777407ea1c3fd34d44024df", + "IPY_MODEL_28b52765c091458d8c411a5aa3d3c4ed" + ], + "layout": "IPY_MODEL_0501889c836b49bf90e4a9f3cca16b44" + } + }, + "7ca38ff83b274ddf908d1250c613b590": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_df2390fa32f0482a9b7d3fd10f4d19b0", + "placeholder": "​", + "style": "IPY_MODEL_67cfb5f857da465cae4575ce0e12449d", + "value": "tokenizer.json: 100%" + } + }, + "526d7159b777407ea1c3fd34d44024df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1dcda7554eb342cbb660bf8a78272ecc", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1d23ab2873814345a58a8c12438196df", + "value": 32169626 + } + }, + "28b52765c091458d8c411a5aa3d3c4ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b2a50fc0c2a44c82a7015f11713c6181", + "placeholder": "​", + "style": "IPY_MODEL_8e47b9fa36ee4c128414a714d3ae9547", + "value": " 32.2M/32.2M [00:00<00:00, 147MB/s]" + } + }, + "0501889c836b49bf90e4a9f3cca16b44": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "df2390fa32f0482a9b7d3fd10f4d19b0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "67cfb5f857da465cae4575ce0e12449d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1dcda7554eb342cbb660bf8a78272ecc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1d23ab2873814345a58a8c12438196df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b2a50fc0c2a44c82a7015f11713c6181": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8e47b9fa36ee4c128414a714d3ae9547": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "87fb532c204143a6957b498382749619": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_76e88b170834473aa4e41f8ecede6545", + "IPY_MODEL_594a65dcffb442cb9a7d264e17d26bea", + "IPY_MODEL_5eca7ef2432f43fc9ff2bb88a017c0e7" + ], + "layout": "IPY_MODEL_4a703d9591cf467ba73f98a0bad9b169" + } + }, + "76e88b170834473aa4e41f8ecede6545": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_690042bf19924111809748d2f3fdf5e2", + "placeholder": "​", + "style": "IPY_MODEL_19dbff1fba52476aa320072b0c5ca0ad", + "value": "README.md: 100%" + } + }, + "594a65dcffb442cb9a7d264e17d26bea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_446de647345c4d96a4f0bc20527a9239", + "max": 519, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_24c3d3519e5e4203801f6db21b174d75", + "value": 519 + } + }, + "5eca7ef2432f43fc9ff2bb88a017c0e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b630883c3e984eea892ecf0c23942c74", + "placeholder": "​", + "style": "IPY_MODEL_5f93397ffbde4cbf8c494f0e6495deab", + "value": " 519/519 [00:00<00:00, 62.8kB/s]" + } + }, + "4a703d9591cf467ba73f98a0bad9b169": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "690042bf19924111809748d2f3fdf5e2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "19dbff1fba52476aa320072b0c5ca0ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "446de647345c4d96a4f0bc20527a9239": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "24c3d3519e5e4203801f6db21b174d75": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b630883c3e984eea892ecf0c23942c74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5f93397ffbde4cbf8c494f0e6495deab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f04af098beb745dd83eeebb4a129df16": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_16642b8f9da245e58595e8b59a898803", + "IPY_MODEL_1b39506c9fa943f18c99e9a9ab29f2e1", + "IPY_MODEL_5c14213926ab404a815a6a6fb0b10e5d" + ], + "layout": "IPY_MODEL_abcb4e51c128476b97a5cabcb51925ae" + } + }, + "16642b8f9da245e58595e8b59a898803": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_99c7aa8c8a96453dbcc5ed8ae8d55e39", + "placeholder": "​", + "style": "IPY_MODEL_94b4e20a08f741d89475873612d9f014", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "1b39506c9fa943f18c99e9a9ab29f2e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_eb8b4370227e4969a1c8a2649f219b6a", + "max": 343805431, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0d7ed4045cb74d75a90e6ab2304fc9f5", + "value": 343805431 + } + }, + "5c14213926ab404a815a6a6fb0b10e5d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_575c74bd5eed4c0bba0a5741a32e8595", + "placeholder": "​", + "style": "IPY_MODEL_3f07f2d9645949f688ab4d577ae4d0e7", + "value": " 344M/344M [00:01<00:00, 571MB/s]" + } + }, + "abcb4e51c128476b97a5cabcb51925ae": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "99c7aa8c8a96453dbcc5ed8ae8d55e39": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "94b4e20a08f741d89475873612d9f014": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "eb8b4370227e4969a1c8a2649f219b6a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0d7ed4045cb74d75a90e6ab2304fc9f5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "575c74bd5eed4c0bba0a5741a32e8595": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3f07f2d9645949f688ab4d577ae4d0e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "749cf884ca664718be7e2279d3609193": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d820ee3337494b92869ff7c58133f785", + "IPY_MODEL_a71b8168cc54466bb4980cfee5c36b43", + "IPY_MODEL_0aa9fbdf33a043bdadb42e7c9ac60fe1" + ], + "layout": "IPY_MODEL_ac278d22afd8443ba318472ee187b9ce" + } + }, + "d820ee3337494b92869ff7c58133f785": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7da52b5a12eb4e22939cab415d177fdf", + "placeholder": "​", + "style": "IPY_MODEL_f33bb1bb79af4929beee2fd8ac8e1762", + "value": "data/test-00000-of-00001.parquet: 100%" + } + }, + "a71b8168cc54466bb4980cfee5c36b43": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_4b17c47b96a54844bf5e197d0cf497a2", + "max": 38205016, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1f52b1d75d2b429b957f14dc74919e60", + "value": 38205016 + } + }, + "0aa9fbdf33a043bdadb42e7c9ac60fe1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_235f72da403d40138566ee21c219d3a3", + "placeholder": "​", + "style": "IPY_MODEL_b25d1876d9504dc2b0ab0cdce4dd1545", + "value": " 38.2M/38.2M [00:00<00:00, 191MB/s]" + } + }, + "ac278d22afd8443ba318472ee187b9ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7da52b5a12eb4e22939cab415d177fdf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f33bb1bb79af4929beee2fd8ac8e1762": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4b17c47b96a54844bf5e197d0cf497a2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1f52b1d75d2b429b957f14dc74919e60": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "235f72da403d40138566ee21c219d3a3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b25d1876d9504dc2b0ab0cdce4dd1545": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b57b52f00850496e8def6847da587a40": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7dff2ef63de54684b7b61ae037d051b1", + "IPY_MODEL_b15f4b8f28094b0cab0da27ed817e261", + "IPY_MODEL_49baa628d8b4481ba6dac63b13e80cd6" + ], + "layout": "IPY_MODEL_7619a6b05a5643158620b12646757974" + } + }, + "7dff2ef63de54684b7b61ae037d051b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b3283fd17387482f9f127a8ff8089f23", + "placeholder": "​", + "style": "IPY_MODEL_08eece15f66b4367825ec48c7e3961cb", + "value": "Generating train split: 100%" + } + }, + "b15f4b8f28094b0cab0da27ed817e261": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c49366b385fa41b083bfb208d54add54", + "max": 68686, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d4e5d57774cf4c9caa352a1ada066fab", + "value": 68686 + } + }, + "49baa628d8b4481ba6dac63b13e80cd6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_dfa1df1b47d647a3a4385b901ed58f57", + "placeholder": "​", + "style": "IPY_MODEL_6e3ec422ca96449b81f7358fe050b380", + "value": " 68686/68686 [00:00<00:00, 118058.07 examples/s]" + } + }, + "7619a6b05a5643158620b12646757974": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b3283fd17387482f9f127a8ff8089f23": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "08eece15f66b4367825ec48c7e3961cb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c49366b385fa41b083bfb208d54add54": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d4e5d57774cf4c9caa352a1ada066fab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "dfa1df1b47d647a3a4385b901ed58f57": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6e3ec422ca96449b81f7358fe050b380": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "abdbeadfb7f24651967c24fedd7b0f2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_250587f17d6845ebbee21a51597382b2", + "IPY_MODEL_2197baef18b84247a61bd69563cbb695", + "IPY_MODEL_843fe7d70a2c4085beb423d355aeb472" + ], + "layout": "IPY_MODEL_a1fa450ee45f44dcbe67b73cfa56df3b" + } + }, + "250587f17d6845ebbee21a51597382b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_05811e6740f44784a58660daa042a371", + "placeholder": "​", + "style": "IPY_MODEL_fdfc87dd989c4f39948610991bd7b5d3", + "value": "Generating test split: 100%" + } + }, + "2197baef18b84247a61bd69563cbb695": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ec238c8a4a624904a8629adc272bdf15", + "max": 7632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e97dcacab83d4b968bae440040e1513b", + "value": 7632 + } + }, + "843fe7d70a2c4085beb423d355aeb472": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_46e1156b616243cabf185557950e5f07", + "placeholder": "​", + "style": "IPY_MODEL_896090ab3ee442f3b04339560948b222", + "value": " 7632/7632 [00:00<00:00, 103292.38 examples/s]" + } + }, + "a1fa450ee45f44dcbe67b73cfa56df3b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "05811e6740f44784a58660daa042a371": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fdfc87dd989c4f39948610991bd7b5d3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ec238c8a4a624904a8629adc272bdf15": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e97dcacab83d4b968bae440040e1513b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "46e1156b616243cabf185557950e5f07": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "896090ab3ee442f3b04339560948b222": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb new file mode 100644 index 0000000..a71ec61 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_GRPO.ipynb @@ -0,0 +1,5531 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": "#@title Colab Extra Install { display-mode: \"form\" }\n%%capture\nimport os\n!pip install --upgrade -qqq uv\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n # If you're not in Colab, just use pip install!\n !pip install unsloth vllm\nelse:\n try: import numpy, PIL; _numpy = f'numpy=={numpy.__version__}'; _pil = f'pillow=={PIL.__version__}'\n except: _numpy = \"numpy\"; _pil = \"pillow\"\n try: import subprocess; is_t4 = \"Tesla T4\" in str(subprocess.check_output([\"nvidia-smi\"]))\n except: is_t4 = False\n _vllm, _triton = ('vllm==0.9.2', 'triton==3.2.0') if is_t4 else ('vllm==0.15.1', 'triton')\n !uv pip install -qqq --upgrade {_vllm} {_numpy} {_pil} torchvision bitsandbytes xformers unsloth\n !uv pip install -qqq {_triton}\n!uv pip install transformers==4.56.2\n!uv pip install --no-deps trl==0.22.2" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Goal: Make faster kernels with Reinforcement Learning\n", + "\n", + "Our goal is to make a faster matrix multiplication kernel by doing RL on Gemma 4 with Unsloth.\n", + "\n", + "\n", + "\n", + "You will learn how to:\n", + "1. Counteract **reward hacking** like cheating, caching, laziness.\n", + "2. Timing and correctness of kernels and time limits.\n", + "3. Making good **reward functions**\n", + "4. How to seriously do RL to make optimized kernels" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from unsloth import FastVisionModel\n", + "import torch\n", + "max_seq_length = 4096 # Can increase for longer reasoning traces\n", + "lora_rank = 32 # Larger rank = smarter, but slower\n", + "\n", + "gemma4_models = [\n", + " # Gemma-4 instruct models:\n", + " \"unsloth/gemma-4-E2B-it\",\n", + " \"unsloth/gemma-4-E4B-it\",\n", + " \"unsloth/gemma-4-31B-it\",\n", + " \"unsloth/gemma-4-26B-A4B-it\",\n", + " # Gemma-4 base models:\n", + " \"unsloth/gemma-4-E2B\",\n", + " \"unsloth/gemma-4-E4B\",\n", + " \"unsloth/gemma-4-31B\",\n", + " \"unsloth/gemma-4-26B-A4B\",\n", + "] # More models at https://huggingface.co/unsloth\n", + "\n", + "model, tokenizer = FastVisionModel.from_pretrained(\n", + " model_name = \"unsloth/gemma-4-E2B-it\",\n", + " max_seq_length = max_seq_length,\n", + " load_in_4bit = False, # False for LoRA 16bit\n", + " fast_inference = False, # Enable vllm fast inference\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now add some small amount of LoRA weights to Gemma 4 so we only need to train those, instead of training on the full model." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "model = FastVisionModel.get_peft_model(\n", + " model,\n", + " r = lora_rank, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128\n", + " target_modules = [\n", + " \"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", + " \"gate_proj\", \"up_proj\", \"down_proj\",\n", + " ],\n", + " lora_alpha = lora_rank*2, # *2 speeds up training\n", + " use_gradient_checkpointing = \"unsloth\", # Reduces memory usage\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Optimized matrix multiplication\n", + "\n", + "Numpy has optimized matrix multiplication kernels for CPUs via BLAS optimized operations. For GPUs, one can use CUDA accelerated cuBLAS kernels which PyTorch calls under the hood.\n", + "\n", + "To generate some random matrices to do matrix multiplication, we can do the below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "def generate_random_matrices(seed = 3407, n = 256):\n", + " random_state = np.random.RandomState(seed)\n", + " n, k, m = random_state.randint(1, n+1, size = 3)\n", + " A = np.random.uniform(-10, 10, size = (n, k))\n", + " B = np.random.uniform(-10, 10, size = (k, m))\n", + " return A, A.tolist(), B, B.tolist()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We shall generate a small matrix, and see the matrix multiplied output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-2.8313286 4.54613909 -7.95265309 6.53459836 2.87235103]\n", + " [ 7.0739631 3.76278879 9.31565599 -8.52884711 9.96832952]\n", + " [ 8.41214082 6.51136046 -3.79347975 -2.46773693 -2.32292989]\n", + " [ 3.91302932 4.98335304 -5.33855089 5.71057634 -2.79871647]]\n", + "[[ 0.39218774 -9.6181377 -3.49736707]\n", + " [-0.33354865 -1.05626139 3.87231208]\n", + " [ 0.49494174 5.91863954 -6.83183693]\n", + " [ 5.1465162 -7.51648113 1.00445384]\n", + " [ 9.63213377 -4.92327556 3.323014 ]]\n", + "[[ 54.73441488 -87.89725072 97.94605887]\n", + " [ 58.25238906 -1.8467447 -49.25453031]\n", + " [ -35.82528794 -80.25394462 11.51225408]\n", + " [ -0.33785799 -103.64132345 38.51974367]]\n" + ] + } + ], + "source": [ + "A, A_list, B, B_list = generate_random_matrices(seed = 42, n = 5)\n", + "print(A)\n", + "print(B)\n", + "print(np.matmul(A, B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can call a LLM to generate a simple matrix multiply kernel in Python only, and we can calculate the differences between the actual result and the kernel's result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_difference(pred, real):\n", + " if pred is None: return 5, 5\n", + " assert real is not None\n", + " import numpy as np\n", + " try:\n", + " difference = pred - real\n", + " except:\n", + " return 5, 5\n", + " amax_error = float(np.amax(difference))\n", + " mse_error = float(np.mean(np.square(difference)))\n", + " return amax_error, mse_error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Kernel generated by GPT-5\n", + "def matmul(A, B):\n", + " z, s = zip, sum\n", + " Bt = list(z(*B))\n", + " return [[s(a*b for a, b in z(row, col)) for col in Bt] for row in A]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see the error below is very small, so that's good!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(7.105427357601002e-15, 4.6783406255758477e-29)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prediction = matmul(A_list, B_list)\n", + "calculate_difference(prediction, np.matmul(A, B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Countering Reward Hacking\n", + "\n", + "The ultimate goal of RL is to maximize some reward (say speed, revenue, some metric).\n", + "\n", + "But RL can **cheat** When the RL algorithm learns a trick or exploits something to increase the reward, without actually doing the task at end, this is called \"Reward Hacking\".\n", + "\n", + "Some good examples are in https://en.wikipedia.org/wiki/Reward_hacking\n", + "\n", + "For matrix multiplication kernels, we might see the following issues:\n", + "\n", + "* Laziness: RL learns to use Numpy, Torch, other libraries, which calls optimized kernels.\n", + "* Caching: RL learns to cache the result of the output\n", + "* Cheating: RL learns to find the actual output by inspecting Python global variables\n", + "* RL learns to edit the timing function to make it output 0 time as passed.\n", + "\n", + "And possibly more. We shall try to address each!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Countering Reward Hacking 1: Stop laziness\n", + "We can stop the RL algorithm from calling optimized code by inspecting if the generated code imports other non standard Python libraries. We used GPT-5 to help generate this check `check_only_stdlib_imports`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title (Collapsible code)\n", + "import ast\n", + "import sys\n", + "import sysconfig\n", + "from pathlib import Path\n", + "\n", + "def _stdlib_names():\n", + " \"\"\"\n", + " Build a set of canonical stdlib top-level module/package names.\n", + " Uses sys.stdlib_module_names when available (3.10+), with a\n", + " filesystem fallback for older versions/edge cases.\n", + " \"\"\"\n", + " names = {m.lower() for m in getattr(sys, \"stdlib_module_names\", set())}\n", + " names |= {m.lower() for m in sys.builtin_module_names}\n", + " names.add(\"__future__\") # special-case\n", + "\n", + " # Fallback/augmentation: scan the stdlib directory\n", + " try:\n", + " stdlib_dir = Path(sysconfig.get_path(\"stdlib\"))\n", + " if stdlib_dir.exists():\n", + " for p in stdlib_dir.iterdir():\n", + " if p.name == \"site-packages\":\n", + " continue\n", + " if p.suffix == \".py\":\n", + " names.add(p.stem.lower())\n", + " elif p.is_dir() and (p / \"__init__.py\").exists():\n", + " names.add(p.name.lower())\n", + " except Exception:\n", + " # conservative fallback; the names set above will still work well\n", + " pass\n", + "\n", + " return names\n", + "\n", + "_STDLIB_SET = _stdlib_names()\n", + "\n", + "def check_only_stdlib_imports(code: str):\n", + " \"\"\"\n", + " Return (ok: bool, details: dict)\n", + "\n", + " ok == True -> all absolute imports are from the stdlib.\n", + " ok == False -> details['non_stdlib'] lists offending top-level modules.\n", + "\n", + " details includes:\n", + " - stdlib: sorted list of stdlib imports found\n", + " - non_stdlib: sorted list of non-stdlib imports found\n", + " - relative_imports: count of relative imports (always allowed here)\n", + " \"\"\"\n", + " try:\n", + " tree = ast.parse(code)\n", + " except SyntaxError as e:\n", + " return False, {\n", + " \"error\": f\"SyntaxError: {e}\",\n", + " \"stdlib\": [],\n", + " \"non_stdlib\": [],\n", + " \"relative_imports\": 0,\n", + " }\n", + "\n", + " abs_imports = set()\n", + " relative_count = 0\n", + "\n", + " class Visitor(ast.NodeVisitor):\n", + " def visit_Import(self, node: ast.Import):\n", + " for alias in node.names:\n", + " abs_imports.add(alias.name.split(\".\")[0])\n", + " def visit_ImportFrom(self, node: ast.ImportFrom):\n", + " nonlocal relative_count\n", + " if (node.level or 0) > 0:\n", + " # relative import\n", + " relative_count += 1\n", + " else:\n", + " if node.module:\n", + " abs_imports.add(node.module.split(\".\")[0])\n", + "\n", + " Visitor().visit(tree)\n", + "\n", + " stdlib_found = sorted(m for m in abs_imports if m.lower() in _STDLIB_SET)\n", + " non_stdlib = sorted(m for m in abs_imports if m.lower() not in _STDLIB_SET)\n", + "\n", + " return len(non_stdlib) == 0, {\n", + " \"stdlib\": stdlib_found,\n", + " \"non_stdlib\": non_stdlib,\n", + " \"relative_imports\": relative_count,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example, let's call `check_only_stdlib_imports` on a random piece of matrix multiplication code generated by GPT-5:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Only stdlib imports? False\n", + "{'stdlib': [], 'non_stdlib': ['numpy', 'torch'], 'relative_imports': 0}\n" + ] + } + ], + "source": [ + "sample = \"\"\"\n", + "def matmul(A, B):\n", + " import numpy as np\n", + " from torch import matmul\n", + " z, s = zip, sum\n", + " Bt = list(z(*B))\n", + " return [[s(a*b for a, b in z(row, col)) for col in Bt] for row in A]\n", + "\"\"\"\n", + "ok, info = check_only_stdlib_imports(sample)\n", + "print(\"Only stdlib imports?\", ok)\n", + "print(info)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Countering Reward Hacking 2: Stop cheating\n", + "We can stop the RL algorithm from using global or cached variables by restricting it's `locals` and `globals`.\n", + "\n", + "We are also going to use `exec` to create the function, so we have to save the output to an empty dict.\n", + "\n", + "We also disallow global variable access." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output_function = {}\n", + "exec(sample, {}, output_function)\n", + "output_function[\"matmul\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also disallow global variable access via `types.FunctionType(f.__code__, {})`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success\n", + "name 'np' is not defined\n" + ] + } + ], + "source": [ + "import types\n", + "output_function[\"matmul\"] = types.FunctionType(output_function[\"matmul\"].__code__, {})\n", + "\n", + "def import_numpy():\n", + " np.matmul\n", + " print(\"Success\")\n", + "\n", + "import_numpy()\n", + "import_numpy = types.FunctionType(import_numpy.__code__, {})\n", + "try:\n", + " import_numpy()\n", + "except Exception as e:\n", + " print(str(e))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def create_locked_down_function(function):\n", + " output_function = {}\n", + " exec(function, {}, output_function)\n", + " new_matmul = output_function[\"matmul\"]\n", + " new_matmul = types.FunctionType(new_matmul.__code__, {})\n", + " return new_matmul" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Countering Reward Hacking 3: Stop caching\n", + "We can stop the RL algorithm from using cached data by wiping the cache with a large fake matrix. We also have to benchmark carefully with multiple loops and turns.\n", + "\n", + "We also add a **timer** to not make the algorithm go in an endless loop." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os, gc, time, statistics\n", + "import signal\n", + "from contextlib import contextmanager\n", + "class TimeoutError(Exception): pass\n", + "\n", + "@contextmanager\n", + "def time_limit(seconds):\n", + " def _handler(signum, frame):\n", + " raise TimeoutError(f\"Timed out after {seconds}s\")\n", + " old = signal.signal(signal.SIGALRM, _handler)\n", + " signal.setitimer(signal.ITIMER_REAL, seconds)\n", + " try:\n", + " yield\n", + " finally:\n", + " signal.setitimer(signal.ITIMER_REAL, 0.0)\n", + " signal.signal(signal.SIGALRM, old)\n", + "\n", + "class Benchmarker:\n", + " def __init__(self, trials = 3, loops = 1, timeout = 30):\n", + " self.buffer = np.zeros(2 * 1024 * 1024 * 1024, dtype = np.uint8)\n", + " self.trials = trials\n", + " self.loops = loops\n", + " assert timeout > 0 # Cannot be 0 since it won't work!\n", + " self.timeout = timeout\n", + " def thrash(self):\n", + " # Edit the buffer to wipe cache lines\n", + " self.buffer ^= 1\n", + " return int(self.buffer[::4096].sum())\n", + "\n", + " def benchmark(self, function, arguments):\n", + " assert len(arguments) == self.loops\n", + " samples = []\n", + " exceptions = []\n", + " timed_out = 0\n", + " for _ in range(self.trials):\n", + " gc.collect(); gc.disable(); self.thrash()\n", + " t_start = time.perf_counter_ns()\n", + " for i in range(self.loops):\n", + " try:\n", + " with time_limit(self.timeout):\n", + " function(*arguments[i])\n", + " except TimeoutError as e:\n", + " timed_out += 1\n", + " except Exception as e:\n", + " exceptions.append(str(e))\n", + " t_end = time.perf_counter_ns()\n", + " gc.enable()\n", + " samples.append((t_end - t_start) // max(1, self.loops))\n", + " return {\n", + " \"median_ns\": int(statistics.median(samples)),\n", + " \"mean_ns\": int(statistics.fmean(samples)),\n", + " \"stdev_ns\": int(statistics.pstdev(samples) if len(samples) > 1 else 0),\n", + " \"exceptions\" : exceptions,\n", + " \"timeouts\" : timed_out,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example we use our matmul kernel we had, and benchmark it with a 10 second delay:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'median_ns': 70895404,\n", + " 'mean_ns': 70895404,\n", + " 'stdev_ns': 0,\n", + " 'exceptions': [],\n", + " 'timeouts': 0}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A, A_list, B, B_list = generate_random_matrices(seed = 0, n = 256)\n", + "Benchmarker(trials = 1, timeout = 10).benchmark(output_function[\"matmul\"], [(A_list, B_list)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data & RL task setup\n", + "\n", + "We now have to create a prompt to the model for which it will do some task. For our matrix multiply example, we use the below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Create a new fast matrix multiplication function using only native Python code.\n", + "You are given a list of list of numbers.\n", + "Output your new function in backticks using the format below:\n", + "```python\n", + "def matmul(A, B):\n", + " return ...\n", + "```\n" + ] + } + ], + "source": [ + "prompt = \"\"\"\n", + "Create a new fast matrix multiplication function using only native Python code.\n", + "You are given a list of list of numbers.\n", + "Output your new function in backticks using the format below:\n", + "```python\n", + "def matmul(A, B):\n", + " return ...\n", + "```\n", + "\"\"\".strip()\n", + "print(prompt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, let's prompt Gemma 4 without RL and see how it goes:" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "print(\"=\" * 50)\n", + "print(\"BASE MODEL OUTPUT (before RL training):\")\n", + "print(\"=\" * 50)\n", + "\n", + "inputs = tokenizer(\n", + " text = text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "text_streamer = TextStreamer(tokenizer, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 512,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reward functions\n", + "\n", + "We now design the `extract_function` function which simply extracts the function wrapped in 3 backticks.\n", + "\n", + "And 4 reward functions:\n", + "\n", + "1. `function_works` which rewards the model if the strategy is a valid Python function.\n", + "2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it.\n", + "3. `correctness_check` which checks if the kernel was correct or wrong - it shouldn't generate gibberish!\n", + "4. `speed_check` checks the performance relative to Numpy matmul directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def matmul(A, B):\n", + " return ...\n" + ] + } + ], + "source": [ + "def extract_function(text):\n", + " if text.count(\"```\") >= 2:\n", + " first = text.find(\"```\") + 3\n", + " second = text.find(\"```\", first)\n", + " fx = text[first : second].strip()\n", + " fx = fx.removeprefix(\"python\\n\")\n", + " fx = fx[fx.find(\"def\"):]\n", + " if fx.startswith(\"def matmul(A, B):\"): return fx\n", + " return None\n", + "print(extract_function(prompt))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below is our `function_works` reward function which uses Python's `exec` but guarded by not allowing leakage of local and global variables. We can also use `check_only_stdlib_imports` first to check if there are errors before even executing the function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(False,\n", + " {'error': \"SyntaxError: expected '(' (, line 1)\",\n", + " 'stdlib': [],\n", + " 'non_stdlib': [],\n", + " 'relative_imports': 0})" + ], + "text/html": [ + "
(False,\n",
+       " {'error': "SyntaxError: expected '(' (<unknown>, line 1)",\n",
+       "  'stdlib': [],\n",
+       "  'non_stdlib': [],\n",
+       "  'relative_imports': 0})
" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ok, info = check_only_stdlib_imports(\"def a\")\n", + "ok, info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def function_works(completions, **kwargs):\n", + " scores = []\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " print(function)\n", + " if function is not None:\n", + " ok, info = check_only_stdlib_imports(function)\n", + " if function is None or \"error\" in info:\n", + " score = -2.0\n", + " else:\n", + " try:\n", + " new_matmul = create_locked_down_function(function)\n", + " score = 1.0\n", + " except:\n", + " score = -0.5\n", + " scores.append(score)\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`no_cheating` checks if the function cheated since it might have imported Numpy or Torch optimized code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def no_cheating(completions, **kwargs):\n", + " scores = []\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if function is not None:\n", + " ok, info = check_only_stdlib_imports(function)\n", + " else:\n", + " ok = False\n", + " scores.append(1.0 if ok else -20.0) # Penalize heavily!\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next `correctness_check` checks if the kernel was correct. We want to penalize if the absolute error is larger than 1, and if the mean squared error is somewhat bigger then machine epsilon.\n", + "\n", + "We have to execute the code now!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(2.220446049250313e-16)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.finfo(np.float64).eps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def correctness_check(completions, **kwargs):\n", + " scores = []\n", + " # Generate some random matrices of size less than 128\n", + " A, A_list, B, B_list = generate_random_matrices(seed = np.random.randint(10000), n = 128)\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if function is not None:\n", + " ok, info = check_only_stdlib_imports(function)\n", + " if function is None or \"error\" in info:\n", + " scores.append(0)\n", + " continue\n", + " try:\n", + " new_matmul = create_locked_down_function(function)\n", + " except:\n", + " scores.append(0)\n", + " continue\n", + " try:\n", + " pred = new_matmul(A_list.copy(), B_list.copy())\n", + " except:\n", + " # Failed!\n", + " scores.append(-2.0)\n", + " continue\n", + " true = np.matmul(A, B)\n", + " amax_error, mse_error = calculate_difference(pred, true)\n", + "\n", + " # Check correctness and score!\n", + " machine_epsilon = 100*np.finfo(np.float64).eps\n", + " if amax_error >= 3: score = -3.0\n", + " elif amax_error >= 2: score = -2.5\n", + " elif amax_error >= 1: score = -2.0\n", + " elif amax_error >= 0.5: score = -1.0\n", + " elif amax_error >= 100*machine_epsilon: score = 0.0\n", + " elif amax_error >= machine_epsilon: score = 1.0\n", + " else: score = 3.0\n", + "\n", + " if mse_error >= 3: score += -3.0\n", + " elif mse_error >= 2: score += -2.5\n", + " elif mse_error >= 1: score += -2.0\n", + " elif mse_error >= 0.5: score += -1.0\n", + " elif mse_error >= 100*machine_epsilon: score += 0.0\n", + " elif mse_error >= machine_epsilon: score += 1.0\n", + " else: score += 3.0\n", + " scores.append(score)\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally our benchmarking function for `speed_check`! We shall limit the timer to 10 seconds and do 3 trials." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'median_ns': 205566,\n", + " 'mean_ns': 231173,\n", + " 'stdev_ns': 39247,\n", + " 'exceptions': [],\n", + " 'timeouts': 0}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A, A_list, B, B_list = generate_random_matrices(seed = 0, n = 256)\n", + "benchmarker = Benchmarker(trials = 3, timeout = 10)\n", + "numpy_results = benchmarker.benchmark(np.matmul, [(A, B)])\n", + "numpy_results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'median_ns': 84237,\n", + " 'mean_ns': 87442,\n", + " 'stdev_ns': 4538,\n", + " 'exceptions': [],\n", + " 'timeouts': 0}" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_matmul = create_locked_down_function(extract_function(prompt))\n", + "new_results = benchmarker.benchmark(new_matmul, [(A_list, B_list)])\n", + "new_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can take the difference and do a negative sign for slower ones. If the ratio is less than 1 (ie faster, we shall invert it!)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.02440329071548132" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "negative = -(new_results[\"median_ns\"] / numpy_results[\"median_ns\"]) / 100\n", + "positive = +(numpy_results[\"median_ns\"] / new_results[\"median_ns\"]) / 100\n", + "reward = negative if new_results[\"median_ns\"] >= numpy_results[\"median_ns\"] else positive\n", + "reward" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.333333333333333" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_results[\"median_ns\"] = 3\n", + "numpy_results[\"median_ns\"] = 1000\n", + "negative = -(new_results[\"median_ns\"] / numpy_results[\"median_ns\"]) / 100\n", + "positive = +(numpy_results[\"median_ns\"] / new_results[\"median_ns\"]) / 100\n", + "reward = negative if new_results[\"median_ns\"] >= numpy_results[\"median_ns\"] else positive\n", + "reward" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import gc\n", + "def speed_check(completions, **kwargs):\n", + " scores = []\n", + " # Generate some random matrices of size less than 256\n", + " A, A_list, B, B_list = generate_random_matrices(seed = np.random.randint(10000), n = 256)\n", + " numpy_results = benchmarker.benchmark(np.matmul, [(A, B)])\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if function is not None:\n", + " ok, info = check_only_stdlib_imports(function)\n", + " if function is None or \"error\" in info:\n", + " scores.append(0)\n", + " continue\n", + " try:\n", + " new_matmul = create_locked_down_function(function)\n", + " except:\n", + " scores.append(0)\n", + " continue\n", + " new_results = benchmarker.benchmark(new_matmul, [(A_list.copy(), B_list.copy())])\n", + "\n", + " # Get score and clip to -10, 10\n", + " negative = -(new_results[\"median_ns\"] / numpy_results[\"median_ns\"]) / 100\n", + " positive = +(numpy_results[\"median_ns\"] / new_results[\"median_ns\"]) / 100\n", + " score = negative if new_results[\"median_ns\"] >= numpy_results[\"median_ns\"] else positive\n", + " if score >= 10: score = 10\n", + " if score <= -10: score = -10\n", + " scores.append(score)\n", + " # Free memory to counteract OOMs\n", + " gc.collect()\n", + " torch.cuda.empty_cache()\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create the dataset which includes a replica of our prompt." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from datasets import Dataset\n", + "dataset = Dataset.from_list([{\"prompt\" : [{\"role\": \"user\", \"content\": prompt.strip()}], \"answer\" : 0}]*1000)\n", + "maximum_length = len(tokenizer.apply_chat_template([{\"role\":\"user\", \"content\":prompt.strip()}], add_generation_prompt = True, tokenize = True))\n", + "print(maximum_length)\n", + "dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Train the model\n", + "\n", + "Now set up GRPO Trainer and all configurations! We also support GSDP, GAPO, Dr GRPO and more! Go to our docs https://unsloth.ai/docs/ for more info!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Leave room for the prompt (plus 1 token safety margin)\n", + "max_completion_length = max_seq_length - (maximum_length + 1)\n", + "\n", + "from trl import GRPOConfig, GRPOTrainer\n", + "training_args = GRPOConfig(\n", + " temperature = 1.0,\n", + " top_p = 0.95,\n", + " top_k = 64,\n", + " learning_rate = 5e-5,\n", + " weight_decay = 0.001,\n", + " warmup_ratio = 0.1,\n", + " lr_scheduler_type = \"linear\",\n", + " optim = \"adamw_8bit\",\n", + " logging_steps = 1,\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 2, # Increase to 4 for smoother training\n", + " num_generations = 2, # Decrease if out of memory\n", + " max_completion_length = max_completion_length,\n", + " # num_train_epochs = 1, # Set to 1 for a full training run\n", + " max_steps = 100,\n", + " save_steps = 100,\n", + " report_to = \"none\", # Can use Weights & Biases, TrackIO\n", + " output_dir = \"outputs\",\n", + " epsilon = 0.2,\n", + " epsilon_high = 0.28, # one sided\n", + " delta = 1.5, # two sided\n", + " loss_type = 'bnpo',\n", + " mask_truncated_completions = True\n", + " # For optional training + evaluation\n", + " # fp16_full_eval = True,\n", + " # per_device_eval_batch_size = 4,\n", + " # eval_accumulation_steps = 1,\n", + " # eval_strategy = \"steps\",\n", + " # eval_steps = 1,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase!\n", + "\n", + "You might have to wait 150 to 200 steps for any action. You'll probably get 0 reward for the first 100 steps. Please be patient!\n", + "\n", + "| Step | Training Loss | reward | reward_std | completion_length | kl |\n", + "|------|---------------|-----------|------------|-------------------|----------|\n", + "| 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 |\n", + "| 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 |\n", + "| 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# For optional training + evaluation\n", + "# new_dataset = dataset.train_test_split(test_size = 0.01)\n", + "\n", + "trainer = GRPOTrainer(\n", + " model = model,\n", + " processing_class = tokenizer,\n", + " reward_funcs = [\n", + " function_works,\n", + " no_cheating,\n", + " correctness_check,\n", + " speed_check,\n", + " ],\n", + " args = training_args,\n", + " train_dataset = dataset,\n", + "\n", + " # For optional training + evaluation\n", + " # train_dataset = new_dataset[\"train\"],\n", + " # eval_dataset = new_dataset[\"test\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's train the model!\n", + "\n", + "**NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 199998}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 1,000 | Num Epochs = 1 | Total steps = 100\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 1\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 1 x 1) = 2\n", + " \"-____-\" Trainable parameters = 1,990,656 of 20,916,747,840 (0.01% trained)\n", + "`generation_config` default values have been modified to match model-specific defaults: {'max_length': 131072}. If this is not desired, please set these values explicitly.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def matmul(A, B):\n", + " \"\"\"\n", + " Fast matrix multiplication using only native Python code.\n", + " \n", + " Parameters\n", + " ----------\n", + " A : list of list of numbers\n", + " Left matrix of dimensions (m x p).\n", + " B : list of list of numbers\n", + " Right matrix of dimensions (p x n).\n", + " \n", + " Returns\n", + " -------\n", + " C : list of list of numbers\n", + " Resulting matrix of dimensions (m x n) such that C = A × B.\n", + " \"\"\"\n", + " # Transpose B to allow column access as rows.\n", + " Bt = list(zip(*B))\n", + " # Compute the dot product of each row from A with each column from B\n", + " return [[sum(a * b for a, b in zip(row, col))\n", + " for col in Bt]\n", + " for row in A]\n", + "def matmul(A, B):\n", + " return ...\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [100/100 1:36:19, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Lossrewardreward_stdcompletions / mean_lengthcompletions / min_lengthcompletions / max_lengthcompletions / clipped_ratiocompletions / mean_terminated_lengthcompletions / min_terminated_lengthcompletions / max_terminated_lengthklrewards / function_works / meanrewards / function_works / stdrewards / no_cheating / meanrewards / no_cheating / stdrewards / correctness_check / meanrewards / correctness_check / stdrewards / speed_check / meanrewards / speed_check / std
10.000000-0.9605324.244743536.000000392.000000680.0000000.000000536.000000392.000000680.0000000.0027981.0000000.0000001.0000000.000000-1.0000007.071068-1.9605322.826324
20.000000-11.50460114.842735718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000834-0.5000002.121320-9.50000014.8492422.0000002.828427-3.5046014.956255
30.000000-1.2327683.847022718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0006911.0000000.0000001.0000000.000000-1.0000007.071068-2.2327683.224046
40.000000-9.11239118.225832541.000000364.000000718.0000000.500000364.000000364.000000364.0000000.004645-0.5000002.121320-9.50000014.8492422.0000002.828427-1.1123911.573158
50.0000001.9825230.584465503.000000352.000000654.0000000.000000503.000000352.000000654.0000000.0042411.0000000.0000001.0000000.0000004.0000000.000000-4.0174770.584465
60.000000-8.95949018.442066629.500000541.000000718.0000000.500000541.000000541.000000541.0000000.002716-0.5000002.121320-9.50000014.8492422.0000002.828427-0.9594901.356924
70.0000005.5170080.094176440.500000394.000000487.0000000.000000440.500000394.000000487.0000000.0017691.0000000.0000001.0000000.0000004.0000000.000000-0.4829920.094176
80.000000-9.26346518.012180718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000987-0.5000002.121320-9.50000014.8492422.0000002.828427-1.2634651.786810
90.000000-13.00000012.727922586.000000454.000000718.0000000.500000454.000000454.000000454.0000000.002943-0.5000002.121320-9.50000014.8492422.0000002.828427-5.0000007.071068
100.000000-3.9856780.000226635.500000553.000000718.0000000.500000553.000000553.000000553.0000000.0018141.0000000.0000001.0000000.000000-6.0000000.0000000.0143220.000225
110.000000-8.36670019.280397718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001235-0.5000002.121320-9.50000014.8492422.0000002.828427-0.3667000.518593
120.000000-9.32722217.922014718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000735-0.5000002.121320-9.50000014.8492422.0000002.828427-1.3272221.876975
130.000000-12.98925012.743125718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001106-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0107500.015203
140.0000001.7855222.598972640.500000563.000000718.0000000.500000563.000000563.000000563.0000000.0032061.0000000.0000001.0000000.0000001.0000004.242640-1.2144781.643669
150.000000-9.01898118.357933603.000000488.000000718.0000000.500000488.000000488.000000488.0000000.006529-0.5000002.121320-9.50000014.8492422.0000002.828427-1.0189811.441056
160.000000-3.9852480.000232718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0006251.0000000.0000001.0000000.000000-6.0000000.0000000.0147520.000231
170.000000-8.49668819.096567625.500000533.000000718.0000000.500000533.000000533.000000533.0000000.003519-0.5000002.121320-9.50000014.8492422.0000002.828427-0.4966880.702423
180.000000-12.98532912.748671718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001027-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0146710.020748
190.000000-1.1731723.936521718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0010251.0000000.0000001.0000000.000000-1.0000007.071068-2.1731723.134547
200.000000-2.0000000.000000391.000000297.000000485.0000000.000000391.000000297.000000485.0000000.0050211.0000000.0000001.0000000.0000006.0000000.000000-10.0000000.000000
210.000000-0.3879585.063533593.500000469.000000718.0000000.500000469.000000469.000000469.0000000.0042641.0000000.0000001.0000000.000000-1.0000007.071068-1.3879582.007535
220.000000-12.99263412.738339524.500000331.000000718.0000000.500000331.000000331.000000331.0000000.005515-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0073660.010417
230.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000955-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
240.000000-12.98972912.742447635.000000552.000000718.0000000.500000552.000000552.000000552.0000000.002888-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0102710.014526
250.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001271-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
260.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001055-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
270.000000-9.10578218.235178534.000000350.000000718.0000000.500000350.000000350.000000350.0000000.021608-0.5000002.121320-9.50000014.8492422.0000002.828427-1.1057821.563811
280.0000002.7928983.932606645.500000573.000000718.0000000.500000573.000000573.000000573.0000000.0068351.0000000.0000001.0000000.0000001.0000004.242640-0.2071020.310035
290.000000-3.9702440.000759616.500000515.000000718.0000000.500000515.000000515.000000515.0000000.0116461.0000000.0000001.0000000.000000-6.0000000.0000000.0297560.000759
300.000000-12.97788912.759192718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001129-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0221110.031270
310.000000-12.98309512.751829586.500000455.000000718.0000000.500000455.000000455.000000455.0000000.032435-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0169050.023908
320.000000-8.08334719.681118718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001218-0.5000002.121320-9.50000014.8492422.0000002.828427-0.0833470.117870
330.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001185-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
340.000000-4.0000000.000000577.500000477.000000678.0000000.000000577.500000477.000000678.0000000.0215511.0000000.0000001.0000000.0000004.0000000.000000-10.0000000.000000
35-0.0000003.2141730.016615609.500000577.000000642.0000000.000000609.500000577.000000642.0000000.0049371.0000000.0000001.0000000.0000004.0000000.000000-2.7858270.016615
360.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001002-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
370.000000-8.40564319.225323691.000000664.000000718.0000000.500000664.000000664.000000664.0000000.001766-0.5000002.121320-9.50000014.8492422.0000002.828427-0.4056430.573666
380.0000002.5101880.017700601.000000541.000000661.0000000.000000601.000000541.000000661.0000000.0068951.0000000.0000001.0000000.0000004.0000000.000000-3.4898120.017700
390.0000001.1439301.851457676.000000634.000000718.0000000.500000634.000000634.000000634.0000000.0033301.0000000.0000001.0000000.0000001.0000004.242640-1.8560702.391184
400.0000000.3059450.040185385.500000260.000000511.0000000.000000385.500000260.000000511.0000000.0219961.0000000.0000001.0000000.0000004.0000000.000000-5.6940550.040185
410.000000-2.3859270.019569435.000000378.000000492.0000000.000000435.000000378.000000492.0000000.0040621.0000000.0000001.0000000.0000004.0000000.000000-8.3859270.019569
420.000000-3.9649930.000042625.000000532.000000718.0000000.500000532.000000532.000000532.0000000.0075711.0000000.0000001.0000000.000000-6.0000000.0000000.0350070.000042
430.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001561-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
440.000000-3.9565340.000491718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0011981.0000000.0000001.0000000.000000-6.0000000.0000000.0434660.000490
450.000000-3.9730950.000793718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0013381.0000000.0000001.0000000.000000-6.0000000.0000000.0269040.000793
460.000000-3.9761560.033721718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0011701.0000000.0000001.0000000.000000-1.0000007.071068-4.9761567.104789
470.000000-0.7798470.030023598.000000478.000000718.0000000.500000478.000000478.000000478.0000000.0037631.0000000.0000001.0000000.0000004.0000000.000000-6.7798470.030023
480.000000-0.4001165.054048587.000000544.000000630.0000000.000000587.000000544.000000630.0000000.0024841.0000000.0000001.0000000.000000-1.0000007.071068-1.4001162.017020
490.000000-0.3437055.124783487.000000256.000000718.0000000.500000256.000000256.000000256.0000000.0205601.0000000.0000001.0000000.000000-1.0000007.071068-1.3437061.946285
500.0000000.3490976.115803524.000000330.000000718.0000000.500000330.000000330.000000330.0000000.0115211.0000000.0000001.0000000.000000-1.0000007.071068-0.6509030.955265
510.000000-3.9599160.001149718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0013241.0000000.0000001.0000000.000000-6.0000000.0000000.0400840.001149
520.000000-0.3867215.073168651.000000584.000000718.0000000.500000584.000000584.000000584.0000000.0041811.0000000.0000001.0000000.000000-1.0000007.071068-1.3867211.997900
530.000000-12.98180712.753652718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001321-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0181940.025730
540.000000-3.9624460.002950718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0012481.0000000.0000001.0000000.000000-6.0000000.0000000.0375540.002950
550.000000-8.97693218.417400718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001200-0.5000002.121320-9.50000014.8492422.0000002.828427-0.9769321.381590
560.000000-8.29010819.388716718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000950-0.5000002.121320-9.50000014.8492422.0000002.828427-0.2901080.410275
570.0000001.5581850.646650337.500000222.000000453.0000000.000000337.500000222.000000453.0000000.0082591.0000000.0000001.0000000.0000004.0000000.000000-4.4418150.646650
580.000000-1.9318022.792675718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0010271.0000000.0000001.0000000.0000001.0000004.242640-4.9318027.035316
590.000000-4.0000000.000000674.500000631.000000718.0000000.500000631.000000631.000000631.0000000.0032881.0000000.0000001.0000000.0000004.0000000.000000-10.0000000.000000
600.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001974-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
610.000000-8.84890318.598459673.500000629.000000718.0000000.500000629.000000629.000000629.0000000.001706-0.5000002.121320-9.50000014.8492422.0000002.828427-0.8489031.200530
620.0000004.0908080.014869707.500000697.000000718.0000000.500000697.000000697.000000697.0000000.0009901.0000000.0000001.0000000.0000004.0000000.000000-1.9091920.014869
630.000000-11.09183415.426476678.000000638.000000718.0000000.500000638.000000638.000000638.0000000.002370-0.5000002.121320-9.50000014.8492422.0000002.828427-3.0918344.372514
640.0000000.8162416.788723504.000000398.000000610.0000000.000000504.000000398.000000610.0000000.0090331.0000000.0000001.0000000.000000-1.0000007.071068-0.1837590.282345
650.000000-12.97128512.768532639.500000561.000000718.0000000.500000561.000000561.000000561.0000000.004788-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0287150.040609
660.000000-3.9789780.000921718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0011021.0000000.0000001.0000000.000000-6.0000000.0000000.0210220.000921
670.0000000.5484996.408890718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0009451.0000000.0000001.0000000.000000-1.0000007.071068-0.4515010.662178
680.000000-9.64760417.468925570.500000423.000000718.0000000.500000423.000000423.000000423.0000000.025197-0.5000002.121320-9.50000014.8492422.0000002.828427-1.6476042.330064
690.000000-10.83281115.792789559.500000401.000000718.0000000.500000401.000000401.000000401.0000000.038960-0.5000002.121320-9.50000014.8492422.0000002.828427-2.8328114.006200
700.000000-22.0000000.000000690.500000663.000000718.0000000.500000663.000000663.000000663.0000000.004275-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
710.000000-12.98364112.751058465.500000213.000000718.0000000.500000213.000000213.000000213.0000000.048212-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0163600.023136
720.000000-12.98583012.747961718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001176-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0141700.020039
730.0001001.2938830.501316506.500000295.000000718.0000000.500000295.000000295.000000295.0000000.0863801.0000000.0000001.0000000.0000004.0000000.000000-4.7061170.501316
740.000000-12.63752213.240543587.000000486.000000688.0000000.000000587.000000486.000000688.0000000.041948-0.5000002.121320-9.50000014.8492422.0000002.828427-4.6375216.558445
750.000000-8.19532119.522764644.000000570.000000718.0000000.500000570.000000570.000000570.0000000.018705-0.5000002.121320-9.50000014.8492422.0000002.828427-0.1953210.276226
760.000000-9.50619717.668905718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001101-0.5000002.121320-9.50000014.8492422.0000002.828427-1.5061972.130084
770.000000-9.08523918.264231641.500000565.000000718.0000000.500000565.000000565.000000565.0000000.038641-0.5000002.121320-9.50000014.8492422.0000002.828427-1.0852401.534761
780.0000004.2897120.292143683.000000648.000000718.0000000.500000648.000000648.000000648.0000000.0088021.0000000.0000001.0000000.0000004.0000000.000000-1.7102880.292143
790.000000-12.98687512.746484718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001148-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0131250.018562
800.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001387-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
810.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.000819-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
820.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001463-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
830.000000-13.00000012.727922662.500000607.000000718.0000000.500000607.000000607.000000607.0000000.027296-0.5000002.121320-9.50000014.8492422.0000002.828427-5.0000007.071068
840.000100-8.06907719.701302584.000000450.000000718.0000000.500000450.000000450.000000450.0000000.104870-0.5000002.121320-9.50000014.8492422.0000002.828427-0.0690760.097689
850.000200-9.36398317.870026569.000000420.000000718.0000000.500000420.000000420.000000420.0000000.166438-0.5000002.121320-9.50000014.8492422.0000002.828427-1.3639831.928963
860.000300-13.00000012.727922527.500000337.000000718.0000000.500000337.000000337.000000337.0000000.278213-0.5000002.121320-9.50000014.8492422.0000002.828427-5.0000007.071068
870.000300-0.1127575.169596457.000000196.000000718.0000000.500000196.000000196.000000196.0000000.3259311.0000000.0000001.0000000.000000-1.0000007.071068-1.1127571.901471
880.000200-3.6348850.447414587.000000456.000000718.0000000.500000456.000000456.000000456.0000000.1997671.0000000.0000001.0000000.000000-1.0000007.071068-4.6348856.623653
890.0004000.8717886.865792508.000000298.000000718.0000000.500000298.000000298.000000298.0000000.3636101.0000000.0000001.0000000.000000-1.0000007.071068-0.1282120.205277
900.000000-4.0429860.094284718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0012591.0000000.0000001.0000000.000000-6.0000000.000000-0.0429860.094284
910.000000-12.98354612.751191718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001957-0.5000002.121320-9.50000014.849242-3.0000004.2426400.0164540.023269
920.000000-9.23971018.045776718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001780-0.5000002.121320-9.50000014.8492422.0000002.828427-1.2397101.753215
930.000300-0.6286194.722605554.000000390.000000718.0000000.500000390.000000390.000000390.0000000.3127741.0000000.0000001.0000000.000000-1.0000007.071068-1.6286192.348463
940.000000-8.35652719.294785692.500000667.000000718.0000000.500000667.000000667.000000667.0000000.015856-0.5000002.121320-9.50000014.8492422.0000002.828427-0.3565270.504206
950.0000000.8195536.786077710.000000702.000000718.0000000.500000702.000000702.000000702.0000000.0022371.0000000.0000001.0000000.000000-1.0000007.071068-0.1804470.284991
960.0000005.8887160.034997718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.0010131.0000000.0000001.0000000.0000004.0000000.000000-0.1112840.034997
970.0004001.6104860.819715558.000000398.000000718.0000000.500000398.000000398.000000398.0000000.3916051.0000000.0000001.0000000.0000004.0000000.000000-4.3895140.819715
980.000300-8.59123618.962856579.000000440.000000718.0000000.500000440.000000440.000000440.0000000.310268-0.5000002.121320-9.50000014.8492422.0000002.828427-0.5912360.836134
990.000000-22.0000000.000000718.000000718.000000718.0000001.0000000.0000000.0000000.0000000.001404-2.0000000.000000-20.0000000.0000000.0000000.0000000.0000000.000000
1000.000100-11.68190614.591989655.000000592.000000718.0000000.500000592.000000592.000000592.0000000.089281-0.5000002.121320-9.50000014.8492422.0000002.828427-3.6819065.207002

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "def matmul(A, B):\n", + " # ensure dimensions\n", + " m = len(A)\n", + " n = len(A[0])\n", + " p = len(B[0]) if B else 0\n", + " return [[sum(A[i][k] * B[k][j] for k in range(n)) for j in range(p)] for i in range(m)]\n", + "None\n", + "def matmul(A, B):\n", + " # A: m x k\n", + " # B: k x n\n", + " # returns m x n\n", + " ...\n", + "def matmul(A, B):\n", + " # A: r x p, B: p x c\n", + " r, p = len(A), len(A[0]) if A else 0\n", + " p2, c = len(B), len(B[0]) if B else 0\n", + " if r == 0 or c == 0 or p != p2:\n", + " raise ValueError(\"Incompatible dimensions for multiplication\")\n", + " # transpose B to improve locality\n", + " B_T = list(zip(*B)) # c x p\n", + " result = [[0] * c for _ in range(r)]\n", + " for i in range(r):\n", + " Ai = A[i]\n", + " Ri = result[i]\n", + " for j, Bj in enumerate(B_T):\n", + " s = 0\n", + " for k in range(p):\n", + " s += Ai[k] * Bj[k]\n", + " Ri[j] = s\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float]]\n", + " Left‑hand matrix with shape m x k.\n", + " B : list[list[float]]\n", + " Right‑hand matrix with shape k x n.\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float]]\n", + " Resulting matrix with shape m x n.\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If dimensions are incompatible.\n", + " \"\"\"\n", + " if not A or not B:\n", + " return []\n", + "\n", + " # Dimensions\n", + " rows_a, cols_a = len(A), len(A[0])\n", + " rows_b, cols_b = len(B), len(B[0])\n", + "\n", + " if cols_a != rows_b:\n", + " raise ValueError(\"Incompatible dimensions for multiplication\")\n", + "\n", + " # Convert B into columns for faster row‑by‑row multiplication\n", + " B_t = [list(col) for col in zip(*B)]\n", + "\n", + " # Compute each row of the result\n", + " result = [\n", + " [sum(a * b for a, b in zip(row_a, col_b)) for col_b in B_t]\n", + " for row_a in A\n", + " ]\n", + "\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"Compute the matrix product of A and B using pure Python.\"\"\"\n", + " # Quick sanity checks\n", + " m, n = len(A), len(A[0])\n", + " p, q = len(B), len(B[0])\n", + " assert n == p, \"Number of columns of A must equal number of rows of B\"\n", + " # Prepare the result matrix with zeros\n", + " result = [[0] * q for _ in range(m)]\n", + " # This variant loops over the outermost index that is likely to be cache-friendly\n", + " # and prefetches the row of B so that we access its elements in order.\n", + " for i in range(m):\n", + " row_a = A[i]\n", + " for k in range(n):\n", + " aik = row_a[k]\n", + " if aik: # skip the zero case to save work\n", + " row_b = B[k]\n", + " for j in range(q):\n", + " result[i][j] += aik * row_b[j]\n", + " return result\n", + "def matmul(A, B):\n", + " m = len(A)\n", + " if m==0: return []\n", + " n = len(A[0]) or 0\n", + " p = len(B[0]) if B else 0\n", + " # ensure B has n rows\n", + " # Use list comprehension summing product over k\n", + " # Compute B transposed for column-wise access: BT = list(zip(*B))\n", + " BT = list(zip(*B))\n", + " return [[sum(a*b for a,b in zip(row,col)) for col in BT] for row in A]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices where each matrix is represented as a list of lists\n", + " and the elements are integers or floats.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[int|float]]\n", + " Left‑hand matrix of size (m × p).\n", + " B : list[list[int|float]]\n", + " Right‑hand matrix of size (p × n).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[int|float]]\n", + " The product matrix C = A @ B of size (m × n).\n", + " \"\"\"\n", + "\n", + " # Dimensions: A: m×p, B: p×n\n", + " m, p = len(A), len(A[0])\n", + " p2, n = len(B), len(B[0])\n", + " if p != p2:\n", + " raise ValueError(\"Inner dimensions must agree for matrix multiplication\")\n", + "\n", + " # Pre‑transpose B so that column access is contiguous\n", + " # This reduces random memory access during the dot product\n", + " B_T = [list(col) for col in zip(*B)]\n", + "\n", + " result = []\n", + " for i, row in enumerate(A):\n", + " # Compute each entry of the i‑th row of the result\n", + " result_row = []\n", + " for j, col in enumerate(B_T):\n", + " # use a local variable for speed\n", + " dot = 0\n", + " for a, b in zip(row, col):\n", + " dot += a * b\n", + " result_row.append(dot)\n", + " result.append(result_row)\n", + "\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using plain Python.\n", + " A: list of lists (m × n), B: list of lists (n × p).\n", + " Returns the product (m × p) as a new list of lists.\n", + " \"\"\"\n", + " if not A or not B:\n", + " return []\n", + "\n", + " m = len(A)\n", + " n = len(A[0])\n", + " p = len(B[0])\n", + "\n", + " # Quick compatibility check\n", + " assert len(B) == n, \"Incompatible matrix dimensions\"\n", + "\n", + " # Allocate result matrix\n", + " result = [[0] * p for _ in range(m)]\n", + "\n", + " # Standard triple‑loop multiplication, with a small speed‑up:\n", + " # pull outer indices, cache row and column values locally,\n", + " # and skip inner loop when the coefficient is zero.\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ri = result[i]\n", + " for k in range(n):\n", + " aik = Ai[k]\n", + " if aik: # skip zero entries\n", + " Bk = B[k]\n", + " for j in range(p):\n", + " Ri[j] += aik * Bk[j]\n", + " return result\n", + "def matmul(A, B):\n", + " # number of rows in A\n", + " m = len(A)\n", + " # number of columns in B\n", + " p = len(B[0]) if B else 0\n", + " # number of columns in A (used as number of rows in B)\n", + " k = len(A[0]) if A else 0\n", + "\n", + " # If shapes are incompatible, raise an error\n", + " if len(B) != k:\n", + " raise ValueError(\"Incompatible matrices: A.shape[1] != B.shape[0]\")\n", + "\n", + " # Result matrix initialised with zeros\n", + " result = [[0] * p for _ in range(m)]\n", + "\n", + " # Triple‑loop multiplication\n", + " for i in range(m):\n", + " for j in range(p):\n", + " # Compute the dot product of row i of A and column j of B\n", + " s = 0\n", + " for t in range(k):\n", + " s += A[i][t] * B[t][j]\n", + " result[i][j] = s\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " # Determine dimensions\n", + " m, n = len(A), len(A[0])\n", + " nB, p = len(B), len(B[0])\n", + " assert n == nB, \"Incompatible matrices\"\n", + " result = [[0]*p for _ in range(m)]\n", + " # Multiply\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " for k in range(n):\n", + " aik = Ai[k]\n", + " if aik:\n", + " Bk = B[k]\n", + " for j in range(p):\n", + " result[i][j] += aik * Bk[j]\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"Fast matrix product using only native Python.\n", + "\n", + " Args:\n", + " A (List[List[Number]]): left matrix (n × m)\n", + " B (List[List[Number]]): right matrix (m × p)\n", + "\n", + " Returns:\n", + " List[List[Number]]: the product A * B (n × p)\n", + "\n", + " Raises:\n", + " ValueError: if the matrices cannot be multiplied\n", + " \"\"\"\n", + " # Basic shape checks\n", + " if not A or not A[0] or not B or not B[0]:\n", + " raise ValueError(\"Input matrices must be non‑empty\")\n", + " n, m = len(A), len(A[0])\n", + " if m != len(B):\n", + " raise ValueError(\"Number of columns of A must equal number of rows of B\")\n", + "\n", + " # Transpose B once for better locality\n", + " B_T = list(zip(*B)) # now each element of B_T is a tuple representing a column\n", + "\n", + " # Compute the product\n", + " result = []\n", + " for row in A:\n", + " # dot(row, col) for each column\n", + " result.append([sum(a * b for a, b in zip(row, col)) for col in B_T])\n", + "\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " ...\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " k = len(B)\n", + " result = [[0]*m for _ in range(n)]\n", + " for i in range(n):\n", + " for j in range(m):\n", + " s = 0\n", + " for l in range(k):\n", + " s += A[i][l] * B[l][j]\n", + " result[i][j] = s\n", + " return result\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " m = len(A)\n", + " n = len(B[0])\n", + " p = len(B)\n", + " return [[sum(A[i][k] * B[k][j] for k in range(p)) for j in range(n)] for i in range(m)]\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " import math\n", + " # Assume square matrices of same size and power of 2\n", + " n = len(A)\n", + " if n == 0:\n", + " return []\n", + " def add(X, Y):\n", + " return [[X[i][j] + Y[i][j] for j in range(n)] for i in range(n)]\n", + " def sub(X, Y):\n", + " return [[X[i][j] - Y[i][j] for j in range(n)] for i in range(n)]\n", + " def split(M):\n", + " k = n // 2\n", + " return [ [row[:k] for row in M[:k]],\n", + " [row[:k] for row in M[k:]],\n", + " [row[k:] for row in M[:k]],\n", + " [row[k:] for row in M[k:]] ]\n", + " def combine(A11, A12, A21, A22):\n", + " k = len(A11)\n", + " result = [ [0]* (k*2) for _ in range(k*2) ]\n", + " for i in range(k):\n", + " result[i][:k] = A11[i]\n", + " result[i][k:] = A12[i]\n", + " result[i+k][:k] = A21[i]\n", + " result[i+k][k:] = A22[i]\n", + " return result\n", + " def strassen(X, Y):\n", + " if n == 1:\n", + " return [[X[0][0]*Y[0][0]]]\n", + " a, b, c, d = split(X)\n", + " e, f, g, h = split(Y)\n", + " p1 = strassen(a, sub(f, h))\n", + " p2 = strassen(add(a, b), h)\n", + " p3 = strassen(add(c, d), e)\n", + " p4 = strassen(d, sub(g, e))\n", + " p5 = strassen(add(a, d), add(e, h))\n", + " p6 = strassen(sub(b, d), add(g, h))\n", + " p7 = strassen(sub(a, c), add(e, f))\n", + " c11 = add(sub(add(p5, p4), p2), p6)\n", + " c12 = add(p1, p2)\n", + " c21 = add(p3, p4)\n", + " c22 = sub(sub(add(p1, p5), p3), p7)\n", + " return combine(c11, c12, c21, c22)\n", + " return strassen(A, B)\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(A[0])\n", + " p = len(B[0])\n", + " assert len(B) == m\n", + " BT = list(zip(*B)) # transposed as tuples\n", + " C = [[sum(Ai[k] * BTj[k] for k in range(m)) for BTj in BT] for Ai in A]\n", + " return C\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " p = len(B)\n", + " # transpose B\n", + " B_T = list(map(list, zip(*B))) # list of columns\n", + " return [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " ...\n", + "def matmul(A, B):\n", + " \"\"\"Matrix multiplication using only native Python (no external libraries).\n", + "\n", + " Works for arbitrary sized matrices with compatible dimensions.\n", + " The algorithm transposes matrix B to enhance cache locality,\n", + " then uses a list‑comprehension to calculate the dot–product of\n", + " corresponding rows and columns.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[Number]]\n", + " Left matrix of shape (m, n).\n", + " B : list[list[Number]]\n", + " Right matrix of shape (n, p).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[Number]]\n", + " Resulting product matrix of shape (m, p).\n", + " \"\"\"\n", + " # Transpose B for efficient column access\n", + " B_transposed = list(zip(*B)) # tuples, one per column of B\n", + " return [\n", + " [\n", + " # dot product of row from A and column from B\n", + " sum(a * b for a, b in zip(row_a, col_b))\n", + " for col_b in B_transposed\n", + " ]\n", + " for row_a in A\n", + " ]\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " # check dimension matches\n", + " nrows_a = len(A)\n", + " ncols_a = len(A[0]) if A else 0\n", + " nrows_b = len(B)\n", + " ncols_b = len(B[0]) if B else 0\n", + " if ncols_a != nrows_b:\n", + " raise ValueError(\"Incompatible dimensions\")\n", + " # transpose B for cache locality\n", + " BT = list(zip(*B)) # tuple of tuples used as rows\n", + " result = [[0]*ncols_b for _ in range(nrows_a)]\n", + " for i in range(nrows_a):\n", + " ai = A[i]\n", + " ri = result[i]\n", + " for j in range(ncols_b):\n", + " s = 0\n", + " bj = BT[j]\n", + " for k in range(ncols_a):\n", + " s += ai[k] * bj[k]\n", + " ri[j] = s\n", + " return result\n", + "def matmul(A, B):\n", + " B_T = list(zip(*B))\n", + " res = [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + " return res\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two square matrices A and B.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float]]\n", + " First n × n matrix.\n", + " B : list[list[float]]\n", + " Second n × n matrix.\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float]]\n", + " The product matrix C = A @ B.\n", + " \"\"\"\n", + " # Transpose B once for O(1) column access\n", + " B_T = list(zip(*B))\n", + "\n", + " # Compute C[i][j] = dot(A[i], B_T[j])\n", + " return [[sum(a * b for a, b in zip(row, col))\n", + " for col in B_T]\n", + " for row in A]\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using native Python lists.\n", + " `A` and `B` must be rectangular (i.e. all rows the same length).\n", + "\n", + " Returns a new matrix containing the product.\n", + " Raises ValueError if the inner dimensions do not match.\n", + " \"\"\"\n", + " if not A or not B:\n", + " return []\n", + "\n", + " n_rows_A, n_cols_A = len(A), len(A[0])\n", + " n_rows_B, n_cols_B = len(B), len(B[0])\n", + "\n", + " if n_cols_A != n_rows_B:\n", + " raise ValueError(\"cannot multiply: inner dimensions do not match\")\n", + "\n", + " # preallocate result matrix\n", + " result = [[0] * n_cols_B for _ in range(n_rows_A)]\n", + "\n", + " for i in range(n_rows_A):\n", + " # Local references for speed\n", + " row_a = A[i]\n", + " for k in range(n_cols_A):\n", + " aik = row_a[k]\n", + " if aik == 0:\n", + " continue # skip zero multiplications\n", + " row_b = B[k]\n", + " for j in range(n_cols_B):\n", + " result[i][j] += aik * row_b[j]\n", + "\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "None\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"Return the matrix product of A and B.\n", + "\n", + " A must be an `n×m` matrix, B an `m×p` matrix.\n", + " Matrices are represented as nested lists of numbers.\n", + " \"\"\"\n", + " if not A or not B:\n", + " return []\n", + "\n", + " # Transpose B once so we can iterate over rows efficiently\n", + " B_T = list(zip(*B))\n", + "\n", + " # Compute each entry using a dot‑product of corresponding rows\n", + " return [\n", + " [sum(a * b for a, b in zip(row_a, col_b)) for col_b in B_T]\n", + " for row_a in A\n", + " ]\n", + "None\n", + "def matmul(A, B):\n", + " # A is m x p, B is p x n\n", + " m = len(A)\n", + " p = len(A[0]) # find p\n", + " n = len(B[0])\n", + " # create result m x n\n", + " result = [... for i in ...]\n", + "def matmul(A, B):\n", + " m, p = len(A), len(A[0]) if A else 0\n", + " p2, n = len(B), len(B[0]) if B else 0\n", + " if p != p2: raise ValueError(\"Incompatible dimensions\")\n", + " # Precompute transpose of B for cache-friendly access\n", + " Bt = list(zip(*B))\n", + " return [[sum(a * b for a, b in zip(row, col)) for col in Bt] for row in A]\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "def matmul(A, B): return ...\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A (m×n) and B (n×p) given as lists of lists.\n", + " Uses only native Python code and is tuned for speed by transposing B.\n", + " \"\"\"\n", + " if not A:\n", + " return []\n", + "\n", + " n_rows_A, n_cols_A = len(A), len(A[0])\n", + " # Basic consistency check – assume all rows have equal length\n", + " # and B has compatible dimensions.\n", + " n_rows_B, n_cols_B = len(B), len(B[0]) if B else 0\n", + "\n", + " # Transpose B to access its columns as tuples (faster indexing)\n", + " B_T = list(zip(*B)) # shape: (p × n)\n", + "\n", + " result = []\n", + " for row_A in A: # iterate over rows of A\n", + " # Compute the dot product of row_A with each column of B\n", + " res_row = [sum(a * b for a, b in zip(row_A, col_B)) for col_B in B_T]\n", + " result.append(res_row)\n", + "\n", + " return result\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B (lists of lists) using native Python.\n", + " The matrices are assumed to be square and of compatible dimensions.\n", + " \"\"\"\n", + " n = len(A)\n", + " # Transpose B to improve cache locality for the inner sum\n", + " B_T = list(zip(*B)) # each element is a tuple\n", + " return [[sum(a * b for a, b in zip(row, col))\n", + " for col in B_T]\n", + " for row in A]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using only native Python code.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list of lists (m x k)\n", + " B : list of lists (k x n)\n", + "\n", + " Returns\n", + " -------\n", + " C : list of lists (m x n)\n", + " Product matrix such that C[i][j] = sum(A[i][p] * B[p][j] for p in range(k))\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the number of columns in A does not equal the number of rows in B.\n", + " \"\"\"\n", + " if not A or not B:\n", + " raise ValueError(\"Both matrices must be non‑empty.\")\n", + " m, k1 = len(A), len(A[0])\n", + " k2, n = len(B), len(B[0])\n", + " if k1 != k2:\n", + " raise ValueError(f\"Incompatible shapes: {m}x{k1} multiplied by {k2}x{n}\")\n", + " # Pre‑compute columns of B for faster access\n", + " B_cols = list(zip(*B)) # n tuples each of length k\n", + " # Compute the product\n", + " return [[sum(a * b for a, b in zip(row, col))\n", + " for col in B_cols] for row in A]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Fast matrix multiplication for plain Python objects.\n", + " A : list of m rows, each a list of n numbers\n", + " B : list of n rows, each a list of p numbers\n", + " Returns a new matrix of shape m × p.\n", + " \"\"\"\n", + " m = len(A)\n", + " if m == 0:\n", + " return []\n", + " n = len(A[0])\n", + " # Verify dimension compatibility\n", + " if len(B) != n or any(len(row) != n for row in A):\n", + " raise ValueError(\"Inner dimensions must agree.\")\n", + " p = len(B[0])\n", + "\n", + " # Allocate result matrix\n", + " result = [[0] * p for _ in range(m)]\n", + "\n", + " # Standard triple-loop, optimized for speed in pure Python\n", + " for i in range(m):\n", + " row_a = A[i]\n", + " row_res = result[i]\n", + " for k in range(n):\n", + " a_val = row_a[k]\n", + " row_b = B[k]\n", + " # Use local variables for performance\n", + " for j in range(p):\n", + " row_res[j] += a_val * row_b[j]\n", + "\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"Multiply two matrices A and B.\n", + "\n", + " A: list of m rows, each containing n elements.\n", + " B: list of n rows, each containing p elements.\n", + " Returns a new list of list representing the product matrix of shape (m, p).\n", + " \"\"\"\n", + " # Basic sanity checks\n", + " if not A or not B:\n", + " raise ValueError(\"Input matrices must be non‑empty.\")\n", + " m, n = len(A), len(A[0])\n", + " nB, p = len(B), len(B[0])\n", + " if n != nB:\n", + " raise ValueError(\"Number of columns of A must equal number of rows of B.\")\n", + " for row in A:\n", + " if len(row) != n:\n", + " raise ValueError(\"All rows of A must have the same length.\")\n", + " for row in B:\n", + " if len(row) != p:\n", + " raise ValueError(\"All rows of B must have the same length.\")\n", + "\n", + " # Allocate the result matrix (m x p) initialized to 0\n", + " result = [[0] * p for _ in range(m)]\n", + "\n", + " # Perform multiplication\n", + " for i in range(m):\n", + " rowA = A[i]\n", + " rowR = result[i]\n", + " for k in range(n):\n", + " aik = rowA[k]\n", + " if aik: # Skip work for zero multiplication\n", + " rowB = B[k]\n", + " for j in range(p):\n", + " rowR[j] += aik * rowB[j]\n", + " return result\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " # Validate dimensions\n", + " if not A or not B:\n", + " return []\n", + " if len(A[0]) != len(B):\n", + " raise ValueError(\"Matrix dimensions do not match for multiplication.\")\n", + " B_cols = list(zip(*B)) # transpose B\n", + " result = [[sum(a*b for a,b in zip(row, col)) for col in B_cols] for row in A]\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"Multiply matrices A × B (list‑of‑list format) using an optimized pure‑Python routine.\"\"\"\n", + " n, p = len(A), len(A[0]) # rows of A, columns of B (must match)\n", + " m = len(B[0]) # columns of B\n", + " # Result matrix initialized with zeros\n", + " result = [[0] * m for _ in range(n)]\n", + " for i in range(n):\n", + " rowA = A[i]\n", + " rowR = result[i]\n", + " for k in range(p):\n", + " aik = rowA[k]\n", + " if aik: # skip zero entries for a small extra speedup\n", + " rowBk = B[k]\n", + " for j in range(m):\n", + " rowR[j] += aik * rowBk[j]\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"Fast matrix multiplication using only native Python code.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float]]\n", + " Left hand matrix of shape (n, m).\n", + " B : list[list[float]]\n", + " Right hand matrix of shape (m, q).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float]]\n", + " The product matrix of shape (n, q).\n", + "\n", + " Notes\n", + " -----\n", + " The routine pre-allocates the result matrix and uses local variable\n", + " bindings to reduce attribute look‑ups inside the innermost loop,\n", + " which gives a noticeable speed boost for large matrices.\n", + " \"\"\"\n", + " # Basic dimensions checking\n", + " n, m = len(A), len(A[0])\n", + " m2, q = len(B), len(B[0])\n", + " if m != m2:\n", + " raise ValueError(\"Number of columns in A must equal number of rows in B.\")\n", + "\n", + " # Pre‑allocate result matrix with zeros\n", + " result = [[0.0] * q for _ in range(n)]\n", + "\n", + " # Perform multiplication\n", + " for i in range(n):\n", + " rowA = A[i]\n", + " rowR = result[i]\n", + " for k in range(m):\n", + " aik = rowA[k]\n", + " rowB = B[k]\n", + " for j in range(q):\n", + " rowR[j] += aik * rowB[j]\n", + " return result\n", + "def matmul(A, B):\n", + " B_T = list(zip(*B)) # transpose B for inner product\n", + " return [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + "def matmul(A, B):\n", + " # A: m x n, B: n x p\n", + " m, n = len(A), len(A[0])\n", + " n2, p = len(B), len(B[0])\n", + " assert n==n2\n", + " # initialize result matrix\n", + " C = [[0]*p for _ in range(m)]\n", + " # transpose B for better locality\n", + " B_T = list(zip(*B))\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(n):\n", + " aik = Ai[k]\n", + " Bk = B_T[k]\n", + " for j in range(p):\n", + " Ci[j] += aik * Bk[j]\n", + " return C\n", + "def matmul(A, B):\n", + " \"\"\"Fast matrix multiplication using pure Python.\n", + "\n", + " Arguments:\n", + " A: List of lists, the left matrix of size m x n.\n", + " B: List of lists, the right matrix of size n x p.\n", + "\n", + " Returns a new matrix C of size m x p where C[i][j] = sum(A[i][k] * B[k][j] for k in range(n)).\n", + "\n", + " This implementation transposes B once to enable efficient column access\n", + " and uses nested list comprehensions together with the built‑in `sum`\n", + " function, which is implemented in C.\n", + " \"\"\"\n", + " # Verify dimensions\n", + " if not A or not B:\n", + " raise ValueError(\"Matrices cannot be empty\")\n", + " n = len(A[0])\n", + " if any(len(row) != n for row in A):\n", + " raise ValueError(\"All rows in A must have the same length\")\n", + " if len(B) != n:\n", + " raise ValueError(\"Number of columns in A must equal number of rows in B\")\n", + " p = len(B[0])\n", + " if any(len(row) != p for row in B):\n", + " raise ValueError(\"All rows in B must have the same length\")\n", + "\n", + " # Transpose B to get columns as rows\n", + " B_cols = list(zip(*B))\n", + "\n", + " # Compute product\n", + " return [[sum(a * b for a, b in zip(row, col)) for col in B_cols] for row in A]\n", + "def matmul(A, B):\n", + " BT = list(zip(*B))\n", + " return [[sum(a*b for a,b in zip(row, col)) for col in BT] for row in A]\n", + "def matmul(A, B):\n", + " \"\"\"Multiplies matrix A by matrix B using pure native Python.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float]]\n", + " The first matrix of shape (l, m).\n", + " B : list[list[float]]\n", + " The second matrix of shape (m, n).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float]]\n", + " The product matrix of shape (l, n).\n", + " \"\"\"\n", + " # Pre‑get dimensions for speed\n", + " l = len(A) # Number of rows in A\n", + " m = len(A[0]) # Number of columns in A / rows in B\n", + " n = len(B[0]) # Number of columns in B\n", + "\n", + " # The result will have shape (l, n)\n", + " result = [[0.0] * n for _ in range(l)]\n", + "\n", + " for i in range(l):\n", + " Ai = A[i]\n", + " for k in range(m):\n", + " aik = Ai[k]\n", + " Bk = B[k]\n", + " # Unroll column loop to reduce attribute lookups\n", + " for j in range(n):\n", + " result[i][j] += aik * Bk[j]\n", + "\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A (n x m) and B (m x p) using only native Python.\n", + " Returns the resulting matrix as a list of lists.\n", + " \"\"\"\n", + " n = len(A)\n", + " m = len(A[0])\n", + " if len(B) != m:\n", + " raise ValueError(\"Number of columns in A must equal number of rows in B\")\n", + " p = len(B[0])\n", + "\n", + " # Pre‑allocate result matrix with zeros\n", + " result = [[0] * p for _ in range(n)]\n", + "\n", + " for i in range(n):\n", + " row_a = A[i]\n", + " for k in range(m):\n", + " aik = row_a[k] # A[i][k]\n", + " row_b = B[k] # The k-th row of B\n", + " for j in range(p):\n", + " result[i][j] += aik * row_b[j] # C[i][j] += A[i][k] * B[k][j]\n", + " return result\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "def matmul(A, B):\n", + " # assume A dims m x n, B n x p\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " # Should handle maybe rectangular matrices\n", + " ...\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " result = []\n", + " for i in range(len(A)):\n", + " res_row = []\n", + " for j in range(len(B[0])):\n", + " sum_val = 0\n", + " for k in range(len(B)):\n", + " sum_val += A[i][k] * B[k][j]\n", + " res_row.append(sum_val)\n", + " result.append(res_row)\n", + " return result\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices represented as lists of lists using only\n", + " standard Python code. Raises a ValueError if the matrices cannot\n", + " be multiplied.\n", + " \n", + " Parameters\n", + " ----------\n", + " A : List[List[Number]]\n", + " The left-hand-side matrix of shape (m, n).\n", + " B : List[List[Number]]\n", + " The right-hand-side matrix of shape (n, p).\n", + "\n", + " Returns\n", + " -------\n", + " C : List[List[Number]]\n", + " The product matrix of shape (m, p).\n", + " \"\"\"\n", + " if not A or not B:\n", + " raise ValueError(\"Empty matrices cannot be multiplied\")\n", + "\n", + " # Verify inner dimensions match\n", + " n = len(A[0])\n", + " for row in A:\n", + " if len(row) != n:\n", + " raise ValueError(\"All rows of A must have the same length\")\n", + " if len(B) != n:\n", + " raise ValueError(\"Number of columns in A must equal number of rows in B\")\n", + "\n", + " p = len(B[0])\n", + " for row in B:\n", + " if len(row) != p:\n", + " raise ValueError(\"All rows of B must have the same length\")\n", + "\n", + " # Transpose B so that columns can be accessed as tuples\n", + " B_T = list(zip(*B)) # Each element is a tuple of length n\n", + "\n", + " # Compute the product\n", + " C = []\n", + " for a_row in A:\n", + " c_row = []\n", + " for b_col in B_T:\n", + " dot_product = sum(x * y for x, y in zip(a_row, b_col))\n", + " c_row.append(dot_product)\n", + " C.append(c_row)\n", + "\n", + " return C\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B represented as nested lists.\n", + " \n", + " Parameters:\n", + " A (list[list[float]]): Matrix of size (m x n).\n", + " B (list[list[float]]): Matrix of size (n x p).\n", + " \n", + " Returns:\n", + " list[list[float]]: Resultant matrix of size (m x p).\n", + " \"\"\"\n", + " # Pre‑compute the columns of B\n", + " B_cols = list(zip(*B))\n", + " \n", + " # Compute the product row by row\n", + " return [\n", + " [\n", + " sum(a * b for a, b in zip(row, col))\n", + " for col in B_cols\n", + " ]\n", + " for row in A\n", + " ]\n", + "def matmul(A, B):\n", + " # Basic dimension check\n", + " if not A or not B:\n", + " return []\n", + " n_rows_a = len(A)\n", + " n_cols_a = len(A[0])\n", + " n_rows_b = len(B)\n", + " n_cols_b = len(B[0])\n", + " if n_cols_a != n_rows_b:\n", + " raise ValueError(\"Incompatible dimensions for matrix multiplication\")\n", + " result = [[0] * n_cols_b for _ in range(n_rows_a)]\n", + " for i in range(n_rows_a):\n", + " for k in range(n_cols_a):\n", + " aik = A[i][k]\n", + " if aik == 0:\n", + " continue\n", + " for j in range(n_cols_b):\n", + " result[i][j] += aik * B[k][j]\n", + " return result\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " # A: m x n, B: n x p\n", + " # returns m x p\n", + " # check sizes\n", + " m, n = len(A), len(A[0])\n", + " assert len(B) == n\n", + " p = len(B[0])\n", + " # Precompute transpose of B\n", + " Bt = list(zip(*B))\n", + " res = [[sum(a*b for a,b in zip(row, col)) for col in Bt] for row in A]\n", + " return res\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " \"\"\"Multiply two matrices A and B (list of lists) purely in plain Python.\"\"\"\n", + " m, n = len(A), len(A[0])\n", + " nB, p = len(B), len(B[0])\n", + " if n != nB:\n", + " raise ValueError(\"Inner matrix dimensions must agree.\")\n", + " # Pre‑allocate result matrix\n", + " C = [[0] * p for _ in range(m)]\n", + " # Perform multiplication in the ctr order: i, k, j\n", + " for i in range(m):\n", + " rowA = A[i]\n", + " rowC = C[i]\n", + " for k in range(n):\n", + " aik = rowA[k]\n", + " if aik: # skip zero multiplications\n", + " rowB = B[k]\n", + " for j in range(p):\n", + " rowC[j] += aik * rowB[j]\n", + " return C\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " B_T = list(zip(*B))\n", + " return [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + "def matmul(A, B):\n", + " return ...\n", + "None\n", + "def matmul(A, B):\n", + " ...\n", + "def matmul(A, B):\n", + " ...\n", + "def matmul(A, B):\n", + " ...\n", + "None\n", + "def matmul(A, B):\n", + " # assume A rows, B columns\n", + " m, k1 = len(A), len(A[0]) if A else 0\n", + " k2, n = len(B), len(B[0]) if B else 0\n", + " assert k1 == k2, \"Inner dimensions must match\"\n", + " B_T = list(zip(*B)) # transposed B\n", + " result = [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B (both given as lists of lists) using\n", + " only native Python constructs.\n", + "\n", + " The function first validates that the inner dimensions match (number of\n", + " columns in A must equal the number of rows in B). Then it computes the\n", + " product using a straightforward triple‑loop but expressed in a compact\n", + " list‑comprehension. The columns of B are accessed by transposing B\n", + " once via ``zip(*B)``, which avoids explicit indexing and gives good\n", + " cache locality in Python.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : List[List[Number]]\n", + " Left‑hand matrix of size m × n.\n", + "\n", + " B : List[List[Number]]\n", + " Right‑hand matrix of size n × p.\n", + "\n", + " Returns\n", + " -------\n", + " List[List[Number]]\n", + " The matrix product of A and B, which has shape m × p.\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the matrices cannot be multiplied due to incompatible dimensions.\n", + " \"\"\"\n", + " # Validate dimensions\n", + " if not A or not B:\n", + " raise ValueError(\"Matrices cannot be empty\")\n", + " n_cols_A = len(A[0])\n", + " n_rows_B = len(B)\n", + " if n_cols_A != n_rows_B:\n", + " raise ValueError(\"Inner dimensions must match: \"\n", + " f\"{n_cols_A} != {n_rows_B}\")\n", + "\n", + " # Transpose B once to make column access efficient\n", + " B_cols = list(zip(*B))\n", + "\n", + " # Compute product using list comprehensions\n", + " return [\n", + " [sum(a * b for a, b in zip(row, col)) for col in B_cols]\n", + " for row in A\n", + " ]\n", + "def matmul(A, B):\n", + " if not A or not B:\n", + " return []\n", + " m, p = len(A), len(A[0])\n", + " n = len(B[0])\n", + " # ensure inner dimension matches\n", + " result = [[0]*n for _ in range(m)]\n", + " for i in range(m):\n", + " for k in range(p):\n", + " aik = A[i][k]\n", + " for j in range(n):\n", + " result[i][j] += aik * B[k][j]\n", + " return result\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " p = len(B)\n", + " return [[sum(A[i][k] * B[k][j] for k in range(p)) for j in range(m)] for i in range(n)]\n", + "def matmul(A, B):\n", + " # Basic check dims\n", + " n = len(A)\n", + " assert n > 0\n", + " m = len(A[0])\n", + " # B has size m x p\n", + " assert len(B) == m\n", + " p = len(B[0])\n", + " # Pre-allocate result\n", + " C = [[0]*p for _ in range(n)]\n", + " # Compute transpose of B for better locality\n", + " B_T = list(map(list, zip(*B)))\n", + " for i in range(n):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for j in range(p):\n", + " Bj = B_T[j]\n", + " s = 0\n", + " for k in range(m):\n", + " s += Ai[k] * Bj[k]\n", + " Ci[j] = s\n", + " return C\n", + "def matmul(A, B):\n", + " \"\"\"Return the product of two matrices in Theta(m^3/mn)*n^2 time,\n", + " optimizing cache usage if --precache-multiple was selected.\n", + " \"\"\"\n", + " _check_input(A, B)\n", + " m = len(A); n = len(A[0]); k = len(B[0]); # (m x n) * (n x k) => (m x k)\n", + " _use_a = (m / n <= 100.0 * n / k)\n", + " M_local_cache_avail_prefs = sympy.cache.get('M_local_cache_avail_prefs', 0)\n", + " M_local_cache_avail_nonp = sympy.cache.get('M_local_cache_avail_nonp', 0)\n", + "\n", + " if sympy.cache and M_local_cache_avail_nonp and _use_a:\n", + " local_cache_key_A = (m,n,1)\n", + " local_cache_key_B = (n,k,1)\n", + " if local_cache_key_A not in sympy.cache:\n", + " sympy.cache[local_cache_key_A] = [(r,c) for r in range(m) for c in range(n)]\n", + " if local_cache_key_B not in sympy.cache:\n", + " sympy.cache[local_cache_key_B] = [(r,c) for r in range(n) for c in range(k)]\n", + " A_local, B_local = sympy.cache[local_cache_key_A], sympy.cache[local_cache_key_B]\n", + " else:\n", + " A_local, B_local = None, None\n", + "\n", + " def fast_matmul(A_local, B_local, _):\n", + " result = [[sum(A_local[i][j] * B_local[j][l] for j in range(n))\n", + " for l in range(k)]\n", + " for i in range(m)]\n", + " return result\n", + "\n", + " if A_local and B_local:\n", + " return fast_matmul(A_local, B_local, k)\n", + " else:\n", + " return fast_matmul(A, B, k)\n", + "def matmul(A, B):\n", + " n, m = len(A), len(B)\n", + " assert all(len(row)==m for row in A) and all(len(row)==len(B[0]) for row in B)\n", + " # maybe compute B transposed\n", + " BT = list(zip(*B))\n", + " result = [[sum(a*b for a,b in zip(row, col)) for col in BT] for row in A]\n", + " return result\n", + "def matmul(A, B):\n", + " m = len(A)\n", + " n = len(A[0])\n", + " p = len(B[0])\n", + " # compute result matrix C(m x p)\n", + " result = [[sum(A[i][k]*B[k][j] for k in range(n)) for j in range(p)] for i in range(m)]\n", + " return result\n", + "None\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " p = len(B)\n", + " result = [[0]*m for _ in range(n)]\n", + " for i in range(n):\n", + " Ai=A[i]\n", + " Ri=result[i]\n", + " for k in range(p):\n", + " aik=Ai[k]\n", + " Bk=B[k]\n", + " for j in range(m):\n", + " Ri[j]+=aik*Bk[j]\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A (n x m) and B (m x p) without using external libraries.\n", + " \"\"\"\n", + " n=len(A)\n", + " m=len(A[0])\n", + " p=len(B[0])\n", + " # Check compatibility\n", + " if len(B)!=m:\n", + " raise ValueError(\"Incompatible dimensions\")\n", + " # Transpose B for cache-friendly access\n", + " B_T=[list(col) for col in zip(*B)]\n", + " # Prepare result matrix\n", + " result=[[0]*p for _ in range(n)]\n", + " for i in range(n):\n", + " row=A[i]\n", + " # local assignments\n", + " res_row=result[i]\n", + " for j in range(p):\n", + " col=B_T[j]\n", + " s=0\n", + " for a, b in zip(row, col):\n", + " s += a*b\n", + " res_row[j]=s\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"Multiply two matrices A (m x n) and B (n x p) using pure Python.\n", + "\n", + " Args:\n", + " A: list of m lists, each of length n.\n", + " B: list of n lists, each of length p.\n", + "\n", + " Returns:\n", + " C: list of m lists, each of length p, the product.\n", + " \"\"\"\n", + " m = len(A); n = len(A[0]); p = len(B[0])\n", + " # Preallocate result\n", + " C = [[0]*p for _ in range(m)]\n", + " # transpose B for better cache (although Python's memory model)\n", + " B_T = [list(col) for col in zip(*B)]\n", + " # iterate over rows of A and rows of B_T\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(p):\n", + " s = 0\n", + " Bk = B_T[k]\n", + " for j in range(n):\n", + " s += Ai[j] * Bk[j]\n", + " Ci[k] = s\n", + " return C\n", + "def matmul(A, B):\n", + " # A: m x n, B: n x p\n", + " m, n = len(A), len(A[0])\n", + " n2, p = len(B), len(B[0])\n", + " assert n == n2\n", + " # Precompute columns of B\n", + " Bcols = list(zip(*B))\n", + " return [[sum(a*b for a,b in zip(row,c)) for c in Bcols] for row in A]\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices using pure Python.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : List[List[Number]]\n", + " The first matrix (m × n).\n", + " B : List[List[Number]]\n", + " The second matrix (n × p).\n", + "\n", + " Returns\n", + " -------\n", + " List[List[Number]]\n", + " The product matrix (m × p).\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the inner dimensions of A and B do not match.\n", + " \"\"\"\n", + " if not A or not B or not B[0]:\n", + " return []\n", + "\n", + " m = len(A)\n", + " n = len(A[0])\n", + " if len(B) != n:\n", + " raise ValueError(\"Inner dimensions must agree: A: {}, B: {}.\".format(n, len(B)))\n", + "\n", + " p = len(B[0])\n", + " # column count of B must be p\n", + " # Use list comprehensions for a compact, Python‑native implementation\n", + " return [[sum(A[i][k] * B[k][j] for k in range(n)) for j in range(p)] for i in range(m)]\n", + "def matmul(A, B):\n", + " ...\n", + "None\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " # matrix multiplication using only native Python\n", + " ...\n", + " return ...\n", + "def matmul(A, B):\n", + " n_rows = len(A)\n", + " n_cols = len(B[0])\n", + " k = len(B) # check match\n", + " if any(len(row)!=k for row in A):\n", + " raise ValueError(\"A dimensions don't match B\")\n", + " # transpose B for better cache\n", + " B_T = list(zip(*B)) # returns tuples but we can keep\n", + " result = [[0]*n_cols for _ in range(n_rows)]\n", + " for i in range(n_rows):\n", + " Ai = A[i]\n", + " Ri = result[i]\n", + " for j, Bj in enumerate(B_T):\n", + " s = 0\n", + " for a,b in zip(Ai, Bj):\n", + " s += a*b\n", + " Ri[j] = s\n", + " return result\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " p = len(B)\n", + " # assert p == len(A[0])? we can compute\n", + " result = [[0]*m for _ in range(n)]\n", + " for i in range(n):\n", + " ai = A[i]\n", + " for k in range(p):\n", + " aik = ai[k]\n", + " if aik:\n", + " bk = B[k]\n", + " for j in range(m):\n", + " result[i][j] += aik * bk[j]\n", + " return result\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " # Ensure both are lists of lists, etc. \n", + " return [[sum(a*b for a,b in zip(row,col)) for col in zip(*B)] for row in A]\n", + "None\n", + "None\n", + "def matmul(A, B): return ...\n", + "None\n", + "def matmul(A, B): return ...\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiplies two matrices A and B using pure Python lists.\n", + " Expects A to be m x n and B to be n x p.\n", + " Returns the resulting m x p matrix.\n", + " \"\"\"\n", + " return [[sum(a * b for a, b in zip(rowA, colB)) for colB in zip(*B)] for rowA in A]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using only native Python constructs.\n", + " \n", + " Parameters\n", + " ----------\n", + " A : list[list[Number]]\n", + " Left‑hand matrix.\n", + " B : list[list[Number]]\n", + " Right‑hand matrix.\n", + " \n", + " Returns\n", + " -------\n", + " list[list[Number]]\n", + " The product matrix A * B.\n", + " \"\"\"\n", + " # Transpose B to ease column access\n", + " Bt = list(zip(*B))\n", + " # Compute each entry as the dot product of a row of A and a column of B\n", + " return [[sum(a * b for a, b in zip(row, col))\n", + " for col in Bt] for row in A]\n", + "None\n", + "def matmul(A, B):\n", + " # assume A: m x n, B: n x p\n", + " n = len(A)\n", + " m = len(A[0])\n", + " p = len(B[0])\n", + " # precompute columns of B via zip\n", + " columns_B = list(zip(*B))\n", + " result = [[sum(a*b for a,b in zip(row, col)) for col in columns_B] for row in A]\n", + " return result\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using plain Python.\n", + " A : list of m rows, each a list of p numbers\n", + " B : list of p rows, each a list of n numbers\n", + " Returns a list of m rows, each a list of n numbers\n", + " \"\"\"\n", + " m, p = len(A), len(A[0]) # dimensions of A\n", + " assert p == len(B), \"Incompatible matrix dimensions\"\n", + " n = len(B[0]) # number of columns of B\n", + "\n", + " # initialise result matrix with zeros\n", + " C = [[0] * n for _ in range(m)]\n", + "\n", + " # iterate over the shared dimension first\n", + " for k in range(p):\n", + " B_row = B[k]\n", + " for i in range(m):\n", + " aik = A[i][k]\n", + " if aik: # skip multiplies by zero\n", + " C_row = C[i]\n", + " # the inner loop that does the real work\n", + " for j in range(n):\n", + " C_row[j] += aik * B_row[j]\n", + " return C\n", + "def matmul(A, B):\n", + " m = len(A); n = len(A[0]); p = len(B[0])\n", + " # validate B has proper shape\n", + " result = [[0]*p for _ in range(m)]\n", + " for i in range(m):\n", + " rowA = A[i]\n", + " row_res = result[i]\n", + " for k in range(n):\n", + " aik = rowA[k]\n", + " if aik:\n", + " rowBk = B[k]\n", + " for j in range(p):\n", + " row_res[j] += aik * rowBk[j]\n", + " return result\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " if not A or not B:\n", + " return []\n", + " n, m = len(A), len(A[0])\n", + " p, q = len(B), len(B[0])\n", + " if m != p:\n", + " raise ValueError(\"Inner matrix dimensions must agree.\")\n", + " # compute C with zeros\n", + " C = [[0]*q for _ in range(n)]\n", + " for i in range(n):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(m):\n", + " aik = Ai[k]\n", + " Bk = B[k]\n", + " for j in range(q):\n", + " Ci[j] += aik * Bk[j]\n", + " return C\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A (n × p) and B (p × m) using a cache‑friendly\n", + " block‑style algorithm that reduces Python overhead compared to a\n", + " straightforward triple loop.\n", + " \"\"\"\n", + " n = len(A) # rows of A\n", + " p = len(B) # shared dimension\n", + " m = len(B[0]) # columns of B\n", + "\n", + " # Result matrix initialised with zeros\n", + " C = [[0] * m for _ in range(n)]\n", + "\n", + " # Optimised loop ordering: i → k → j\n", + " for i in range(n):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(p):\n", + " aik = Ai[k]\n", + " if aik: # skip zero multiplications\n", + " Bk = B[k]\n", + " for j in range(m):\n", + " Ci[j] += aik * Bk[j]\n", + " return C\n", + "def matmul(A, B):\n", + " # ensure convertible shapes\n", + " m, n = len(A), len(A[0])\n", + " p = len(B[0])\n", + " # Precompute transpose of B to improve cache locality\n", + " BT = list(zip(*B))\n", + " result = [[0]*p for _ in range(m)]\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ri = result[i]\n", + " for j, Bj in enumerate(BT):\n", + " s = 0\n", + " for k in range(n):\n", + " s += Ai[k] * Bj[k]\n", + " Ri[j] = s\n", + " return result\n", + "None\n", + "def matmul(A, B): return ...\n", + "None\n", + "None\n", + "None\n", + "None\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " # ensure shape\n", + " if not A: return []\n", + " m, k = len(A), len(A[0])\n", + " k2, n = len(B), len(B[0])\n", + " assert k == k2\n", + " # transpose B\n", + " B_T = list(zip(*B))\n", + " # compute\n", + " return [[sum(a*b for a,b in zip(row, col)) for col in B_T] for row in A]\n", + "None\n", + "def matmul(A, B):\n", + " # A is an m x n matrix, B is an n x p matrix\n", + " m = len(A)\n", + " n = len(A[0]) if A else 0\n", + " p = len(B[0]) if B else 0\n", + "\n", + " # In case the dimensions are incompatible, raise an error\n", + " if n != len(B):\n", + " raise ValueError(\"Incompatible matrix dimensions: A has %d cols but B has %d rows.\" % (n, len(B)))\n", + "\n", + " # Prepare the result matrix filled with zeros\n", + " C = [[0] * p for _ in range(m)]\n", + "\n", + " # Perform the multiplication using a cache-friendly triple loop\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(n):\n", + " aik = Ai[k]\n", + " Bk = B[k]\n", + " for j in range(p):\n", + " Ci[j] += aik * Bk[j]\n", + " return C\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using plain Python lists.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float]]\n", + " Left matrix of shape (m, n).\n", + " B : list[list[float]]\n", + " Right matrix of shape (n, p).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float]]\n", + " The product matrix of shape (m, p).\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the inner dimensions do not agree.\n", + " \"\"\"\n", + " # Validate input\n", + " if not A or not B:\n", + " return []\n", + "\n", + " m, n_A = len(A), len(A[0])\n", + " n_B, p = len(B), len(B[0])\n", + "\n", + " if n_A != n_B:\n", + " raise ValueError(\"Inner matrix dimensions must agree: \"\n", + " f\"{n_A} != {n_B}\")\n", + "\n", + " # Pre‑allocate result matrix with zeros\n", + " C = [[0.0 for _ in range(p)] for _ in range(m)]\n", + "\n", + " # Classic triple‑loop multiplication\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ci = C[i]\n", + " for k in range(n_A):\n", + " aik = Ai[k]\n", + " Bk = B[k]\n", + " # Unroll the inner loop over p\n", + " for j in range(p):\n", + " Ci[j] += aik * Bk[j]\n", + "\n", + " return C\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiplies two matrices A and B represented as lists of lists using\n", + " plain Python code. Handles generic rectangular matrices.\n", + " \"\"\"\n", + " # Basic size validation\n", + " if not A or not B or not A[0] or not B[0]:\n", + " raise ValueError(\"Matrices cannot be empty\")\n", + " rows_a = len(A)\n", + " cols_a = len(A[0])\n", + " rows_b = len(B)\n", + " cols_b = len(B[0])\n", + "\n", + " if cols_a != rows_b:\n", + " raise ValueError(\"Inner dimensions must match for multiplication\")\n", + "\n", + " # Compute the product using a straightforward triple loop\n", + " result = [\n", + " [sum(A[i][k] * B[k][j] for k in range(cols_a)) for j in range(cols_b)]\n", + " for i in range(rows_a)\n", + " ]\n", + "\n", + " return result\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices using a naïve algorithm implemented in pure Python.\n", + " \"\"\"\n", + " # Get dimensions\n", + " na = len(A)\n", + " ma = len(A[0]) if A else 0\n", + " nb = len(B)\n", + " mb = len(B[0]) if B else 0\n", + " \n", + " if ma != nb:\n", + " raise ValueError(\"Inner dimensions must match for multiplication.\")\n", + " \n", + " # Create result matrix\n", + " result = [[0 for _ in range(mb)] for _ in range(na)]\n", + " \n", + " # Standard triple‑loop multiplication\n", + " for i in range(na):\n", + " Ai = A[i]\n", + " for j in range(mb):\n", + " sum = 0\n", + " for k in range(ma):\n", + " sum += Ai[k] * B[k][j]\n", + " result[i][j] = sum\n", + " return result\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B and return the product.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[Number]]\n", + " Left matrix of shape (m, n).\n", + " B : list[list[Number]]\n", + " Right matrix of shape (n, p).\n", + "\n", + " Returns\n", + " -------\n", + " C : list[list[Number]]\n", + " Matrix product of shape (m, p).\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the input matrices cannot be multiplied due to incompatible shapes.\n", + " \"\"\"\n", + " # Validate inputs\n", + " if not A or not B:\n", + " return []\n", + "\n", + " # Dimensions\n", + " m, n = len(A), len(A[0]) if A else 0\n", + " n_b, p = len(B), len(B[0]) if B else 0\n", + "\n", + " if n != n_b:\n", + " raise ValueError(f\"Incompatible dimensions: A is {m}x{n}, B is {n_b}x{p}\")\n", + "\n", + " # Pre-allocate result matrix with zeros\n", + " C = [[0] * p for _ in range(m)]\n", + "\n", + " # Main multiplication loop\n", + " for i in range(m):\n", + " a_row = A[i]\n", + " c_row = C[i]\n", + " for k in range(n):\n", + " aik = a_row[k]\n", + " if aik == 0:\n", + " continue # Skip multiplication by zero\n", + " b_row_k = B[k]\n", + " # Unroll the inner loop for potential speed\n", + " for j in range(p):\n", + " c_row[j] += aik * b_row_k[j]\n", + " return C\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " return ...\n", + "def matmul(A, B):\n", + " \"\"\"Multiply two matrices using only native Python lists.\"\"\"\n", + " # Basic dimension checks\n", + " if not A or not B or not A[0] or not B[0]:\n", + " raise ValueError(\"Input matrices must be non-empty\")\n", + " if len(A[0]) != len(B):\n", + " raise ValueError(\"Number of columns in A must equal number of rows in B\")\n", + "\n", + " # Transpose B to get its columns efficiently\n", + " BT = list(zip(*B)) # each is a tuple: column of B\n", + "\n", + " # Compute the product\n", + " result = [[sum(a * b for a, b in zip(row, col)) for col in BT] for row in A]\n", + " return result\n", + "def matmul(A, B):\n", + " m = len(A)\n", + " p = len(A[0])\n", + " if p==0:\n", + " return [[] for _ in range(m)]\n", + " n = len(B[0])\n", + " # transpose B for cache\n", + " Bt = [[B[i][j] for i in range(p)] for j in range(n)]\n", + " res = [[0]*n for _ in range(m)]\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " Ri = res[i]\n", + " for k in range(p):\n", + " aik = Ai[k]\n", + " Bk = Bt # not right; we need to use Bt[j][k].\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " ...\n", + "None\n", + "def matmul(A, B):\n", + " # A: m x n, B: n x p\n", + " m, n = len(A), len(A[0])\n", + " assert n == len(B), \"Incompatible matrices\"\n", + " p = len(B[0])\n", + " # pre-transpose B to speed up\n", + " B_T = list(map(list, zip(*B))) # p x n\n", + " return [[sum(a*b for a, b in zip(row, col)) for col in B_T] for row in A]\n", + "None\n", + "def matmul(A, B): return ...\n", + "def matmul(A, B):\n", + " \"\"\"Return `A * B` for two 2‑D lists `A` and `B` using pure Python.\"\"\"\n", + " # Ensure dimensions are compatible\n", + " if not A or not B or not B[0]:\n", + " return []\n", + "\n", + " # Transpose B once to obtain column access in O(1)\n", + " B_t = list(zip(*B))\n", + "\n", + " # Compute the matrix product using list comprehensions\n", + " return [\n", + " [sum(a * b for a, b in zip(row, col))\n", + " for col in B_t] # compute dot product of row with each column of B\n", + " for row in A\n", + " ]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Compute the matrix product C = A @ B with pure Python.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : List[List[float]]\n", + " Left matrix of size m × p.\n", + " B : List[List[float]]\n", + " Right matrix of size p × n.\n", + "\n", + " Returns\n", + " -------\n", + " List[List[float]]\n", + " Resulting matrix of size m × n.\n", + " \"\"\"\n", + " m, pA = len(A), len(A[0])\n", + " pB, n = len(B), len(B[0])\n", + "\n", + " if pA != pB:\n", + " raise ValueError(\"Inner matrix dimensions must agree (got %d×%d and %d×%d) \"\n", + " % (m, pA, pB, n))\n", + "\n", + " # Allocate result matrix\n", + " C = [[0.0] * n for _ in range(m)]\n", + "\n", + " # Blocked matrix multiplication for better cache locality.\n", + " # Choose a block size that works well on most systems\n", + " block = 64\n", + "\n", + " for i0 in range(0, m, block):\n", + " i_max = min(i0 + block, m)\n", + " for k0 in range(0, pA, block):\n", + " k_max = min(k0 + block, pA)\n", + " for j0 in range(0, n, block):\n", + " j_max = min(j0 + block, n)\n", + "\n", + " for i in range(i0, i_max):\n", + " ai = A[i]\n", + " ci = C[i]\n", + " for k in range(k0, k_max):\n", + " aik = ai[k]\n", + " bk = B[k]\n", + " for j in range(j0, j_max):\n", + " ci[j] += aik * bk[j]\n", + " return C\n", + "None\n", + "def matmul(A, B):\n", + " if not A or not B:\n", + " return []\n", + " m = len(A)\n", + " n = len(A[0])\n", + " p = len(B[0])\n", + " # check compatibility: len(B)==n\n", + " # compute result matrix with nested loops\n", + " res = [[0]*p for _ in range(m)]\n", + " for i in range(m):\n", + " Ai = A[i]\n", + " for j in range(p):\n", + " s = 0\n", + " for k in range(n):\n", + " s += Ai[k]*B[k][j]\n", + " res[i][j] = s\n", + " return res\n", + "def matmul(A, B):\n", + " # check dimensions\n", + " ...\n", + " # compute product\n", + "def matmul(A, B):\n", + " # Extract dimensions\n", + " if not A or not B or not A[0] or not B[0]:\n", + " return [] # or raise ValueError...\n", + " # Determine dimensions\n", + " p = len(A[0]) # columns of A, rows of B\n", + " if p != len(B):\n", + " raise ValueError(\"Incompatible matrix sizes.\")\n", + " # Transpose B for efficient column access\n", + " BT = list(zip(*B))\n", + " # Perform multiplication\n", + " result = []\n", + " for row in A:\n", + " new_row = []\n", + " for col in BT:\n", + " # Dot product\n", + " sum_val = 0\n", + " for a, b in zip(row, col):\n", + " sum_val += a * b\n", + " new_row.append(sum_val)\n", + " result.append(new_row)\n", + " return result\n", + "def matmul(A, B):\n", + " # optimize: transpose B\n", + " BT = list(zip(*B)) # tuple of tuples (row of B^T)\n", + " return [[sum(a*b for a, b in zip(rowA, colB)) for colB in BT] for rowA in A]\n", + "def matmul(A, B):\n", + " n = len(A)\n", + " m = len(B[0])\n", + " p = len(B)\n", + " return [[sum(A[i][k]*B[k][j] for k in range(p)) for j in range(m)] for i in range(n)]\n", + "def matmul(A, B):\n", + " \"\"\"\n", + " Multiply two matrices A and B using pure Python.\n", + "\n", + " Parameters\n", + " ----------\n", + " A : list[list[float | int | complex]]\n", + " The first matrix of dimensions (m, p).\n", + " B : list[list[float | int | complex]]\n", + " The second matrix of dimensions (p, n).\n", + "\n", + " Returns\n", + " -------\n", + " list[list[float | int | complex]]\n", + " The product matrix of dimensions (m, n).\n", + "\n", + " Raises\n", + " ------\n", + " ValueError\n", + " If the inner dimensions do not match.\n", + " \"\"\"\n", + " # Basic sanity checks for empty/corrupt inputs\n", + " if not A or not B:\n", + " raise ValueError(\"Input matrices cannot be empty\")\n", + "\n", + " p = len(A[0])\n", + " for row in A:\n", + " if len(row) != p:\n", + " raise ValueError(\"All rows in A must have the same length\")\n", + " q = len(B)\n", + " for row in B:\n", + " if len(row) != len(B[0]):\n", + " raise ValueError(\"All rows in B must have the same length\")\n", + "\n", + " # Ensure the inner dimensions match\n", + " if p != q:\n", + " raise ValueError(\"Inner matrix dimensions must agree: len(A[0]) != len(B)\")\n", + "\n", + " # Transpose B to avoid repeated look‑ups in the inner loop\n", + " B_T = list(zip(*B)) # Each element is a tuple representing a column\n", + "\n", + " # Perform matrix multiplication\n", + " return [[sum(a * b for a, b in zip(row, col)) for col in B_T] for row in A]\n", + "def matmul(A, B):\n", + " \"\"\"Return the matrix product of A and B using native Python.\"\"\"\n", + " # Transpose B once to avoid repeated column lookups.\n", + " B_T = list(zip(*B))\n", + " # Compute each element of the product using a generator expression.\n", + " return [[sum(a * b for a, b in zip(row, col)) for col in B_T] for row in A]\n", + "None\n", + "None\n", + "None\n", + "None\n", + "def matmul(A, B):\n", + " if not A or not B: \n", + " return []\n", + " nrowA = len(A)\n", + " ncolA = len(A[0])\n", + " nrowB = len(B)\n", + " ncolB = len(B[0])\n", + " if ncolA != nrowB:\n", + " raise ValueError(\"Incompatible dimensions for matrix multiplication\")\n", + " # Precompute columns of B\n", + " colsB = list(zip(*B))\n", + " return [\n", + " [sum(a*b for a, b in zip(row, col)) for col in colsB]\n", + " for row in A\n", + " ]\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=100, training_loss=3.209321222243488e-05, metrics={'train_runtime': 5865.3354, 'train_samples_per_second': 0.034, 'train_steps_per_second': 0.017, 'total_flos': 0.0, 'train_loss': 3.209321222243488e-05})" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainer.train()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now with the LoRA we just trained with GRPO - we first save the LoRA first!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify LoRA is actually trained!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from safetensors import safe_open\n", + "\n", + "tensors = {}\n", + "with safe_open(\"grpo_saved_lora/adapter_model.safetensors\", framework = \"pt\") as f:\n", + " # Verify both A and B are non zero\n", + " for key in f.keys():\n", + " tensor = f.get_tensor(key)\n", + " n_zeros = (tensor == 0).sum() / tensor.numel()\n", + " assert(n_zeros.item() != tensor.numel())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Inference\n", + "Now let's try the model we just trained!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "_ = model.generate(\n", + " **tokenizer(images = None, text = text, return_tensors = \"pt\").to(\"cuda\"),\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " max_new_tokens = 1024,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = False),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Merge to 16bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Merge to 4bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Just LoRA adapters\n", + "if False:\n", + " model.save_pretrained(\"gemma_4_lora\")\n", + " tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "if False:\n", + " model.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")\n", + " tokenizer.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF.\n", + "\n", + "Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)):\n", + "* `q8_0` - Fast conversion. High resource use, but generally acceptable.\n", + "* `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K.\n", + "* `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K.\n", + "\n", + "[**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Save to 8bit Q8_0\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer,)\n", + "# Remember to go to https://huggingface.co/settings/tokens for a token!\n", + "# And change hf to your username!\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to 16bit GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"f16\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"f16\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to q4_k_m GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to multiple GGUF options - much faster if you want multiple!\n", + "if False:\n", + " model.push_to_hub_gguf(\n", + " \"HF_USERNAME/gemma_4_finetune\", # Change hf to your username!\n", + " tokenizer,\n", + " quantization_method = [\"q4_k_m\", \"q8_0\", \"q5_k_m\",],\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.ipynb new file mode 100644 index 0000000..c0e3acf --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.ipynb @@ -0,0 +1,11898 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Goal: Make Gemma 4 play games with Reinforcement Learning\n", + "\n", + "Our goal is to make Gemma 4 play the 2048 game with reinforcement learning, or a variant of it called [GRPO](https://arxiv.org/abs/2501.12948).\n", + "\n", + "We want the model to devise a strategy to play 2048, and we will run this strategy until we win or lose. We then reward the model if it created a good strategy (winning the game), and we'll penalize it (negative reward) if the strategy was a bad one.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Installation\n", + "We'll be using [Unsloth](https://github.com/unslothai/unsloth) to do RL on Gemma 4. Unsloth saves 70% VRAM usage and makes reinforcement learning 2 to 6x faster!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "%%capture\n", + "import os, importlib.util\n", + "!pip install --upgrade -qqq uv\n", + "if importlib.util.find_spec(\"torch\") is None or \"COLAB_\" in \"\".join(os.environ.keys()):\n", + " try: import numpy, PIL; _numpy = f\"numpy=={numpy.__version__}\"; _pil = f\"pillow=={PIL.__version__}\"\n", + " except: _numpy = \"numpy\"; _pil = \"pillow\"\n", + " # Gemma 4 requires transformers >= 5.5.0 — do NOT pin to 4.x here\n", + " !uv pip install -qqq \\\n", + " \"torch>=2.8.0\" \"triton>=3.4.0\" {_numpy} {_pil} torchvision bitsandbytes \\\n", + " \"unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo\" \\\n", + " \"unsloth[base] @ git+https://github.com/unslothai/unsloth\" \\\n", + " git+https://github.com/triton-lang/triton.git@0add68262ab0a2e33b84524346cb27cbb2787356#subdirectory=python/triton_kernels\n", + "elif importlib.util.find_spec(\"unsloth\") is None:\n", + " !uv pip install -qqq unsloth\n", + "# Gemma 4 requires transformers >= 5.5.0\n", + "!uv pip install --upgrade --no-deps \"transformers>=5.5.0\" tokenizers \"trl>=0.28.0\" unsloth unsloth_zoo" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from unsloth import FastVisionModel\n", + "import torch\n", + "max_seq_length = 4096 # Can increase for longer reasoning traces\n", + "lora_rank = 32 # Larger rank = smarter, but slower\n", + "\n", + "gemma4_models = [\n", + " # Gemma-4 instruct models:\n", + " \"unsloth/gemma-4-E2B-it\",\n", + " \"unsloth/gemma-4-E4B-it\",\n", + " \"unsloth/gemma-4-31B-it\",\n", + " \"unsloth/gemma-4-26B-A4B-it\",\n", + " # Gemma-4 base models:\n", + " \"unsloth/gemma-4-E2B\",\n", + " \"unsloth/gemma-4-E4B\",\n", + " \"unsloth/gemma-4-31B\",\n", + " \"unsloth/gemma-4-26B-A4B\",\n", + "] # More models at https://huggingface.co/unsloth\n", + "\n", + "model, tokenizer = FastVisionModel.from_pretrained(\n", + " model_name = \"unsloth/gemma-4-E2B-it\",\n", + " max_seq_length = max_seq_length,\n", + " load_in_4bit = False, # False for LoRA 16bit\n", + " fast_inference = False, # Enable vllm fast inference\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To do efficient RL, we will use [LoRA](https://arxiv.org/abs/2106.09685), which allows us to only add 1 to 5% of extra weights to the model for finetuning purposes. This allows us to save memory usage by over 60%, and yet it retains good accuracy." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "model = FastVisionModel.get_peft_model(\n", + " model,\n", + " r = lora_rank, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128\n", + " target_modules = [\n", + " \"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", + " \"gate_proj\", \"up_proj\", \"down_proj\",\n", + " ],\n", + " lora_alpha = lora_rank*2, # *2 speeds up training\n", + " use_gradient_checkpointing = \"unsloth\", # Reduces memory usage\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2048 game\n", + "\n", + "We used GPT-5 to create a variant of the 2048 game. It should output the current game board state, and allow us to advance the game board state with 1 action (up, down, left, right)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#@title (Collapsible) 2048 Game Implementation\n", + "from dataclasses import dataclass, field\n", + "from typing import List, Tuple, Optional\n", + "import random\n", + "import copy\n", + "\n", + "def _compress_and_merge_row_left(row: List[int]) -> Tuple[List[int], int, bool]:\n", + " n = len(row)\n", + " tiles = [x for x in row if x != 0]\n", + " gained = 0\n", + " i = 0\n", + " merged = []\n", + " while i < len(tiles):\n", + " if i + 1 < len(tiles) and tiles[i] == tiles[i + 1]:\n", + " v = tiles[i] * 2\n", + " gained += v\n", + " merged.append(v)\n", + " i += 2\n", + " else:\n", + " merged.append(tiles[i])\n", + " i += 1\n", + " merged += [0] * (n - len(merged))\n", + " changed = merged != row\n", + " return merged, gained, changed\n", + "\n", + "def _move_left(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]:\n", + " changed_any = False\n", + " total_gain = 0\n", + " new_board = []\n", + " for row in board:\n", + " new_row, gained, changed = _compress_and_merge_row_left(row)\n", + " new_board.append(new_row)\n", + " total_gain += gained\n", + " changed_any = changed_any or changed\n", + " return new_board, total_gain, changed_any\n", + "\n", + "def _move_right(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]:\n", + " changed_any = False\n", + " total_gain = 0\n", + " new_board = []\n", + " for row in board:\n", + " rev = list(reversed(row))\n", + " new_rev, gained, changed = _compress_and_merge_row_left(rev)\n", + " new_row = list(reversed(new_rev))\n", + " new_board.append(new_row)\n", + " total_gain += gained\n", + " changed_any = changed_any or changed\n", + " return new_board, total_gain, changed_any\n", + "\n", + "def _transpose(board: List[List[int]]) -> List[List[int]]:\n", + " return [list(row) for row in zip(*board)]\n", + "\n", + "def _move_up(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]:\n", + " t = _transpose(board)\n", + " moved, gain, changed = _move_left(t)\n", + " return _transpose(moved), gain, changed\n", + "\n", + "def _move_down(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]:\n", + " t = _transpose(board)\n", + " moved, gain, changed = _move_right(t)\n", + " return _transpose(moved), gain, changed\n", + "\n", + "def _empty_cells(board: List[List[int]]) -> List[Tuple[int, int]]:\n", + " size = len(board)\n", + " return [(r, c) for r in range(size) for c in range(size) if board[r][c] == 0]\n", + "\n", + "def _can_move(board: List[List[int]]) -> bool:\n", + " if _empty_cells(board):\n", + " return True\n", + " size = len(board)\n", + " for r in range(size):\n", + " for c in range(size - 1):\n", + " if board[r][c] == board[r][c + 1]:\n", + " return True\n", + " for r in range(size - 1):\n", + " for c in range(size):\n", + " if board[r][c] == board[r + 1][c]:\n", + " return True\n", + " return False\n", + "\n", + "@dataclass\n", + "class GameBoard:\n", + " size: int\n", + " seed: Optional[int] = None\n", + " target: int = 2048\n", + " probability_fours: float = 0.10 # originally spawns (4) 10% of the time!\n", + " _rng: random.Random = field(init = False, repr = False)\n", + " _board: List[List[int]] = field(init = False, repr = False)\n", + " _score: int = field(default = 0, init = False, repr = False)\n", + " _state: str = field(default = \"ongoing\", init = False, repr = False)\n", + "\n", + " def __post_init__(self):\n", + " if self.size < 2:\n", + " raise ValueError(\"Board size must be at least 2.\")\n", + " self._rng = random.Random(self.seed)\n", + " self._board = [[0 for _ in range(self.size)] for _ in range(self.size)]\n", + " self._add_random_tile()\n", + " self._add_random_tile()\n", + " self._update_state_after_change()\n", + "\n", + " class _BoardView:\n", + " def __init__(self, game: \"GameBoard\"):\n", + " self._game = game\n", + " def __iter__(self):\n", + " return iter(self._game._board)\n", + " def __len__(self):\n", + " return len(self._game._board)\n", + " def __getitem__(self, idx):\n", + " return self._game._board[idx]\n", + " def __repr__(self) -> str:\n", + " return repr(self._game._board)\n", + " __str__ = __repr__\n", + " def do_action(self, key: str) -> None:\n", + " self._game.do_action(key)\n", + " def state(self) -> str:\n", + " return self._game.state()\n", + " def pretty(self, colors: bool = True, border: bool = True, dot_for_zero: bool = True) -> str:\n", + " return self._game._render_pretty(colors = colors, border = border, dot_for_zero = dot_for_zero)\n", + "\n", + " def board(self) -> \"_BoardView\":\n", + " return GameBoard._BoardView(self)\n", + " def state(self) -> str:\n", + " return self._state\n", + " def score(self) -> int:\n", + " return self._score\n", + " def do_action(self, key: str) -> None:\n", + " if self._state != \"ongoing\":\n", + " return\n", + " if not isinstance(key, str) or len(key) == 0:\n", + " self._state = \"failed\"\n", + " return\n", + " k = key.strip().lower()\n", + " if k == \"q\":\n", + " self._state = \"failed\"\n", + " return\n", + " move_map = {\"a\": _move_left, \"d\": _move_right, \"w\": _move_up, \"s\": _move_down}\n", + " if k not in move_map:\n", + " self._state = \"failed\"\n", + " return\n", + " mover = move_map[k]\n", + " new_board, gain, changed = mover(self._board)\n", + " if changed:\n", + " self._board = new_board\n", + " self._score += gain\n", + " self._add_random_tile()\n", + " self._update_state_after_change()\n", + " def _add_random_tile(self) -> bool:\n", + " empties = _empty_cells(self._board)\n", + " if not empties:\n", + " return False\n", + " r, c = self._rng.choice(empties)\n", + " self._board[r][c] = 4 if self._rng.random() < self.probability_fours else 2\n", + " return True\n", + " def _update_state_after_change(self) -> None:\n", + " if any(self.target in row for row in self._board):\n", + " self._state = \"success\"\n", + " return\n", + " if not _can_move(self._board):\n", + " self._state = \"failed\"\n", + " return\n", + " self._state = \"ongoing\"\n", + " def _render_pretty(self, colors: bool = True, border: bool = True, dot_for_zero: bool = True) -> str:\n", + " \"\"\"\n", + " Pretty-print the board with colors that scale from 0 up to self.target.\n", + " Uses ANSI 256-color codes (works in most terminals). Set colors = False to disable.\n", + " \"\"\"\n", + " import math\n", + "\n", + " b = self._board\n", + " mx = max((max(row) for row in b), default = 0)\n", + " cell_w = max(3, len(str(mx)))\n", + "\n", + " RESET = \"\\x1b[0m\"\n", + "\n", + " # A smooth-ish gradient from cool → warm\n", + " # (blue/cyan/green → yellow/orange/red). Tweak or expand as you like.\n", + " GRAD = [33, 39, 45, 51, 50, 49, 48, 47, 46, 82, 118, 154, 190, 226, 220, 214, 208, 202, 196]\n", + " ZERO_FG = 239 # dim gray\n", + "\n", + " def color_code(v: int) -> str:\n", + " if not colors:\n", + " return \"\"\n", + " if v == 0:\n", + " return f\"\\x1b[38;5;{ZERO_FG}m\"\n", + " # Normalize by exponent relative to target: r in [0,1]\n", + " t = max(2, self.target) # safety; avoid log2(1)\n", + " # Guard: if v is not a power of two or is <1, handle gracefully\n", + " try:\n", + " r = max(0.0, min(1.0, math.log2(v) / math.log2(t)))\n", + " except ValueError:\n", + " r = 0.0\n", + " idx = int(round(r * (len(GRAD) - 1)))\n", + " return f\"\\x1b[38;5;{GRAD[idx]}m\"\n", + "\n", + " def fmt(v: int) -> str:\n", + " s = \".\" if (v == 0 and dot_for_zero) else str(v)\n", + " s = s.rjust(cell_w)\n", + " return color_code(v) + s + (RESET if colors else \"\")\n", + "\n", + " def hline(left: str, mid: str, right: str) -> str:\n", + " return left + mid.join(\"─\" * cell_w for _ in range(self.size)) + right\n", + "\n", + " rows = []\n", + " if border:\n", + " rows.append(hline(\"┌\", \"┬\", \"┐\"))\n", + " for r in range(self.size):\n", + " content = \"│\".join(fmt(v) for v in b[r])\n", + " rows.append((\"│\" + content + \"│\") if border else content)\n", + " if border:\n", + " rows.append(hline(\"└\" if r == self.size - 1 else \"├\",\n", + " \"┴\" if r == self.size - 1 else \"┼\",\n", + " \"┘\" if r == self.size - 1 else \"┤\"))\n", + " return \"\\n\".join(rows)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example let's create a board of size 5 X 5 and set the target to 8 instead of 2048.\n", + "\n", + "**[NOTE]** 2048 originally spawns a (4) 10% of the time! We can disable this for harder games. See [Wikipedia page](https://en.wikipedia.org/wiki/2048_(video_game)) for more details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;48m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ ongoing\n" + ] + } + ], + "source": [ + "game = GameBoard(size = 5, seed = 42, target = 8, probability_fours = 0.10)\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "GameBoard(size=5, seed=42, target=8, probability_fours=0.1)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "game" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll use WASD for the action space:\n", + "\n", + "```\n", + " W\n", + "A S D\n", + "```\n", + "Also `game.state()` will say `success` if we succeeded in getting the target!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ ongoing\n" + ] + } + ], + "source": [ + "game.do_action(\"A\")\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;48m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ ongoing\n" + ] + } + ], + "source": [ + "game.do_action(\"W\")\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ ongoing\n" + ] + } + ], + "source": [ + "game.do_action(\"D\")\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ ongoing\n" + ] + } + ], + "source": [ + "game.do_action(\"W\")\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;196m 8\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\n", + "├───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┴───┴───┘ success\n" + ] + } + ], + "source": [ + "game.do_action(\"D\")\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we do some other action that's not part of the action space, we will get an error, and the game will not accept anymore actions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───┬───┬───┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;190m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;48m 2\u001b[0m│\n", + "├───┼───┼───┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└───┴───┴───┘ failed\n" + ] + } + ], + "source": [ + "game = GameBoard(size = 3, seed = 42, target = 8, probability_fours = 0.10)\n", + "game.do_action(\"AA\") # Not in WASD\n", + "game.do_action(\"W\") # Doesn't do anything\n", + "game.do_action(\"A\") # Doesn't do anything\n", + "print(game.board().pretty(), game.state())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# RL Environment Setup\n", + "\n", + "We'll set up a function to accept some strategy that'll emit an action within `WASD` and check the game state.\n", + "\n", + "We'll also add a timer to only execute the strategy for 2 seconds maximum, otherwise it might never terminate!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Callable\n", + "from unsloth import execute_with_time_limit\n", + "\n", + "def _execute_strategy(strategy : Callable, game : GameBoard):\n", + " assert callable(strategy)\n", + "\n", + " steps = 0\n", + " while game.state() == \"ongoing\":\n", + " action = strategy(list(game.board()))\n", + " steps += 1\n", + " if type(action) is not str:\n", + " return steps, \"failed\"\n", + " game.do_action(action)\n", + " return steps, game.state()\n", + "\n", + "@execute_with_time_limit(2)\n", + "def execute_strategy(strategy : Callable, game : GameBoard):\n", + " return _execute_strategy(strategy, game)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a generic strategy to just hit `W`. We should expect this generic strategy to fail:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Timed out with error = Timed out after 2s\n" + ] + } + ], + "source": [ + "def always_move_left(board):\n", + " return \"W\"\n", + "\n", + "game = GameBoard(size = 8, seed = 42, target = 2048, probability_fours = 0.10)\n", + "try:\n", + " execute_strategy(always_move_left, game)\n", + "except TimeoutError as e:\n", + " print(f\"Timed out with error = {str(e)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To allow longer strategies for Gemma 4 Reinforcement Learning, we shall allow a 5 second timer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@execute_with_time_limit(5)\n", + "def execute_strategy(strategy : Callable, game : GameBoard):\n", + " return _execute_strategy(strategy, game)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Code Execution\n", + "\n", + "To execute and create a new Python function, we first have to check if the function does not call other global variables or cheat. This is called `countering reward hacking` since we don't want the function to cheat.\n", + "\n", + "For example the below piece of code is fine, since it only imports Python level functions. We use `check_python_modules`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Only Python imports? True\n", + "{'stdlib': ['math', 'typing'], 'non_stdlib': [], 'relative_imports': 0}\n" + ] + } + ], + "source": [ + "from unsloth import check_python_modules\n", + "\n", + "sample = \"\"\"\n", + "def strategy(board):\n", + " import math\n", + " from typing import Callable\n", + " return \"W\"\n", + "\"\"\"\n", + "ok, info = check_python_modules(sample)\n", + "print(\"Only Python imports?\", ok)\n", + "print(info)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the below piece of code, since we import `numpy`, we should not allow the execution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Only Python imports? False\n", + "{'stdlib': [], 'non_stdlib': ['numpy'], 'relative_imports': 0}\n" + ] + } + ], + "source": [ + "sample = \"\"\"\n", + "def strategy(board):\n", + " from numpy import matmul\n", + " return \"W\"\n", + "\"\"\"\n", + "ok, info = check_python_modules(sample)\n", + "print(\"Only Python imports?\", ok)\n", + "print(info)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also disallow global variable access. We'll use Unsloth's `create_locked_down_function` function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name 'np' is not defined\n" + ] + } + ], + "source": [ + "from unsloth import create_locked_down_function\n", + "function = \"\"\"\n", + "def import_numpy():\n", + " np.matmul\n", + " print(\"Success\")\n", + "\"\"\"\n", + "f = create_locked_down_function(function)\n", + "try:\n", + " f()\n", + "except Exception as e:\n", + " print(str(e))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60\n" + ] + } + ], + "source": [ + "from unsloth import create_locked_down_function\n", + "function = \"\"\"\n", + "def add(a, b):\n", + " def adder(a):\n", + " return a + b\n", + " return adder(b) + b\n", + "\"\"\"\n", + "f = create_locked_down_function(function)\n", + "try:\n", + " print(f(10, 20))\n", + "except Exception as e:\n", + " print(str(e))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data & RL task setup\n", + "\n", + "We now have to create a prompt to tell the model to create a strategy for the 2048 game. You can customize this to some other task for another RL task." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Create a new short 2048 strategy using only native Python code.\n", + "You are given a list of list of numbers for the current board state.\n", + "Output one action for \"W\", \"A\", \"S\", \"D\" on what is the optimal next step.\n", + "Output your new short function in backticks using the format below:\n", + "```python\n", + "def strategy(board):\n", + " return \"W\" # Example\n", + "```\n", + "All helper functions should be inside def strategy. Only output the short function `strategy`.\n" + ] + } + ], + "source": [ + "prompt = \"\"\"\n", + "Create a new short 2048 strategy using only native Python code.\n", + "You are given a list of list of numbers for the current board state.\n", + "Output one action for \"W\", \"A\", \"S\", \"D\" on what is the optimal next step.\n", + "Output your new short function in backticks using the format below:\n", + "```python\n", + "def strategy(board):\n", + " return \"W\" # Example\n", + "```\n", + "All helper functions should be inside def strategy. Only output the short function `strategy`.\n", + "\"\"\".strip()\n", + "print(prompt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, let's prompt Gemma 4 without RL and see how it goes:" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "print(\"=\" * 50)\n", + "print(\"BASE MODEL OUTPUT (before RL training):\")\n", + "print(\"=\" * 50)\n", + "\n", + "inputs = tokenizer(\n", + " text = text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "text_streamer = TextStreamer(tokenizer, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 512,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reward functions\n", + "\n", + "We now design a `extract_function` function which simply extracts the function wrapped in 3 back ticks.\n", + "\n", + "And 3 reward functions:\n", + "\n", + "1. `function_works` which rewards the model if the strategy is a valid Python function.\n", + "2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it.\n", + "3. `strategy_succeeds` which checks if the game strategy actually succeeds in attaining 2048 after running the auto-generated strategy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def strategy(board):\n", + " return \"W\" # Example\n" + ] + } + ], + "source": [ + "def extract_function(text):\n", + " if text.count(\"```\") >= 2:\n", + " first = text.find(\"```\") + 3\n", + " second = text.find(\"```\", first)\n", + " fx = text[first : second].strip()\n", + " fx = fx.removeprefix(\"python\\n\")\n", + " fx = fx[fx.find(\"def\"):]\n", + " if fx.startswith(\"def strategy(board):\"): return fx\n", + " return None\n", + "print(extract_function(prompt))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below is our `function_works` reward function which uses Python's `exec` but guarded by not allowing leakage of local and global variables. We can also use `check_python_modules` first to check if there are errors before even executing the function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(False,\n", + " {'error': \"SyntaxError: expected '(' (, line 1)\",\n", + " 'stdlib': [],\n", + " 'non_stdlib': [],\n", + " 'relative_imports': 0})" + ], + "text/html": [ + "
(False,\n",
+       " {'error': "SyntaxError: expected '(' (<unknown>, line 1)",\n",
+       "  'stdlib': [],\n",
+       "  'non_stdlib': [],\n",
+       "  'relative_imports': 0})
" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ok, info = check_python_modules(\"def a\")\n", + "ok, info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def function_works(completions, **kwargs):\n", + " scores = []\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + " if function is None or \"error\" in info:\n", + " score = -2.0\n", + " else:\n", + " try:\n", + " new_strategy = create_locked_down_function(function)\n", + " score = 1.0\n", + " except:\n", + " score = -0.5\n", + " scores.append(score)\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`no_cheating` checks if the function cheated since it might have imported Numpy or other functions:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def no_cheating(completions, **kwargs):\n", + " scores = []\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + " scores.append(1.0 if ok else -20.0) # Penalize heavily!\n", + " else:\n", + " scores.append(-1.0) # Failed creating function\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next `strategy_succeeds` checks if the strategy actually allows the game to terminate. Imagine if the strategy simply returned \"W\" which would fail after a time limit of 10 seconds.\n", + "\n", + "We also add a global `PRINTER` to print out the strategy and board state." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "global PRINTER\n", + "PRINTER = 0\n", + "def strategy_succeeds(completions, **kwargs):\n", + " global PRINTER\n", + " scores = []\n", + " # Generate a random game board with seed\n", + " seed = np.random.randint(10000)\n", + " for completion in completions:\n", + " printed = False\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + " if PRINTER % 5 == 0:\n", + " printed = True\n", + " print(function)\n", + " PRINTER += 1\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + " if function is None or \"error\" in info:\n", + " scores.append(0)\n", + " continue\n", + " try:\n", + " new_strategy = create_locked_down_function(function)\n", + " except:\n", + " scores.append(0)\n", + " continue\n", + " try:\n", + " game = GameBoard(size = 6, seed = seed, target = 2048, probability_fours = 0.10)\n", + " steps, game_state = execute_strategy(new_strategy, game)\n", + " print(f\"Steps = {steps} State = {game_state}\")\n", + " if printed is False:\n", + " print(function)\n", + " print(game.board().pretty())\n", + " if game_state == \"success\":\n", + " scores.append(20.0) # Success - massively reward!\n", + " else:\n", + " scores.append(2.0) # Failed but function works!\n", + " except TimeoutError as e:\n", + " print(\"Timeout\")\n", + " scores.append(-1.0) # Failed with timeout\n", + " except Exception as e:\n", + " print(f\"Exception = {str(e)}\")\n", + " scores.append(-3.0) # Failed\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll now create the dataset which includes a replica of our prompt." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from datasets import Dataset\n", + "dataset = Dataset.from_list([{\"prompt\" : [{\"role\": \"user\", \"content\": prompt.strip()}], \"answer\" : 0}]*1000)\n", + "maximum_length = len(tokenizer.apply_chat_template([{\"role\":\"user\", \"content\":prompt.strip()}], add_generation_prompt = True, tokenize = True))\n", + "print(maximum_length)\n", + "dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Train the model\n", + "\n", + "Now set up GRPO Trainer and all configurations! We also support GSPO, GAPO, Dr GRPO and more! Go the Unsloth [Reinforcement Learning Docs](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) for more options." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Leave room for the prompt (plus 1 token safety margin)\n", + "max_completion_length = max_seq_length - (maximum_length + 1)\n", + "\n", + "from trl import GRPOConfig, GRPOTrainer\n", + "training_args = GRPOConfig(\n", + " temperature = 1.0,\n", + " top_p = 0.95,\n", + " top_k = 64,\n", + " learning_rate = 5e-5,\n", + " weight_decay = 0.001,\n", + " warmup_ratio = 0.1,\n", + " lr_scheduler_type = \"linear\",\n", + " optim = \"adamw_8bit\",\n", + " logging_steps = 1,\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 2, # Increase to 4 for smoother training\n", + " num_generations = 2, # Decrease if out of memory\n", + " max_completion_length = max_completion_length,\n", + " # num_train_epochs = 1, # Set to 1 for a full training run\n", + " max_steps = 60,\n", + " save_steps = 100,\n", + " report_to = \"none\", # Can use Weights & Biases, TrackIO\n", + " output_dir = \"outputs\",\n", + " epsilon = 0.2,\n", + " epsilon_high = 0.28, # one sided\n", + " delta = 1.5, # two sided\n", + " loss_type = 'bnpo',\n", + " mask_truncated_completions = True\n", + " # For optional training + evaluation\n", + " # fp16_full_eval = True,\n", + " # per_device_eval_batch_size = 4,\n", + " # eval_accumulation_steps = 1,\n", + " # eval_strategy = \"steps\",\n", + " # eval_steps = 1,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase!\n", + "\n", + "You might have to wait 150 to 200 steps for any action. You'll probably get 0 reward for the first 100 steps. Please be patient!\n", + "\n", + "| Step | Training Loss | reward | reward_std | completion_length | kl |\n", + "|------|---------------|-----------|------------|-------------------|----------|\n", + "| 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 |\n", + "| 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 |\n", + "| 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# For optional training + evaluation\n", + "# new_dataset = dataset.train_test_split(test_size = 0.01)\n", + "\n", + "trainer = GRPOTrainer(\n", + " model = model,\n", + " processing_class = tokenizer,\n", + " reward_funcs = [\n", + " function_works,\n", + " no_cheating,\n", + " strategy_succeeds,\n", + " ],\n", + " args = training_args,\n", + " train_dataset = dataset,\n", + "\n", + " # For optional training + evaluation\n", + " # train_dataset = new_dataset[\"train\"],\n", + " # eval_dataset = new_dataset[\"test\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's train the model!\n", + "\n", + "**NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 199998}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 1,000 | Num Epochs = 1 | Total steps = 600\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 1\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 1 x 1) = 2\n", + " \"-____-\" Trainable parameters = 1,990,656 of 20,916,747,840 (0.01% trained)\n", + "`generation_config` default values have been modified to match model-specific defaults: {'max_length': 131072}. If this is not desired, please set these values explicitly.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [434/600 4:48:18 < 1:50:46, 0.02 it/s, Epoch 0.43/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Lossrewardreward_stdcompletions / mean_lengthcompletions / min_lengthcompletions / max_lengthcompletions / clipped_ratiocompletions / mean_terminated_lengthcompletions / min_terminated_lengthcompletions / max_terminated_lengthklrewards / function_works / meanrewards / function_works / stdrewards / no_cheating / meanrewards / no_cheating / stdrewards / strategy_succeeds / meanrewards / strategy_succeeds / std
10.0000002.5000002.121320429.500000427.000000432.0000000.000000429.500000427.000000432.0000000.0023321.0000000.0000001.0000000.0000000.5000002.121320
20.000000-1.2500002.474874519.000000452.000000586.0000000.500000452.000000452.000000452.0000000.002923-1.2500001.0606600.0000001.4142140.0000000.000000
30.0000000.0000001.414214391.000000346.000000436.0000000.000000391.000000346.000000436.0000000.0030811.0000000.0000001.0000000.000000-2.0000001.414214
40.0000001.0000000.000000317.000000274.000000360.0000000.000000317.000000274.000000360.0000000.0035051.0000000.0000001.0000000.000000-1.0000000.000000
50.0000001.0000000.000000327.500000230.000000425.0000000.000000327.500000230.000000425.0000000.0098571.0000000.0000001.0000000.000000-1.0000000.000000
60.0000001.0000000.000000413.500000392.000000435.0000000.000000413.500000392.000000435.0000000.0010931.0000000.0000001.0000000.000000-1.0000000.000000
70.000000-1.0000002.828427433.000000280.000000586.0000000.500000280.000000280.000000280.0000000.005341-0.5000002.1213200.0000001.414214-0.5000000.707107
80.000000-1.0000002.828427505.500000425.000000586.0000000.500000425.000000425.000000425.0000000.002836-0.5000002.1213200.0000001.414214-0.5000000.707107
90.0000001.5000003.535534356.000000250.000000462.0000000.000000356.000000250.000000462.0000000.0053701.0000000.0000001.0000000.000000-0.5000003.535534
100.0000001.0000000.000000345.500000223.000000468.0000000.000000345.500000223.000000468.0000000.0061661.0000000.0000001.0000000.000000-1.0000000.000000
110.0000001.0000000.000000414.000000392.000000436.0000000.000000414.000000392.000000436.0000000.0023521.0000000.0000001.0000000.000000-1.0000000.000000
120.0000000.0000001.414214387.000000278.000000496.0000000.000000387.000000278.000000496.0000000.0055581.0000000.0000001.0000000.000000-2.0000001.414214
130.0000001.0000000.000000339.500000314.000000365.0000000.000000339.500000314.000000365.0000000.0016001.0000000.0000001.0000000.000000-1.0000000.000000
140.0000001.0000000.000000412.500000406.000000419.0000000.000000412.500000406.000000419.0000000.0017241.0000000.0000001.0000000.000000-1.0000000.000000
150.000000-2.0000001.414214556.500000527.000000586.0000000.500000527.000000527.000000527.0000000.002466-0.5000002.1213200.0000001.414214-1.5000002.121320
160.000000-1.0000002.828427520.500000455.000000586.0000000.500000455.000000455.000000455.0000000.002554-0.5000002.1213200.0000001.414214-0.5000000.707107
170.000000-1.0000002.828427439.500000293.000000586.0000000.500000293.000000293.000000293.0000000.007403-0.5000002.1213200.0000001.414214-0.5000000.707107
180.000000-10.50000016.263456472.000000449.000000495.0000000.000000472.000000449.000000495.0000000.002674-0.5000002.121320-9.50000014.849242-0.5000000.707107
190.0000000.0000001.414214432.000000348.000000516.0000000.000000432.000000348.000000516.0000000.0107181.0000000.0000001.0000000.000000-2.0000001.414214
200.000000-2.0000001.414214458.000000330.000000586.0000000.500000330.000000330.000000330.0000000.017924-0.5000002.1213200.0000001.414214-1.5000002.121320
210.000000-2.0000001.414214487.000000388.000000586.0000000.500000388.000000388.000000388.0000000.022975-0.5000002.1213200.0000001.414214-1.5000002.121320
220.000000-1.0000002.828427506.000000426.000000586.0000000.500000426.000000426.000000426.0000000.015738-0.5000002.1213200.0000001.414214-0.5000000.707107
230.0000001.0000000.000000436.500000382.000000491.0000000.000000436.500000382.000000491.0000000.0357681.0000000.0000001.0000000.000000-1.0000000.000000
240.0000000.0000001.414214365.500000359.000000372.0000000.000000365.500000359.000000372.0000000.0020271.0000000.0000001.0000000.000000-2.0000001.414214
250.000100-1.0000002.828427481.000000376.000000586.0000000.500000376.000000376.000000376.0000000.092577-0.5000002.1213200.0000001.414214-0.5000000.707107
260.0001001.0000000.000000490.500000427.000000554.0000000.000000490.500000427.000000554.0000000.0682581.0000000.0000001.0000000.000000-1.0000000.000000
270.0000001.0000000.000000329.000000296.000000362.0000000.000000329.000000296.000000362.0000000.0434971.0000000.0000001.0000000.000000-1.0000000.000000
280.000300-10.50000016.263456350.500000191.000000510.0000000.000000350.500000191.000000510.0000000.306294-0.5000002.121320-9.50000014.849242-0.5000000.707107
290.000100-1.0000002.828427517.500000449.000000586.0000000.500000449.000000449.000000449.0000000.139758-0.5000002.1213200.0000001.414214-0.5000000.707107
300.0001000.0000001.414214426.500000374.000000479.0000000.000000426.500000374.000000479.0000000.1216261.0000000.0000001.0000000.000000-2.0000001.414214
310.0001000.0000001.414214365.500000343.000000388.0000000.000000365.500000343.000000388.0000000.0610041.0000000.0000001.0000000.000000-2.0000001.414214
320.000200-11.50000014.849242404.000000356.000000452.0000000.000000404.000000356.000000452.0000000.162440-0.5000002.121320-9.50000014.849242-1.5000002.121320
330.00020010.50000016.263456366.500000317.000000416.0000000.000000366.500000317.000000416.0000000.2124881.0000000.0000001.0000000.0000008.50000016.263456
340.000400-2.0000001.414214493.500000401.000000586.0000000.500000401.000000401.000000401.0000000.391830-0.5000002.1213200.0000001.414214-1.5000002.121320
350.00010011.50000014.849242472.500000439.000000506.0000000.000000472.500000439.000000506.0000000.1377451.0000000.0000001.0000000.0000009.50000014.849242
360.0004001.0000000.000000427.500000353.000000502.0000000.000000427.500000353.000000502.0000000.3793351.0000000.0000001.0000000.000000-1.0000000.000000
370.0001001.0000000.000000352.500000327.000000378.0000000.000000352.500000327.000000378.0000000.1343681.0000000.0000001.0000000.000000-1.0000000.000000
380.0000000.0000001.414214364.000000356.000000372.0000000.000000364.000000356.000000372.0000000.0141641.0000000.0000001.0000000.000000-2.0000001.414214
390.0006001.0000000.000000389.500000303.000000476.0000000.000000389.500000303.000000476.0000000.6047661.0000000.0000001.0000000.000000-1.0000000.000000
400.0006000.0000001.414214352.000000262.000000442.0000000.000000352.000000262.000000442.0000000.5887451.0000000.0000001.0000000.000000-2.0000001.414214
410.0000000.0000001.414214419.500000405.000000434.0000000.000000419.500000405.000000434.0000000.0483871.0000000.0000001.0000000.000000-2.0000001.414214
420.0010000.5000004.949748396.500000207.000000586.0000000.500000207.000000207.000000207.0000000.962396-0.5000002.1213200.0000001.4142141.0000001.414214
430.000900-1.0000002.828427443.500000301.000000586.0000000.500000301.000000301.000000301.0000000.862072-0.5000002.1213200.0000001.414214-0.5000000.707107
440.0007001.0000000.000000453.500000325.000000582.0000000.000000453.500000325.000000582.0000000.7362911.0000000.0000001.0000000.000000-1.0000000.000000
450.0001001.0000000.000000502.000000483.000000521.0000000.000000502.000000483.000000521.0000000.0810931.0000000.0000001.0000000.000000-1.0000000.000000
460.0005001.0000000.000000404.000000327.000000481.0000000.000000404.000000327.000000481.0000000.4832801.0000000.0000001.0000000.000000-1.0000000.000000
470.0002000.5000004.949748548.000000510.000000586.0000000.500000510.000000510.000000510.0000000.195080-0.5000002.1213200.0000001.4142141.0000001.414214
480.000900-1.0000000.000000383.000000262.000000504.0000000.000000383.000000262.000000504.0000000.8648011.0000000.0000001.0000000.000000-3.0000000.000000
490.0000000.0000001.414214407.000000395.000000419.0000000.000000407.000000395.000000419.0000000.0395481.0000000.0000001.0000000.000000-2.0000001.414214
500.0004000.0000001.414214393.500000336.000000451.0000000.000000393.500000336.000000451.0000000.4431141.0000000.0000001.0000000.000000-2.0000001.414214
510.001000-1.0000002.828427440.000000294.000000586.0000000.500000294.000000294.000000294.0000001.009106-0.5000002.1213200.0000001.414214-0.5000000.707107
520.0001000.0000001.414214411.500000398.000000425.0000000.000000411.500000398.000000425.0000000.0659661.0000000.0000001.0000000.000000-2.0000001.414214
530.0001000.0000001.414214408.000000392.000000424.0000000.000000408.000000392.000000424.0000000.0854531.0000000.0000001.0000000.000000-2.0000001.414214
540.0006000.0000001.414214393.000000316.000000470.0000000.000000393.000000316.000000470.0000000.6053831.0000000.0000001.0000000.000000-2.0000001.414214
550.0003002.5000002.121320462.500000411.000000514.0000000.000000462.500000411.000000514.0000000.3361331.0000000.0000001.0000000.0000000.5000002.121320
560.0023001.0000000.000000236.50000035.000000438.0000000.000000236.50000035.000000438.0000002.3390791.0000000.0000001.0000000.000000-1.0000000.000000
570.0002001.0000000.000000378.500000350.000000407.0000000.000000378.500000350.000000407.0000000.2306871.0000000.0000001.0000000.000000-1.0000000.000000
580.0003001.0000000.000000362.000000324.000000400.0000000.000000362.000000324.000000400.0000000.2884071.0000000.0000001.0000000.000000-1.0000000.000000
590.0008000.0000001.414214362.000000273.000000451.0000000.000000362.000000273.000000451.0000000.8424411.0000000.0000001.0000000.000000-2.0000001.414214
600.0003002.5000002.121320377.500000342.000000413.0000000.000000377.500000342.000000413.0000000.3040211.0000000.0000001.0000000.0000000.5000002.121320
610.0023001.0000000.000000416.000000378.000000454.0000000.000000416.000000378.000000454.0000002.2973661.0000000.0000001.0000000.000000-1.0000000.000000
620.0036000.0000001.414214388.500000280.000000497.0000000.000000388.500000280.000000497.0000003.6217141.0000000.0000001.0000000.000000-2.0000001.414214
630.0012009.50000017.677670540.000000494.000000586.0000000.500000494.000000494.000000494.0000001.174912-0.5000002.1213200.0000001.41421410.00000014.142136
640.0030000.0000001.414214356.500000321.000000392.0000000.000000356.500000321.000000392.0000003.0252011.0000000.0000001.0000000.000000-2.0000001.414214
650.001600-1.0000002.828427525.000000464.000000586.0000000.500000464.000000464.000000464.0000001.621681-0.5000002.1213200.0000001.414214-0.5000000.707107
660.001400-2.0000001.414214479.500000373.000000586.0000000.500000373.000000373.000000373.0000001.405418-0.5000002.1213200.0000001.414214-1.5000002.121320
670.0002000.0000001.414214501.500000469.000000534.0000000.000000501.500000469.000000534.0000000.2016201.0000000.0000001.0000000.000000-2.0000001.414214
680.000600-2.0000001.414214504.500000423.000000586.0000000.500000423.000000423.000000423.0000000.587288-0.5000002.1213200.0000001.414214-1.5000002.121320
690.0000001.0000000.000000378.000000370.000000386.0000000.000000378.000000370.000000386.0000000.0167461.0000000.0000001.0000000.000000-1.0000000.000000
700.0005001.0000000.000000453.500000372.000000535.0000000.000000453.500000372.000000535.0000000.5171991.0000000.0000001.0000000.000000-1.0000000.000000
710.000200-1.0000002.828427556.000000526.000000586.0000000.500000526.000000526.000000526.0000000.162072-0.5000002.1213200.0000001.414214-0.5000000.707107
720.0003000.0000001.414214359.500000322.000000397.0000000.000000359.500000322.000000397.0000000.3144931.0000000.0000001.0000000.000000-2.0000001.414214
730.0010001.0000000.000000378.000000252.000000504.0000000.000000378.000000252.000000504.0000000.9837421.0000000.0000001.0000000.000000-1.0000000.000000
740.0010001.0000000.000000324.500000211.000000438.0000000.000000324.500000211.000000438.0000000.9509151.0000000.0000001.0000000.000000-1.0000000.000000
750.000700-1.0000002.828427488.000000390.000000586.0000000.500000390.000000390.000000390.0000000.661162-0.5000002.1213200.0000001.414214-0.5000000.707107
760.000100-1.0000000.000000327.500000314.000000341.0000000.000000327.500000314.000000341.0000000.0687571.0000000.0000001.0000000.000000-3.0000000.000000
770.0014001.0000000.000000309.000000176.000000442.0000000.000000309.000000176.000000442.0000001.4291871.0000000.0000001.0000000.000000-1.0000000.000000
780.000000-1.0000000.000000414.500000406.000000423.0000000.000000414.500000406.000000423.0000000.0215601.0000000.0000001.0000000.000000-3.0000000.000000
790.0002002.5000002.121320444.500000406.000000483.0000000.000000444.500000406.000000483.0000000.2296701.0000000.0000001.0000000.0000000.5000002.121320
800.0001000.0000001.414214468.500000441.000000496.0000000.000000468.500000441.000000496.0000000.1382391.0000000.0000001.0000000.000000-2.0000001.414214
810.0002002.5000002.121320422.000000391.000000453.0000000.000000422.000000391.000000453.0000000.2130071.0000000.0000001.0000000.0000000.5000002.121320
820.0002001.0000000.000000411.000000376.000000446.0000000.000000411.000000376.000000446.0000000.1957461.0000000.0000001.0000000.000000-1.0000000.000000
830.000200-10.50000016.263456352.500000323.000000382.0000000.000000352.500000323.000000382.0000000.177328-0.5000002.121320-9.50000014.849242-0.5000000.707107
840.0005001.0000000.000000421.000000345.000000497.0000000.000000421.000000345.000000497.0000000.5336361.0000000.0000001.0000000.000000-1.0000000.000000
850.0000000.0000001.414214378.000000370.000000386.0000000.000000378.000000370.000000386.0000000.0306391.0000000.0000001.0000000.000000-2.0000001.414214
860.00010011.50000014.849242369.000000349.000000389.0000000.000000369.000000349.000000389.0000000.1138981.0000000.0000001.0000000.0000009.50000014.849242
870.0005001.0000000.000000399.000000327.000000471.0000000.000000399.000000327.000000471.0000000.5282621.0000000.0000001.0000000.000000-1.0000000.000000
880.0003000.0000001.414214315.000000281.000000349.0000000.000000315.000000281.000000349.0000000.2855101.0000000.0000001.0000000.000000-2.0000001.414214
890.0009000.0000001.414214394.500000270.000000519.0000000.000000394.500000270.000000519.0000000.9458251.0000000.0000001.0000000.000000-2.0000001.414214
900.0004001.0000000.000000385.500000339.000000432.0000000.000000385.500000339.000000432.0000000.3665691.0000000.0000001.0000000.000000-1.0000000.000000
910.0004001.0000000.000000319.500000272.000000367.0000000.000000319.500000272.000000367.0000000.4082001.0000000.0000001.0000000.000000-1.0000000.000000
920.0002002.5000002.121320399.500000375.000000424.0000000.000000399.500000375.000000424.0000000.1802631.0000000.0000001.0000000.0000000.5000002.121320
930.000900-1.0000000.000000319.000000228.000000410.0000000.000000319.000000228.000000410.0000000.8569831.0000000.0000001.0000000.000000-3.0000000.000000
940.0000000.0000001.414214364.500000362.000000367.0000000.000000364.500000362.000000367.0000000.0094201.0000000.0000001.0000000.000000-2.0000001.414214
950.0002002.5000002.121320431.000000402.000000460.0000000.000000431.000000402.000000460.0000000.2009821.0000000.0000001.0000000.0000000.5000002.121320
960.0002001.0000000.000000531.000000493.000000569.0000000.000000531.000000493.000000569.0000000.2307571.0000000.0000001.0000000.000000-1.0000000.000000
970.000800-1.0000002.828427488.000000390.000000586.0000000.500000390.000000390.000000390.0000000.789454-0.5000002.1213200.0000001.414214-0.5000000.707107
980.0007001.0000000.000000331.000000234.000000428.0000000.000000331.000000234.000000428.0000000.7361851.0000000.0000001.0000000.000000-1.0000000.000000
990.0003002.5000002.121320462.000000422.000000502.0000000.000000462.000000422.000000502.0000000.2865631.0000000.0000001.0000000.0000000.5000002.121320
1000.0000001.0000000.000000443.500000436.000000451.0000000.000000443.500000436.000000451.0000000.0223891.0000000.0000001.0000000.000000-1.0000000.000000
1010.0000001.0000000.000000417.500000413.000000422.0000000.000000417.500000413.000000422.0000000.0092631.0000000.0000001.0000000.000000-1.0000000.000000
1020.0005001.0000000.000000349.000000296.000000402.0000000.000000349.000000296.000000402.0000000.4790791.0000000.0000001.0000000.000000-1.0000000.000000
1030.0001000.0000001.414214349.000000336.000000362.0000000.000000349.000000336.000000362.0000000.0816611.0000000.0000001.0000000.000000-2.0000001.414214
1040.0000000.0000001.414214487.000000485.000000489.0000000.000000487.000000485.000000489.0000000.0055311.0000000.0000001.0000000.000000-2.0000001.414214
1050.0001000.0000001.414214386.000000371.000000401.0000000.000000386.000000371.000000401.0000000.0884441.0000000.0000001.0000000.000000-2.0000001.414214
1060.0000002.5000002.121320486.000000481.000000491.0000000.000000486.000000481.000000491.0000000.0094481.0000000.0000001.0000000.0000000.5000002.121320
1070.0008001.0000000.000000317.500000225.000000410.0000000.000000317.500000225.000000410.0000000.8098161.0000000.0000001.0000000.000000-1.0000000.000000
1080.0006001.0000000.000000385.000000304.000000466.0000000.000000385.000000304.000000466.0000000.6036381.0000000.0000001.0000000.000000-1.0000000.000000
1090.00040011.50000014.849242431.000000368.000000494.0000000.000000431.000000368.000000494.0000000.4433671.0000000.0000001.0000000.0000009.50000014.849242
1100.0003002.5000002.121320391.000000350.000000432.0000000.000000391.000000350.000000432.0000000.2686841.0000000.0000001.0000000.0000000.5000002.121320
1110.0002001.0000000.000000463.500000427.000000500.0000000.000000463.500000427.000000500.0000000.2269921.0000000.0000001.0000000.000000-1.0000000.000000
1120.00010011.50000014.849242441.500000425.000000458.0000000.000000441.500000425.000000458.0000000.0883751.0000000.0000001.0000000.0000009.50000014.849242
1130.000500-1.0000002.828427513.000000440.000000586.0000000.500000440.000000440.000000440.0000000.507206-0.5000002.1213200.0000001.414214-0.5000000.707107
1140.0005001.0000000.000000475.000000403.000000547.0000000.000000475.000000403.000000547.0000000.4767341.0000000.0000001.0000000.000000-1.0000000.000000
1150.0003001.0000000.000000472.000000427.000000517.0000000.000000472.000000427.000000517.0000000.3252481.0000000.0000001.0000000.000000-1.0000000.000000
1160.0001000.0000001.414214387.000000375.000000399.0000000.000000387.000000375.000000399.0000000.0529311.0000000.0000001.0000000.000000-2.0000001.414214
1170.000300-1.0000002.828427547.000000508.000000586.0000000.500000508.000000508.000000508.0000000.258358-0.5000002.1213200.0000001.414214-0.5000000.707107
1180.0001001.0000000.000000457.500000434.000000481.0000000.000000457.500000434.000000481.0000000.1492021.0000000.0000001.0000000.000000-1.0000000.000000
1190.0000001.0000000.000000411.000000407.000000415.0000000.000000411.000000407.000000415.0000000.0091521.0000000.0000001.0000000.000000-1.0000000.000000
1200.0001001.0000000.000000456.000000441.000000471.0000000.000000456.000000441.000000471.0000000.0834701.0000000.0000001.0000000.000000-1.0000000.000000
1210.0002001.0000000.000000448.500000414.000000483.0000000.000000448.500000414.000000483.0000000.2414331.0000000.0000001.0000000.000000-1.0000000.000000
1220.0005001.0000000.000000347.500000291.000000404.0000000.000000347.500000291.000000404.0000000.4966671.0000000.0000001.0000000.000000-1.0000000.000000
1230.000700-1.0000002.828427485.000000384.000000586.0000000.500000384.000000384.000000384.0000000.706807-0.5000002.1213200.0000001.414214-0.5000000.707107
1240.00000011.50000014.849242275.500000266.000000285.0000000.000000275.500000266.000000285.0000000.0477161.0000000.0000001.0000000.0000009.50000014.849242
1250.0001001.0000000.000000439.500000417.000000462.0000000.000000439.500000417.000000462.0000000.1391991.0000000.0000001.0000000.000000-1.0000000.000000
1260.000300-10.50000016.263456402.500000349.000000456.0000000.000000402.500000349.000000456.0000000.339013-0.5000002.121320-9.50000014.849242-0.5000000.707107
1270.000800-1.0000002.828427468.500000351.000000586.0000000.500000351.000000351.000000351.0000000.831395-0.5000002.1213200.0000001.414214-0.5000000.707107
1280.0000001.0000000.000000452.000000445.000000459.0000000.000000452.000000445.000000459.0000000.0236881.0000000.0000001.0000000.000000-1.0000000.000000
1290.0000001.0000000.000000481.000000469.000000493.0000000.000000481.000000469.000000493.0000000.0424061.0000000.0000001.0000000.000000-1.0000000.000000
1300.000700-1.0000002.828427480.000000374.000000586.0000000.500000374.000000374.000000374.0000000.701966-0.5000002.1213200.0000001.414214-0.5000000.707107
1310.0003001.0000000.000000365.500000325.000000406.0000000.000000365.500000325.000000406.0000000.3421121.0000000.0000001.0000000.000000-1.0000000.000000
1320.0002001.0000000.000000393.000000358.000000428.0000000.000000393.000000358.000000428.0000000.2373561.0000000.0000001.0000000.000000-1.0000000.000000
1330.0000001.0000000.000000454.500000443.000000466.0000000.000000454.500000443.000000466.0000000.0489991.0000000.0000001.0000000.000000-1.0000000.000000
1340.0002000.0000001.414214371.000000347.000000395.0000000.000000371.000000347.000000395.0000000.1542941.0000000.0000001.0000000.000000-2.0000001.414214
1350.0000000.0000001.414214538.500000529.000000548.0000000.000000538.500000529.000000548.0000000.0377931.0000000.0000001.0000000.000000-2.0000001.414214
1360.0002000.0000001.414214367.500000339.000000396.0000000.000000367.500000339.000000396.0000000.1558491.0000000.0000001.0000000.000000-2.0000001.414214
1370.000000-10.50000016.263456525.500000523.000000528.0000000.000000525.500000523.000000528.0000000.009064-0.5000002.121320-9.50000014.849242-0.5000000.707107
1380.0002000.0000001.414214456.000000419.000000493.0000000.000000456.000000419.000000493.0000000.2101611.0000000.0000001.0000000.000000-2.0000001.414214
1390.0000001.0000000.000000377.000000367.000000387.0000000.000000377.000000367.000000387.0000000.0374561.0000000.0000001.0000000.000000-1.0000000.000000
1400.0003001.0000000.000000399.500000351.000000448.0000000.000000399.500000351.000000448.0000000.3024181.0000000.0000001.0000000.000000-1.0000000.000000
1410.0008001.0000000.000000311.000000234.000000388.0000000.000000311.000000234.000000388.0000000.7590171.0000000.0000001.0000000.000000-1.0000000.000000
1420.0005000.7500000.353553453.000000382.000000524.0000000.000000453.000000382.000000524.0000000.4695940.2500001.0606601.0000000.000000-0.5000000.707107
1430.0007001.0000000.000000453.500000344.000000563.0000000.000000453.500000344.000000563.0000000.7319241.0000000.0000001.0000000.000000-1.0000000.000000
1440.00040010.50000016.263456402.000000344.000000460.0000000.000000402.000000344.000000460.0000000.4003661.0000000.0000001.0000000.0000008.50000016.263456
1450.0000001.0000000.000000457.500000446.000000469.0000000.000000457.500000446.000000469.0000000.0439441.0000000.0000001.0000000.000000-1.0000000.000000
1460.0008000.0000001.414214431.000000333.000000529.0000000.000000431.000000333.000000529.0000000.7867331.0000000.0000001.0000000.000000-2.0000001.414214
1470.000400-1.0000002.828427523.500000461.000000586.0000000.500000461.000000461.000000461.0000000.439689-0.5000002.1213200.0000001.414214-0.5000000.707107
1480.0001001.0000000.000000399.500000377.000000422.0000000.000000399.500000377.000000422.0000000.1437651.0000000.0000001.0000000.000000-1.0000000.000000
1490.0009001.0000000.000000321.500000237.000000406.0000000.000000321.500000237.000000406.0000000.8788361.0000000.0000001.0000000.000000-1.0000000.000000
1500.0001001.0000000.000000400.500000374.000000427.0000000.000000400.500000374.000000427.0000000.1433601.0000000.0000001.0000000.000000-1.0000000.000000
1510.0000001.0000000.000000332.500000328.000000337.0000000.000000332.500000328.000000337.0000000.0173931.0000000.0000001.0000000.000000-1.0000000.000000
1520.000100-1.0000002.828427557.000000528.000000586.0000000.500000528.000000528.000000528.0000000.117714-0.5000002.1213200.0000001.414214-0.5000000.707107
1530.0001001.0000000.000000390.000000376.000000404.0000000.000000390.000000376.000000404.0000000.0627301.0000000.0000001.0000000.000000-1.0000000.000000
1540.000000-3.0000000.000000586.000000586.000000586.0000001.0000000.0000000.0000000.0000000.006829-2.0000000.000000-1.0000000.0000000.0000000.000000
1550.0003001.0000000.000000431.500000397.000000466.0000000.000000431.500000397.000000466.0000000.2810811.0000000.0000001.0000000.000000-1.0000000.000000
1560.000500-2.0000001.414214513.500000441.000000586.0000000.500000441.000000441.000000441.0000000.498690-0.5000002.1213200.0000001.414214-1.5000002.121320
1570.0003001.0000000.000000530.000000485.000000575.0000000.000000530.000000485.000000575.0000000.3169011.0000000.0000001.0000000.000000-1.0000000.000000
1580.000800-1.0000002.828427466.500000347.000000586.0000000.500000347.000000347.000000347.0000000.753139-0.5000002.1213200.0000001.414214-0.5000000.707107
1590.000900-1.0000002.828427462.500000339.000000586.0000000.500000339.000000339.000000339.0000000.947311-0.5000002.1213200.0000001.414214-0.5000000.707107
1600.0003000.0000001.414214489.000000439.000000539.0000000.000000489.000000439.000000539.0000000.3256181.0000000.0000001.0000000.000000-2.0000001.414214
1610.00010011.50000014.849242485.500000470.000000501.0000000.000000485.500000470.000000501.0000000.0795201.0000000.0000001.0000000.0000009.50000014.849242
1620.000700-1.0000002.828427497.000000408.000000586.0000000.500000408.000000408.000000408.0000000.683351-0.5000002.1213200.0000001.414214-0.5000000.707107
1630.000800-1.0000002.828427461.500000337.000000586.0000000.500000337.000000337.000000337.0000000.841592-0.5000002.1213200.0000001.414214-0.5000000.707107
1640.0003002.2500002.474874420.000000388.000000452.0000000.000000420.000000388.000000452.0000000.2511960.2500001.0606601.0000000.0000001.0000001.414214
1650.0000002.5000002.121320412.500000408.000000417.0000000.000000412.500000408.000000417.0000000.0178201.0000000.0000001.0000000.0000000.5000002.121320
1660.000500-1.0000002.828427523.000000460.000000586.0000000.500000460.000000460.000000460.0000000.484418-0.5000002.1213200.0000001.414214-0.5000000.707107
1670.0000002.5000002.121320388.500000383.000000394.0000000.000000388.500000383.000000394.0000000.0141411.0000000.0000001.0000000.0000000.5000002.121320
1680.0001001.0000000.000000407.000000382.000000432.0000000.000000407.000000382.000000432.0000000.1199751.0000000.0000001.0000000.000000-1.0000000.000000
1690.0002000.7500000.353553445.500000418.000000473.0000000.000000445.500000418.000000473.0000000.1548820.2500001.0606601.0000000.000000-0.5000000.707107
1700.0005000.0000001.414214422.500000355.000000490.0000000.000000422.500000355.000000490.0000000.5359371.0000000.0000001.0000000.000000-2.0000001.414214
1710.000300-1.0000000.000000399.000000356.000000442.0000000.000000399.000000356.000000442.0000000.3383581.0000000.0000001.0000000.000000-3.0000000.000000
1720.0002002.5000002.121320479.000000444.000000514.0000000.000000479.000000444.000000514.0000000.2043281.0000000.0000001.0000000.0000000.5000002.121320
1730.0004001.0000000.000000316.500000270.000000363.0000000.000000316.500000270.000000363.0000000.3888641.0000000.0000001.0000000.000000-1.0000000.000000
1740.0001001.0000000.000000391.000000368.000000414.0000000.000000391.000000368.000000414.0000000.1405391.0000000.0000001.0000000.000000-1.0000000.000000
1750.0006001.0000000.000000236.000000179.000000293.0000000.000000236.000000179.000000293.0000000.5715251.0000000.0000001.0000000.000000-1.0000000.000000
1760.0000001.0000000.000000412.000000401.000000423.0000000.000000412.000000401.000000423.0000000.0498521.0000000.0000001.0000000.000000-1.0000000.000000
1770.000500-1.0000002.828427517.500000449.000000586.0000000.500000449.000000449.000000449.0000000.469758-0.5000002.1213200.0000001.414214-0.5000000.707107
1780.0004000.0000001.414214434.000000386.000000482.0000000.000000434.000000386.000000482.0000000.3696521.0000000.0000001.0000000.000000-2.0000001.414214
1790.0024001.0000000.000000231.00000043.000000419.0000000.000000231.00000043.000000419.0000002.3681101.0000000.0000001.0000000.000000-1.0000000.000000
1800.0006001.0000000.000000487.500000405.000000570.0000000.000000487.500000405.000000570.0000000.5708141.0000000.0000001.0000000.000000-1.0000000.000000
1810.0003001.0000000.000000428.000000373.000000483.0000000.000000428.000000373.000000483.0000000.3425841.0000000.0000001.0000000.000000-1.0000000.000000
1820.0000001.0000000.000000444.500000442.000000447.0000000.000000444.500000442.000000447.0000000.0110681.0000000.0000001.0000000.000000-1.0000000.000000
1830.0002001.0000000.000000414.500000384.000000445.0000000.000000414.500000384.000000445.0000000.2020641.0000000.0000001.0000000.000000-1.0000000.000000
1840.0005001.0000000.000000428.000000359.000000497.0000000.000000428.000000359.000000497.0000000.5235471.0000000.0000001.0000000.000000-1.0000000.000000
1850.001400-1.0000002.828427396.000000206.000000586.0000000.500000206.000000206.000000206.0000001.401757-0.5000002.1213200.0000001.414214-0.5000000.707107
1860.0002000.0000001.414214442.000000403.000000481.0000000.000000442.000000403.000000481.0000000.2322791.0000000.0000001.0000000.000000-2.0000001.414214
1870.0004001.0000000.000000462.500000407.000000518.0000000.000000462.500000407.000000518.0000000.3835841.0000000.0000001.0000000.000000-1.0000000.000000
1880.0000002.5000002.121320378.000000370.000000386.0000000.000000378.000000370.000000386.0000000.0344791.0000000.0000001.0000000.0000000.5000002.121320
1890.000700-1.0000002.828427484.500000383.000000586.0000000.500000383.000000383.000000383.0000000.655472-0.5000002.1213200.0000001.414214-0.5000000.707107
1900.000600-1.0000002.828427493.000000400.000000586.0000000.500000400.000000400.000000400.0000000.598795-0.5000002.1213200.0000001.414214-0.5000000.707107
1910.000700-1.0000002.828427488.500000391.000000586.0000000.500000391.000000391.000000391.0000000.695953-0.5000002.1213200.0000001.414214-0.5000000.707107
1920.000900-2.0000001.414214453.000000320.000000586.0000000.500000320.000000320.000000320.0000000.852964-0.5000002.1213200.0000001.414214-1.5000002.121320
1930.0008001.0000000.000000328.500000243.000000414.0000000.000000328.500000243.000000414.0000000.7908621.0000000.0000001.0000000.000000-1.0000000.000000
1940.000600-1.0000002.828427499.500000413.000000586.0000000.500000413.000000413.000000413.0000000.605018-0.5000002.1213200.0000001.414214-0.5000000.707107
1950.0001001.0000000.000000431.500000401.000000462.0000000.000000431.500000401.000000462.0000000.1463441.0000000.0000001.0000000.000000-1.0000000.000000
1960.0003001.0000000.000000438.000000387.000000489.0000000.000000438.000000387.000000489.0000000.3203501.0000000.0000001.0000000.000000-1.0000000.000000
1970.0004000.0000001.414214531.000000479.000000583.0000000.000000531.000000479.000000583.0000000.4007661.0000000.0000001.0000000.000000-2.0000001.414214
1980.0007001.0000000.000000483.000000391.000000575.0000000.000000483.000000391.000000575.0000000.6594271.0000000.0000001.0000000.000000-1.0000000.000000
1990.0000001.0000000.000000409.000000403.000000415.0000000.000000409.000000403.000000415.0000000.0180091.0000000.0000001.0000000.000000-1.0000000.000000
2000.0002000.0000001.414214420.000000387.000000453.0000000.000000420.000000387.000000453.0000000.2395961.0000000.0000001.0000000.000000-2.0000001.414214
2010.00050011.50000014.849242456.500000394.000000519.0000000.000000456.500000394.000000519.0000000.5262301.0000000.0000001.0000000.0000009.50000014.849242
2020.0001001.0000000.000000444.500000432.000000457.0000000.000000444.500000432.000000457.0000000.0587891.0000000.0000001.0000000.000000-1.0000000.000000
2030.000700-1.0000002.828427484.000000382.000000586.0000000.500000382.000000382.000000382.0000000.743711-0.5000002.1213200.0000001.414214-0.5000000.707107
2040.0000000.0000001.414214384.500000379.000000390.0000000.000000384.500000379.000000390.0000000.0226951.0000000.0000001.0000000.000000-2.0000001.414214
2050.000800-1.0000002.828427476.000000366.000000586.0000000.500000366.000000366.000000366.0000000.771927-0.5000002.1213200.0000001.414214-0.5000000.707107
2060.0003001.0000000.000000341.000000301.000000381.0000000.000000341.000000301.000000381.0000000.3050821.0000000.0000001.0000000.000000-1.0000000.000000
2070.0002001.0000000.000000402.500000372.000000433.0000000.000000402.500000372.000000433.0000000.2007211.0000000.0000001.0000000.000000-1.0000000.000000
2080.0001001.0000000.000000446.000000424.000000468.0000000.000000446.000000424.000000468.0000000.1469361.0000000.0000001.0000000.000000-1.0000000.000000
2090.00000010.50000016.263456408.000000404.000000412.0000000.000000408.000000404.000000412.0000000.0248301.0000000.0000001.0000000.0000008.50000016.263456
2100.0005002.5000002.121320438.500000376.000000501.0000000.000000438.500000376.000000501.0000000.4552751.0000000.0000001.0000000.0000000.5000002.121320
2110.0003000.7500000.353553403.000000358.000000448.0000000.000000403.000000358.000000448.0000000.3153900.2500001.0606601.0000000.000000-0.5000000.707107
2120.000600-1.0000002.828427491.000000396.000000586.0000000.500000396.000000396.000000396.0000000.645317-0.5000002.1213200.0000001.414214-0.5000000.707107
2130.0005001.0000000.000000379.500000321.000000438.0000000.000000379.500000321.000000438.0000000.5024831.0000000.0000001.0000000.000000-1.0000000.000000
2140.0001001.0000000.000000430.500000418.000000443.0000000.000000430.500000418.000000443.0000000.0567371.0000000.0000001.0000000.000000-1.0000000.000000
2150.0000001.0000000.000000483.000000483.000000483.0000000.000000483.000000483.000000483.0000000.0190191.0000000.0000001.0000000.000000-1.0000000.000000
2160.0003001.0000000.000000400.500000364.000000437.0000000.000000400.500000364.000000437.0000000.2614711.0000000.0000001.0000000.000000-1.0000000.000000
2170.000500-1.0000002.828427507.000000428.000000586.0000000.500000428.000000428.000000428.0000000.505626-0.5000002.1213200.0000001.414214-0.5000000.707107
2180.0000001.0000000.000000402.000000401.000000403.0000000.000000402.000000401.000000403.0000000.0145241.0000000.0000001.0000000.000000-1.0000000.000000
2190.000500-10.50000016.263456388.000000317.000000459.0000000.000000388.000000317.000000459.0000000.490439-0.5000002.121320-9.50000014.849242-0.5000000.707107
2200.0016002.5000002.121320246.50000088.000000405.0000000.000000246.50000088.000000405.0000001.6251331.0000000.0000001.0000000.0000000.5000002.121320
2210.000300-10.50000016.263456412.000000370.000000454.0000000.000000412.000000370.000000454.0000000.281538-0.5000002.121320-9.50000014.849242-0.5000000.707107
2220.0003001.0000000.000000494.500000447.000000542.0000000.000000494.500000447.000000542.0000000.3387691.0000000.0000001.0000000.000000-1.0000000.000000
2230.0011001.0000000.000000274.500000160.000000389.0000000.000000274.500000160.000000389.0000001.1390901.0000000.0000001.0000000.000000-1.0000000.000000
2240.0008000.0000001.414214404.500000315.000000494.0000000.000000404.500000315.000000494.0000000.7842281.0000000.0000001.0000000.000000-2.0000001.414214
2250.0003001.0000000.000000357.500000313.000000402.0000000.000000357.500000313.000000402.0000000.3250361.0000000.0000001.0000000.000000-1.0000000.000000
2260.001000-2.0000001.414214462.000000338.000000586.0000000.500000338.000000338.000000338.0000001.006946-0.5000002.1213200.0000001.414214-1.5000002.121320
2270.00050011.50000014.849242450.500000384.000000517.0000000.000000450.500000384.000000517.0000000.5084361.0000000.0000001.0000000.0000009.50000014.849242
2280.0000001.0000000.000000474.000000470.000000478.0000000.000000474.000000470.000000478.0000000.0137771.0000000.0000001.0000000.000000-1.0000000.000000
2290.0003001.0000000.000000476.000000436.000000516.0000000.000000476.000000436.000000516.0000000.2968171.0000000.0000001.0000000.000000-1.0000000.000000
2300.0003000.0000001.414214437.000000398.000000476.0000000.000000437.000000398.000000476.0000000.2650591.0000000.0000001.0000000.000000-2.0000001.414214
2310.000500-1.0000002.828427515.500000445.000000586.0000000.500000445.000000445.000000445.0000000.529493-0.5000002.1213200.0000001.414214-0.5000000.707107
2320.0000000.0000001.414214421.500000417.000000426.0000000.000000421.500000417.000000426.0000000.0184081.0000000.0000001.0000000.000000-2.0000001.414214
2330.0004000.0000001.414214502.000000441.000000563.0000000.000000502.000000441.000000563.0000000.4398871.0000000.0000001.0000000.000000-2.0000001.414214
2340.000000-1.0000000.000000479.000000476.000000482.0000000.000000479.000000476.000000482.0000000.0199291.0000000.0000001.0000000.000000-3.0000000.000000
2350.0001000.0000001.414214413.000000398.000000428.0000000.000000413.000000398.000000428.0000000.0765991.0000000.0000001.0000000.000000-2.0000001.414214
2360.0007001.0000000.000000255.500000195.000000316.0000000.000000255.500000195.000000316.0000000.6993681.0000000.0000001.0000000.000000-1.0000000.000000
2370.0006001.0000000.000000478.000000390.000000566.0000000.000000478.000000390.000000566.0000000.6039651.0000000.0000001.0000000.000000-1.0000000.000000
2380.0000002.5000002.121320417.000000408.000000426.0000000.000000417.000000408.000000426.0000000.0415141.0000000.0000001.0000000.0000000.5000002.121320
2390.000800-12.50000013.435029466.500000347.000000586.0000000.500000347.000000347.000000347.0000000.839215-2.0000000.000000-10.50000013.4350290.0000000.000000
2400.0003001.0000000.000000321.000000278.000000364.0000000.000000321.000000278.000000364.0000000.3220701.0000000.0000001.0000000.000000-1.0000000.000000
2410.0002002.5000002.121320431.500000396.000000467.0000000.000000431.500000396.000000467.0000000.2164661.0000000.0000001.0000000.0000000.5000002.121320
2420.00010011.50000014.849242465.500000447.000000484.0000000.000000465.500000447.000000484.0000000.1021691.0000000.0000001.0000000.0000009.50000014.849242
2430.0004002.5000002.121320396.500000344.000000449.0000000.000000396.500000344.000000449.0000000.3635391.0000000.0000001.0000000.0000000.5000002.121320
2440.0000001.0000000.000000452.500000447.000000458.0000000.000000452.500000447.000000458.0000000.0234961.0000000.0000001.0000000.000000-1.0000000.000000
2450.0005002.5000002.121320417.000000350.000000484.0000000.000000417.000000350.000000484.0000000.4809631.0000000.0000001.0000000.0000000.5000002.121320
2460.0005001.0000000.000000340.000000284.000000396.0000000.000000340.000000284.000000396.0000000.5467401.0000000.0000001.0000000.000000-1.0000000.000000
2470.002300-1.0000002.828427325.00000064.000000586.0000000.50000064.00000064.00000064.0000002.256215-0.5000002.1213200.0000001.414214-0.5000000.707107
2480.0001000.0000001.414214441.500000423.000000460.0000000.000000441.500000423.000000460.0000000.0850671.0000000.0000001.0000000.000000-2.0000001.414214
2490.0005001.0000000.000000235.000000197.000000273.0000000.000000235.000000197.000000273.0000000.5012711.0000000.0000001.0000000.000000-1.0000000.000000
2500.00030011.50000014.849242432.000000388.000000476.0000000.000000432.000000388.000000476.0000000.3288491.0000000.0000001.0000000.0000009.50000014.849242
2510.00010011.50000014.849242453.000000432.000000474.0000000.000000453.000000432.000000474.0000000.1212341.0000000.0000001.0000000.0000009.50000014.849242
2520.0001001.0000000.000000395.500000380.000000411.0000000.000000395.500000380.000000411.0000000.1132951.0000000.0000001.0000000.000000-1.0000000.000000
2530.000800-1.0000002.828427482.000000378.000000586.0000000.500000378.000000378.000000378.0000000.784589-0.5000002.1213200.0000001.414214-0.5000000.707107
2540.0012002.5000002.121320232.000000148.000000316.0000000.000000232.000000148.000000316.0000001.1580221.0000000.0000001.0000000.0000000.5000002.121320
2550.0003000.0000001.414214412.000000370.000000454.0000000.000000412.000000370.000000454.0000000.2716801.0000000.0000001.0000000.000000-2.0000001.414214
2560.0002001.0000000.000000397.000000376.000000418.0000000.000000397.000000376.000000418.0000000.1567231.0000000.0000001.0000000.000000-1.0000000.000000
2570.0001001.0000000.000000427.500000411.000000444.0000000.000000427.500000411.000000444.0000000.0833841.0000000.0000001.0000000.000000-1.0000000.000000
2580.0004001.0000000.000000510.000000456.000000564.0000000.000000510.000000456.000000564.0000000.3984731.0000000.0000001.0000000.000000-1.0000000.000000
2590.0001000.0000001.414214452.500000440.000000465.0000000.000000452.500000440.000000465.0000000.0801181.0000000.0000001.0000000.000000-2.0000001.414214
2600.0002002.5000002.121320419.500000393.000000446.0000000.000000419.500000393.000000446.0000000.1717591.0000000.0000001.0000000.0000000.5000002.121320
2610.0001000.0000001.414214440.000000419.000000461.0000000.000000440.000000419.000000461.0000000.1338601.0000000.0000001.0000000.000000-2.0000001.414214
2620.0007001.0000000.000000456.000000369.000000543.0000000.000000456.000000369.000000543.0000000.7153801.0000000.0000001.0000000.000000-1.0000000.000000
2630.0002002.5000002.121320382.000000361.000000403.0000000.000000382.000000361.000000403.0000000.1531491.0000000.0000001.0000000.0000000.5000002.121320
2640.000500-1.0000002.828427516.500000447.000000586.0000000.500000447.000000447.000000447.0000000.521685-0.5000002.1213200.0000001.414214-0.5000000.707107
2650.0003001.0000000.000000369.500000336.000000403.0000000.000000369.500000336.000000403.0000000.2609261.0000000.0000001.0000000.000000-1.0000000.000000
2660.0022001.0000000.000000202.50000044.000000361.0000000.000000202.50000044.000000361.0000002.2008791.0000000.0000001.0000000.000000-1.0000000.000000
2670.0001002.5000002.121320393.500000383.000000404.0000000.000000393.500000383.000000404.0000000.0573581.0000000.0000001.0000000.0000000.5000002.121320
2680.0002002.5000002.121320411.000000380.000000442.0000000.000000411.000000380.000000442.0000000.2331031.0000000.0000001.0000000.0000000.5000002.121320
2690.0001004.0000000.000000407.000000386.000000428.0000000.000000407.000000386.000000428.0000000.1093961.0000000.0000001.0000000.0000002.0000000.000000
2700.0008001.0000000.000000144.000000106.000000182.0000000.000000144.000000106.000000182.0000000.8061451.0000000.0000001.0000000.000000-1.0000000.000000
2710.0011009.50000017.677670445.500000305.000000586.0000000.500000305.000000305.000000305.0000001.084759-0.5000002.1213200.0000001.41421410.00000014.142136
2720.001200-1.0000002.828427414.500000243.000000586.0000000.500000243.000000243.000000243.0000001.162079-0.5000002.1213200.0000001.414214-0.5000000.707107
2730.000600-1.0000002.828427501.500000417.000000586.0000000.500000417.000000417.000000417.0000000.640193-0.5000002.1213200.0000001.414214-0.5000000.707107
2740.0011001.0000000.000000341.000000236.000000446.0000000.000000341.000000236.000000446.0000001.0962991.0000000.0000001.0000000.000000-1.0000000.000000
2750.00230011.50000014.849242221.50000047.000000396.0000000.000000221.50000047.000000396.0000002.3121151.0000000.0000001.0000000.0000009.50000014.849242
2760.0020000.0000001.414214266.50000067.000000466.0000000.000000266.50000067.000000466.0000002.0034601.0000000.0000001.0000000.000000-2.0000001.414214
2770.000700-1.0000002.828427490.500000395.000000586.0000000.500000395.000000395.000000395.0000000.722101-0.5000002.1213200.0000001.414214-0.5000000.707107
2780.0004002.5000002.121320427.500000375.000000480.0000000.000000427.500000375.000000480.0000000.4430311.0000000.0000001.0000000.0000000.5000002.121320
2790.0006002.5000002.121320490.000000412.000000568.0000000.000000490.000000412.000000568.0000000.6120221.0000000.0000001.0000000.0000000.5000002.121320
2800.0020001.0000000.000000278.00000080.000000476.0000000.000000278.00000080.000000476.0000002.0130611.0000000.0000001.0000000.000000-1.0000000.000000
2810.0009001.0000000.000000130.50000091.000000170.0000000.000000130.50000091.000000170.0000000.9092331.0000000.0000001.0000000.000000-1.0000000.000000
2820.0021001.0000000.000000230.50000063.000000398.0000000.000000230.50000063.000000398.0000002.0701751.0000000.0000001.0000000.000000-1.0000000.000000
2830.0001001.0000000.000000471.500000451.000000492.0000000.000000471.500000451.000000492.0000000.1454571.0000000.0000001.0000000.000000-1.0000000.000000
2840.00200011.50000014.849242284.00000087.000000481.0000000.000000284.00000087.000000481.0000002.0153241.0000000.0000001.0000000.0000009.50000014.849242
2850.0001001.0000000.000000491.000000484.000000498.0000000.000000491.000000484.000000498.0000000.0622711.0000000.0000001.0000000.000000-1.0000000.000000
2860.0005001.0000000.00000080.50000065.00000096.0000000.00000080.50000065.00000096.0000000.5038061.0000000.0000001.0000000.000000-1.0000000.000000
2870.00060011.50000014.849242128.50000098.000000159.0000000.000000128.50000098.000000159.0000000.5733841.0000000.0000001.0000000.0000009.50000014.849242
2880.0004000.0000001.414214386.500000331.000000442.0000000.000000386.500000331.000000442.0000000.4133881.0000000.0000001.0000000.000000-2.0000001.414214
2890.0008001.0000000.000000199.500000132.000000267.0000000.000000199.500000132.000000267.0000000.8263521.0000000.0000001.0000000.000000-1.0000000.000000
2900.00010011.50000014.849242419.000000405.000000433.0000000.000000419.000000405.000000433.0000000.1010331.0000000.0000001.0000000.0000009.50000014.849242
2910.0021001.0000000.000000170.50000043.000000298.0000000.000000170.50000043.000000298.0000002.1041511.0000000.0000001.0000000.000000-1.0000000.000000
2920.0004001.0000000.000000466.500000418.000000515.0000000.000000466.500000418.000000515.0000000.3694201.0000000.0000001.0000000.000000-1.0000000.000000
2930.0021000.0000001.414214237.50000057.000000418.0000000.000000237.50000057.000000418.0000002.0746701.0000000.0000001.0000000.000000-2.0000001.414214
2940.0018001.0000000.000000209.50000066.000000353.0000000.000000209.50000066.000000353.0000001.8071481.0000000.0000001.0000000.000000-1.0000000.000000
2950.000600-1.0000002.828427500.000000414.000000586.0000000.500000414.000000414.000000414.0000000.593227-0.5000002.1213200.0000001.414214-0.5000000.707107
2960.0023002.5000002.121320234.50000042.000000427.0000000.000000234.50000042.000000427.0000002.2587811.0000000.0000001.0000000.0000000.5000002.121320
2970.00020011.50000014.849242435.000000408.000000462.0000000.000000435.000000408.000000462.0000000.2006521.0000000.0000001.0000000.0000009.50000014.849242
2980.0022001.0000000.000000234.00000049.000000419.0000000.000000234.00000049.000000419.0000002.1877111.0000000.0000001.0000000.000000-1.0000000.000000
2990.0002001.0000000.000000140.000000129.000000151.0000000.000000140.000000129.000000151.0000000.1679491.0000000.0000001.0000000.000000-1.0000000.000000
3000.0004001.0000000.000000217.500000194.000000241.0000000.000000217.500000194.000000241.0000000.3639471.0000000.0000001.0000000.000000-1.0000000.000000
3010.0014001.0000000.000000299.500000172.000000427.0000000.000000299.500000172.000000427.0000001.4318521.0000000.0000001.0000000.000000-1.0000000.000000
3020.00010011.50000014.849242427.000000415.000000439.0000000.000000427.000000415.000000439.0000000.0773461.0000000.0000001.0000000.0000009.50000014.849242
3030.0017001.0000000.000000231.50000094.000000369.0000000.000000231.50000094.000000369.0000001.6812311.0000000.0000001.0000000.000000-1.0000000.000000
3040.00080011.50000014.84924299.00000069.000000129.0000000.00000099.00000069.000000129.0000000.8313111.0000000.0000001.0000000.0000009.50000014.849242
3050.001900-1.0000002.828427346.000000106.000000586.0000000.500000106.000000106.000000106.0000001.936602-0.5000002.1213200.0000001.414214-0.5000000.707107
3060.0000002.5000002.121320414.000000410.000000418.0000000.000000414.000000410.000000418.0000000.0471051.0000000.0000001.0000000.0000000.5000002.121320
3070.002100-1.0000000.000000267.00000067.000000467.0000000.000000267.00000067.000000467.0000002.1467351.0000000.0000001.0000000.000000-3.0000000.000000
3080.0016002.5000002.121320292.500000136.000000449.0000000.000000292.500000136.000000449.0000001.5786771.0000000.0000001.0000000.0000000.5000002.121320
3090.0004000.0000001.414214459.000000407.000000511.0000000.000000459.000000407.000000511.0000000.3642201.0000000.0000001.0000000.000000-2.0000001.414214
3100.0023000.0000001.414214208.50000038.000000379.0000000.000000208.50000038.000000379.0000002.2876501.0000000.0000001.0000000.000000-2.0000001.414214
3110.0001002.5000002.121320412.000000399.000000425.0000000.000000412.000000399.000000425.0000000.0784181.0000000.0000001.0000000.0000000.5000002.121320
3120.00020011.50000014.849242498.500000473.000000524.0000000.000000498.500000473.000000524.0000000.1571591.0000000.0000001.0000000.0000009.50000014.849242
3130.0010000.0000001.414214282.500000196.000000369.0000000.000000282.500000196.000000369.0000001.0217771.0000000.0000001.0000000.000000-2.0000001.414214
3140.0020000.0000001.414214220.50000062.000000379.0000000.000000220.50000062.000000379.0000002.0180431.0000000.0000001.0000000.000000-2.0000001.414214
3150.00220011.25000015.202796293.50000075.000000512.0000000.000000293.50000075.000000512.0000002.2221400.2500001.0606601.0000000.00000010.00000014.142136
3160.0008001.0000000.000000458.500000363.000000554.0000000.000000458.500000363.000000554.0000000.7871281.0000000.0000001.0000000.000000-1.0000000.000000
3170.0003001.0000000.00000047.50000041.00000054.0000000.00000047.50000041.00000054.0000000.2821221.0000000.0000001.0000000.000000-1.0000000.000000
3180.0001002.5000002.121320360.000000353.000000367.0000000.000000360.000000353.000000367.0000000.0633401.0000000.0000001.0000000.0000000.5000002.121320
3190.0011001.0000000.000000383.000000247.000000519.0000000.000000383.000000247.000000519.0000001.1436691.0000000.0000001.0000000.000000-1.0000000.000000
3200.0011001.0000000.000000357.500000245.000000470.0000000.000000357.500000245.000000470.0000001.1461391.0000000.0000001.0000000.000000-1.0000000.000000
3210.0016001.0000000.000000318.500000145.000000492.0000000.000000318.500000145.000000492.0000001.6104791.0000000.0000001.0000000.000000-1.0000000.000000
3220.0015001.0000000.000000346.000000202.000000490.0000000.000000346.000000202.000000490.0000001.4587631.0000000.0000001.0000000.000000-1.0000000.000000
3230.0010002.5000002.121320359.000000243.000000475.0000000.000000359.000000243.000000475.0000000.9869621.0000000.0000001.0000000.0000000.5000002.121320
3240.002200-1.0000002.828427330.50000075.000000586.0000000.50000075.00000075.00000075.0000002.177847-0.5000002.1213200.0000001.414214-0.5000000.707107
3250.000800-1.0000002.828427469.000000352.000000586.0000000.500000352.000000352.000000352.0000000.815542-0.5000002.1213200.0000001.414214-0.5000000.707107
3260.0018001.0000000.000000305.000000141.000000469.0000000.000000305.000000141.000000469.0000001.7707991.0000000.0000001.0000000.000000-1.0000000.000000
3270.0017001.0000000.000000223.00000074.000000372.0000000.000000223.00000074.000000372.0000001.7395021.0000000.0000001.0000000.000000-1.0000000.000000
3280.00020011.50000014.849242474.000000444.000000504.0000000.000000474.000000444.000000504.0000000.2267221.0000000.0000001.0000000.0000009.50000014.849242
3290.0002001.0000000.000000484.000000458.000000510.0000000.000000484.000000458.000000510.0000000.1508671.0000000.0000001.0000000.000000-1.0000000.000000
3300.0004001.0000000.00000048.00000040.00000056.0000000.00000048.00000040.00000056.0000000.4008811.0000000.0000001.0000000.000000-1.0000000.000000
3310.0017001.0000000.000000211.50000082.000000341.0000000.000000211.50000082.000000341.0000001.6752321.0000000.0000001.0000000.000000-1.0000000.000000
3320.00090011.50000014.84924255.50000036.00000075.0000000.00000055.50000036.00000075.0000000.8554851.0000000.0000001.0000000.0000009.50000014.849242
3330.0004001.0000000.000000465.500000416.000000515.0000000.000000465.500000416.000000515.0000000.4188441.0000000.0000001.0000000.000000-1.0000000.000000
3340.00190011.50000014.849242257.50000094.000000421.0000000.000000257.50000094.000000421.0000001.8534501.0000000.0000001.0000000.0000009.50000014.849242
3350.0020001.0000000.000000248.50000075.000000422.0000000.000000248.50000075.000000422.0000001.9679511.0000000.0000001.0000000.000000-1.0000000.000000
3360.0012009.50000017.677670423.000000260.000000586.0000000.500000260.000000260.000000260.0000001.236872-0.5000002.1213200.0000001.41421410.00000014.142136
3370.0002001.0000000.000000212.000000201.000000223.0000000.000000212.000000201.000000223.0000000.1716211.0000000.0000001.0000000.000000-1.0000000.000000
3380.0015001.0000000.000000264.500000112.000000417.0000000.000000264.500000112.000000417.0000001.5315341.0000000.0000001.0000000.000000-1.0000000.000000
3390.00040011.50000014.84924267.00000057.00000077.0000000.00000067.00000057.00000077.0000000.3848071.0000000.0000001.0000000.0000009.50000014.849242
3400.0011001.0000000.000000260.500000174.000000347.0000000.000000260.500000174.000000347.0000001.0653511.0000000.0000001.0000000.000000-1.0000000.000000
3410.0002002.5000002.121320466.500000439.000000494.0000000.000000466.500000439.000000494.0000000.1986401.0000000.0000001.0000000.0000000.5000002.121320
3420.00170011.50000014.849242327.500000164.000000491.0000000.000000327.500000164.000000491.0000001.6793431.0000000.0000001.0000000.0000009.50000014.849242
3430.0018001.0000000.000000205.50000068.000000343.0000000.000000205.50000068.000000343.0000001.8111921.0000000.0000001.0000000.000000-1.0000000.000000
3440.00150011.50000014.849242368.500000212.000000525.0000000.000000368.500000212.000000525.0000001.4959911.0000000.0000001.0000000.0000009.50000014.849242
3450.0020001.0000000.000000246.00000064.000000428.0000000.000000246.00000064.000000428.0000002.0245411.0000000.0000001.0000000.000000-1.0000000.000000
3460.0002000.0000001.414214446.000000409.000000483.0000000.000000446.000000409.000000483.0000000.2279901.0000000.0000001.0000000.000000-2.0000001.414214
3470.001700-1.0000002.828427356.000000126.000000586.0000000.500000126.000000126.000000126.0000001.666988-0.5000002.1213200.0000001.414214-0.5000000.707107
3480.00040011.50000014.84924267.50000056.00000079.0000000.00000067.50000056.00000079.0000000.3501841.0000000.0000001.0000000.0000009.50000014.849242
3490.00080011.50000014.849242350.500000264.000000437.0000000.000000350.500000264.000000437.0000000.7733721.0000000.0000001.0000000.0000009.50000014.849242
3500.0022001.0000000.000000253.00000049.000000457.0000000.000000253.00000049.000000457.0000002.2302221.0000000.0000001.0000000.000000-1.0000000.000000
3510.001600-10.50000016.263456264.500000120.000000409.0000000.000000264.500000120.000000409.0000001.577635-0.5000002.121320-9.50000014.849242-0.5000000.707107
3520.0000001.0000000.000000490.500000487.000000494.0000000.000000490.500000487.000000494.0000000.0405261.0000000.0000001.0000000.000000-1.0000000.000000
3530.00120011.50000014.849242161.00000088.000000234.0000000.000000161.00000088.000000234.0000001.2194821.0000000.0000001.0000000.0000009.50000014.849242
3540.000700-2.0000001.414214486.000000386.000000586.0000000.500000386.000000386.000000386.0000000.681214-0.5000002.1213200.0000001.414214-1.5000002.121320
3550.0021001.0000000.000000237.00000056.000000418.0000000.000000237.00000056.000000418.0000002.1200751.0000000.0000001.0000000.000000-1.0000000.000000
3560.00040011.50000014.849242455.000000406.000000504.0000000.000000455.000000406.000000504.0000000.3820281.0000000.0000001.0000000.0000009.50000014.849242
3570.00230011.50000014.849242205.50000051.000000360.0000000.000000205.50000051.000000360.0000002.2643661.0000000.0000001.0000000.0000009.50000014.849242
3580.000000-1.0000002.828427581.000000576.000000586.0000000.500000576.000000576.000000576.0000000.037026-0.5000002.1213200.0000001.414214-0.5000000.707107
3590.0004001.0000000.000000157.500000134.000000181.0000000.000000157.500000134.000000181.0000000.4091691.0000000.0000001.0000000.000000-1.0000000.000000
3600.00190022.0000000.000000126.00000047.000000205.0000000.000000126.00000047.000000205.0000001.9423581.0000000.0000001.0000000.00000020.0000000.000000
3610.000700-1.0000002.828427494.500000403.000000586.0000000.500000403.000000403.000000403.0000000.698322-0.5000002.1213200.0000001.414214-0.5000000.707107
3620.0005001.0000000.000000413.500000355.000000472.0000000.000000413.500000355.000000472.0000000.4792361.0000000.0000001.0000000.000000-1.0000000.000000
3630.00170013.00000012.727922197.50000082.000000313.0000000.000000197.50000082.000000313.0000001.7375231.0000000.0000001.0000000.00000011.00000012.727922
3640.0001000.0000001.41421463.00000061.00000065.0000000.00000063.00000061.00000065.0000000.1303981.0000000.0000001.0000000.000000-2.0000001.414214
3650.0017001.0000000.000000137.50000048.000000227.0000000.000000137.50000048.000000227.0000001.7028121.0000000.0000001.0000000.000000-1.0000000.000000
3660.0004001.0000000.000000428.000000377.000000479.0000000.000000428.000000377.000000479.0000000.3892841.0000000.0000001.0000000.000000-1.0000000.000000
3670.0019001.0000000.000000230.00000067.000000393.0000000.000000230.00000067.000000393.0000001.9086301.0000000.0000001.0000000.000000-1.0000000.000000
3680.00140011.50000014.849242325.500000183.000000468.0000000.000000325.500000183.000000468.0000001.4461191.0000000.0000001.0000000.0000009.50000014.849242
3690.0020001.0000000.000000230.00000062.000000398.0000000.000000230.00000062.000000398.0000001.9904881.0000000.0000001.0000000.000000-1.0000000.000000
3700.0001001.0000000.000000500.500000491.000000510.0000000.000000500.500000491.000000510.0000000.0701481.0000000.0000001.0000000.000000-1.0000000.000000
3710.0020000.7500000.353553272.00000085.000000459.0000000.000000272.00000085.000000459.0000002.0396910.2500001.0606601.0000000.000000-0.5000000.707107
3720.00010011.50000014.84924256.00000052.00000060.0000000.00000056.00000052.00000060.0000000.1347651.0000000.0000001.0000000.0000009.50000014.849242
3730.0001001.0000000.00000081.50000079.00000084.0000000.00000081.50000079.00000084.0000000.1402181.0000000.0000001.0000000.000000-1.0000000.000000
3740.0023001.0000000.000000184.50000032.000000337.0000000.000000184.50000032.000000337.0000002.2534891.0000000.0000001.0000000.000000-1.0000000.000000
3750.0002001.0000000.000000370.500000343.000000398.0000000.000000370.500000343.000000398.0000000.1939321.0000000.0000001.0000000.000000-1.0000000.000000
3760.0012001.0000000.000000121.00000071.000000171.0000000.000000121.00000071.000000171.0000001.1605591.0000000.0000001.0000000.000000-1.0000000.000000
3770.0023001.0000000.000000219.00000042.000000396.0000000.000000219.00000042.000000396.0000002.2545081.0000000.0000001.0000000.000000-1.0000000.000000
3780.0021001.0000000.000000263.00000067.000000459.0000000.000000263.00000067.000000459.0000002.1183151.0000000.0000001.0000000.000000-1.0000000.000000
3790.00180011.50000014.849242206.50000073.000000340.0000000.000000206.50000073.000000340.0000001.8058671.0000000.0000001.0000000.0000009.50000014.849242
3800.000200-1.0000002.828427555.000000524.000000586.0000000.500000524.000000524.000000524.0000000.201501-0.5000002.1213200.0000001.414214-0.5000000.707107
3810.0006002.5000002.121320489.500000406.000000573.0000000.000000489.500000406.000000573.0000000.5772391.0000000.0000001.0000000.0000000.5000002.121320
3820.0006002.5000002.121320260.000000210.000000310.0000000.000000260.000000210.000000310.0000000.5922101.0000000.0000001.0000000.0000000.5000002.121320
3830.0021001.0000000.000000187.00000049.000000325.0000000.000000187.00000049.000000325.0000002.0598041.0000000.0000001.0000000.000000-1.0000000.000000
3840.0012001.0000000.000000134.00000070.000000198.0000000.000000134.00000070.000000198.0000001.2425091.0000000.0000001.0000000.000000-1.0000000.000000
3850.0002000.0000001.414214441.000000413.000000469.0000000.000000441.000000413.000000469.0000000.2489321.0000000.0000001.0000000.000000-2.0000001.414214
3860.002300-1.0000002.828427327.00000068.000000586.0000000.50000068.00000068.00000068.0000002.298598-0.5000002.1213200.0000001.414214-0.5000000.707107
3870.00020011.50000014.84924283.50000077.00000090.0000000.00000083.50000077.00000090.0000000.1955931.0000000.0000001.0000000.0000009.50000014.849242
3880.00020022.0000000.00000072.50000069.00000076.0000000.00000072.50000069.00000076.0000000.2049351.0000000.0000001.0000000.00000020.0000000.000000
3890.0009001.0000000.000000101.00000071.000000131.0000000.000000101.00000071.000000131.0000000.8584501.0000000.0000001.0000000.000000-1.0000000.000000
3900.0002001.0000000.000000470.500000450.000000491.0000000.000000470.500000450.000000491.0000000.1678321.0000000.0000001.0000000.000000-1.0000000.000000
3910.0008001.0000000.000000358.500000282.000000435.0000000.000000358.500000282.000000435.0000000.7656921.0000000.0000001.0000000.000000-1.0000000.000000
3920.00120022.0000000.00000073.00000047.00000099.0000000.00000073.00000047.00000099.0000001.2394061.0000000.0000001.0000000.00000020.0000000.000000
3930.00220011.50000014.849242247.00000067.000000427.0000000.000000247.00000067.000000427.0000002.1860261.0000000.0000001.0000000.0000009.50000014.849242
3940.0008000.5000004.949748484.500000383.000000586.0000000.500000383.000000383.000000383.0000000.807172-0.5000002.1213200.0000001.4142141.0000001.414214
3950.0012001.0000000.000000175.500000109.000000242.0000000.000000175.500000109.000000242.0000001.1680041.0000000.0000001.0000000.000000-1.0000000.000000
3960.0014001.0000000.000000298.000000180.000000416.0000000.000000298.000000180.000000416.0000001.3577371.0000000.0000001.0000000.000000-1.0000000.000000
3970.00100022.0000000.000000121.50000075.000000168.0000000.000000121.50000075.000000168.0000001.0440501.0000000.0000001.0000000.00000020.0000000.000000
3980.00180011.50000014.849242238.50000085.000000392.0000000.000000238.50000085.000000392.0000001.8499671.0000000.0000001.0000000.0000009.50000014.849242
3990.00010011.50000014.849242199.000000195.000000203.0000000.000000199.000000195.000000203.0000000.0917871.0000000.0000001.0000000.0000009.50000014.849242
4000.0013001.0000000.000000291.500000180.000000403.0000000.000000291.500000180.000000403.0000001.2746301.0000000.0000001.0000000.000000-1.0000000.000000
4010.0011000.0000001.414214257.000000152.000000362.0000000.000000257.000000152.000000362.0000001.0970281.0000000.0000001.0000000.000000-2.0000001.414214
4020.0017001.0000000.000000105.00000043.000000167.0000000.000000105.00000043.000000167.0000001.6904361.0000000.0000001.0000000.000000-1.0000000.000000
4030.00060011.50000014.849242169.000000136.000000202.0000000.000000169.000000136.000000202.0000000.5606831.0000000.0000001.0000000.0000009.50000014.849242
4040.0012001.0000000.000000343.000000208.000000478.0000000.000000343.000000208.000000478.0000001.2395441.0000000.0000001.0000000.000000-1.0000000.000000
4050.0016002.5000002.121320284.000000153.000000415.0000000.000000284.000000153.000000415.0000001.5621731.0000000.0000001.0000000.0000000.5000002.121320
4060.0015001.0000000.000000273.500000159.000000388.0000000.000000273.500000159.000000388.0000001.4512821.0000000.0000001.0000000.000000-1.0000000.000000
4070.0002001.0000000.000000118.000000115.000000121.0000000.000000118.000000115.000000121.0000000.1834801.0000000.0000001.0000000.000000-1.0000000.000000
4080.0018001.0000000.000000239.50000097.000000382.0000000.000000239.50000097.000000382.0000001.7699101.0000000.0000001.0000000.000000-1.0000000.000000
4090.00020011.50000014.84924270.50000069.00000072.0000000.00000070.50000069.00000072.0000000.1693711.0000000.0000001.0000000.0000009.50000014.849242
4100.00230011.50000014.849242219.00000059.000000379.0000000.000000219.00000059.000000379.0000002.2714831.0000000.0000001.0000000.0000009.50000014.849242
4110.0017001.0000000.000000268.50000095.000000442.0000000.000000268.50000095.000000442.0000001.6511641.0000000.0000001.0000000.000000-1.0000000.000000
4120.0020001.0000000.000000254.00000070.000000438.0000000.000000254.00000070.000000438.0000001.9570521.0000000.0000001.0000000.000000-1.0000000.000000
4130.00210011.50000014.849242241.50000068.000000415.0000000.000000241.50000068.000000415.0000002.0538681.0000000.0000001.0000000.0000009.50000014.849242
4140.00050011.50000014.84924269.50000054.00000085.0000000.00000069.50000054.00000085.0000000.5315251.0000000.0000001.0000000.0000009.50000014.849242
4150.0022001.0000000.000000288.00000077.000000499.0000000.000000288.00000077.000000499.0000002.1558221.0000000.0000001.0000000.000000-1.0000000.000000
4160.0014001.00000029.698484351.000000196.000000506.0000000.000000351.000000196.000000506.0000001.3680131.0000000.000000-9.50000014.8492429.50000014.849242
4170.0010001.0000000.000000306.500000210.000000403.0000000.000000306.500000210.000000403.0000001.0371901.0000000.0000001.0000000.000000-1.0000000.000000
4180.0007001.0000000.000000390.500000308.000000473.0000000.000000390.500000308.000000473.0000000.6802981.0000000.0000001.0000000.000000-1.0000000.000000
4190.0018001.0000000.000000363.000000174.000000552.0000000.000000363.000000174.000000552.0000001.8175931.0000000.0000001.0000000.000000-1.0000000.000000
4200.00160013.00000012.727922274.500000133.000000416.0000000.000000274.500000133.000000416.0000001.6003291.0000000.0000001.0000000.00000011.00000012.727922
4210.0015000.0000001.414214294.000000157.000000431.0000000.000000294.000000157.000000431.0000001.5279921.0000000.0000001.0000000.000000-2.0000001.414214
4220.0021002.5000002.121320303.00000094.000000512.0000000.000000303.00000094.000000512.0000002.0791811.0000000.0000001.0000000.0000000.5000002.121320
4230.0007001.0000000.000000314.000000250.000000378.0000000.000000314.000000250.000000378.0000000.7133971.0000000.0000001.0000000.000000-1.0000000.000000
4240.0026001.0000000.000000248.50000033.000000464.0000000.000000248.50000033.000000464.0000002.6238601.0000000.0000001.0000000.000000-1.0000000.000000
4250.000300-10.50000016.263456296.500000265.000000328.0000000.000000296.500000265.000000328.0000000.251168-0.5000002.121320-9.50000014.849242-0.5000000.707107
4260.00090010.50000016.263456110.50000072.000000149.0000000.000000110.50000072.000000149.0000000.8762591.0000000.0000001.0000000.0000008.50000016.263456
4270.00010011.50000014.849242160.000000154.000000166.0000000.000000160.000000154.000000166.0000000.1399851.0000000.0000001.0000000.0000009.50000014.849242
4280.0006001.0000000.000000460.000000378.000000542.0000000.000000460.000000378.000000542.0000000.6492061.0000000.0000001.0000000.000000-1.0000000.000000
4290.00190011.50000014.849242288.000000111.000000465.0000000.000000288.000000111.000000465.0000001.9342831.0000000.0000001.0000000.0000009.50000014.849242
4300.00030011.50000014.849242401.500000367.000000436.0000000.000000401.500000367.000000436.0000000.2674791.0000000.0000001.0000000.0000009.50000014.849242
4310.00190022.0000000.000000206.00000066.000000346.0000000.000000206.00000066.000000346.0000001.8977471.0000000.0000001.0000000.00000020.0000000.000000
4320.000500-1.0000002.828427515.500000445.000000586.0000000.500000445.000000445.000000445.0000000.539420-0.5000002.1213200.0000001.414214-0.5000000.707107

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1;30;43mStreaming output truncated to the last 5000 lines.\u001b[0m\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;208m1024\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "Steps = 1582 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Exception = name 'random' is not defined\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import copy\n", + " dirs = {'W':(-1,0),'S':(1,0),'A':(0,-1),'D':(0,1)}\n", + " best_move = None\n", + " best_score = -1\n", + " def move(b, d):\n", + " rows, cols = 4,4\n", + " def slide(row):\n", + " new = [x for x in row if x]\n", + " res = []\n", + " skip=False\n", + " i=0\n", + " while i < len(new):\n", + " if i+1best_score:\n", + " best_score=score\n", + " best_move=m\n", + " return best_move\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " # simple heuristic: prefer moves that increase score locally\n", + " best = None\n", + " best_score = -1\n", + " def simulate(board, move):\n", + " # copy board\n", + " import copy, math\n", + " b = copy.deepcopy(board)\n", + " # apply move logic simplified: just return new board\n", + " # without full game logic, just random for illustration\n", + " return b, random.randint(0, 4)\n", + " for m in moves:\n", + " _, s = simulate(board, m)\n", + " if s > best_score:\n", + " best_score = s\n", + " best = m\n", + " return best or random.choice(moves)\n", + "Steps = 1310 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import copy, itertools, random\n", + "\n", + " def merge(row):\n", + " nonlocal score\n", + " new = [x for x in row if x]\n", + " merged = []\n", + " i = 0\n", + " while i < len(new):\n", + " if i+1 < len(new) and new[i]==new[i+1]:\n", + " merged.append(new[i]*2)\n", + " score += new[i]*2\n", + " i += 2\n", + " else:\n", + " merged.append(new[i])\n", + " i += 1\n", + " merged += [0]*(len(row)-len(merged))\n", + " return merged\n", + "\n", + " def transform(b, dir):\n", + " new = copy.deepcopy(b)\n", + " if dir=='W':\n", + " for c in range(4):\n", + " col=[new[r][c] for r in range(4)]\n", + " col=merge(col)\n", + " for r in range(4): new[r][c]=col[r]\n", + " if dir=='S':\n", + " for c in range(4):\n", + " col=[new[r][c] for r in range(4)][::-1]\n", + " col=merge(col)\n", + " col=col[::-1]\n", + " for r in range(4): new[r][c]=col[r]\n", + " if dir=='A':\n", + " for r in range(4):\n", + " new[r]=merge(new[r])\n", + " if dir=='D':\n", + " for r in range(4):\n", + " new[r]=merge(new[r][::-1])[::-1]\n", + " return new\n", + "\n", + " def board_score(b):\n", + " return max(max(row) for row in b)\n", + "\n", + " best=None; best_score=-1\n", + " dirs='WASD'\n", + " for d in dirs:\n", + " new=transform(board,d)\n", + " if new!=board:\n", + " s=board_score(new)\n", + " if s>best_score:\n", + " best_score=s; best=d\n", + " return best if best else random.choice('WASD')\n", + "Timeout\n", + "Steps = 1129 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # Simple heuristic: always push left\n", + " return \"A\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " return \"W\" # simple fixed strategy\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " return \"W\" # Basic placeholder strategy: always move up\n", + "Timeout\n", + "Timeout\n", + "Steps = 1223 State = success\n", + "def strategy(board):\n", + " # Simple heuristic: always try to move up if possible, otherwise random legal move\n", + " from random import choice\n", + " moves = ['W', 'A', 'S', 'D']\n", + " return choice(moves)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "def strategy(board):\n", + " \"\"\"Very simple 2048 strategy: always try to move up if tiles can combine, else down, left, right.\"\"\"\n", + " # helper to check if any move is possible in a given direction\n", + " def can_move(b, dir):\n", + " n = len(b)\n", + " # simulate slide in given direction, return True if any change\n", + " temp = [row[:] for row in b]\n", + " moved = False\n", + " if dir == 'W':\n", + " for c in range(n):\n", + " col = [temp[r][c] for r in range(n)]\n", + " merged, _ = slide(col)\n", + " if merged != col:\n", + " moved = True\n", + " for r in range(n):\n", + " temp[r][c] = merged[r]\n", + " elif dir == 'S':\n", + " for c in range(n):\n", + " col = [temp[r][c] for r in range(n)][::-1]\n", + " merged, _ = slide(col)\n", + " merged = merged[::-1]\n", + " if merged != [temp[r][c] for r in range(n)]:\n", + " moved = True\n", + " for r in range(n):\n", + " temp[n-1-r][c] = merged[r]\n", + " elif dir == 'A':\n", + " for r in range(n):\n", + " row = temp[r][:]\n", + " merged, _ = slide(row)\n", + " if merged != row:\n", + " moved = True\n", + " temp[r] = merged\n", + " elif dir == 'D':\n", + " for r in range(n):\n", + " row = temp[r][::-1]\n", + " merged, _ = slide(row)\n", + " merged = merged[::-1]\n", + " if merged != temp[r]:\n", + " moved = True\n", + " temp[r] = merged\n", + " return moved\n", + "\n", + " def slide(line):\n", + " \"\"\"Slide non-zeros left and merge.\"\"\"\n", + " new = [x for x in line if x != 0]\n", + " merged = []\n", + " skip = False\n", + " i = 0\n", + " while i < len(new):\n", + " if i+1 < len(new) and new[i] == new[i+1]:\n", + " merged.append(new[i]*2)\n", + " i += 2\n", + " else:\n", + " merged.append(new[i])\n", + " i += 1\n", + " merged += [0]*(len(line)-len(merged))\n", + " return merged, merged != line\n", + "\n", + " for d in ['W','S','A','D']:\n", + " if can_move(board, d):\n", + " return d\n", + " return 'W' # fallback\n", + "Steps = 205 State = failed\n", + "┌───┬───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "└───┴───┴───┴───┴───┴───┘\n", + "Timeout\n", + "Timeout\n", + "Steps = 988 State = failed\n", + "def strategy(board):\n", + " # Helper to simulate a move\n", + " def move(board, key):\n", + " def compress(row):\n", + " new = [x for x in row if x]\n", + " for i in range(len(new)-1):\n", + " if new[i]==new[i+1]:\n", + " new[i]*=2\n", + " new[i+1]=0\n", + " return [x for x in new if x]\n", + " def transpose(b):\n", + " return [list(i) for i in zip(*b)]\n", + " def reverse(b):\n", + " return [row[::-1] for row in b]\n", + " def slide_left(b):\n", + " return [compress(r) + [0]*(len(b[0])-len(compress(r))) for r in b]\n", + " def apply(b, k):\n", + " n=len(b)\n", + " if k=='W':return transpose(slide_left(transpose(b)))\n", + " if k=='S':return transpose(reverse(slide_left(reverse(transpose(b)))))\n", + " if k=='A':return slide_left(b)\n", + " if k=='D':return reverse(slide_left(reverse(b)))\n", + " return apply(board, key)\n", + " moves = \"WASD\"\n", + " for m in moves:\n", + " if move(board, m)!=board:\n", + " return m\n", + " return \"W\"\n", + "┌───┬───┬───┬───┬───┬───┐\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;214m512\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;214m512\u001b[0m│\u001b[38;5;154m128\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;154m128\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;226m256\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├───┼───┼───┼───┼───┼───┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└───┴───┴───┴───┴───┴───┘\n", + "Timeout\n", + "def strategy(board):\n", + " return \"W\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Exception = list index out of range\n", + "Timeout\n", + "def strategy(board):\n", + " # Simple strategy: always move up unless the board is empty.\n", + " return \"W\"\n", + "Timeout\n", + "Timeout\n", + "Steps = 1095 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\",\"A\",\"S\",\"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1285 State = success\n", + "def strategy(board):\n", + " # Simple heuristic: try to move left if possible, otherwise random\n", + " from random import choice\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " return choice(moves)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " import random\n", + " moves = \"WASD\"\n", + " return random.choice(moves)\n", + "Steps = 1181 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # Define move application\n", + " def move(mat, dir):\n", + " def compress(row):\n", + " new = [x for x in row if x != 0]\n", + " res = []\n", + " skip = False\n", + " for i in range(len(new)):\n", + " if skip:\n", + " skip = False\n", + " continue\n", + " if i+1 < len(new) and new[i] == new[i+1]:\n", + " res.append(new[i]*2)\n", + " skip = True\n", + " else:\n", + " res.append(new[i])\n", + " res += [0]*(len(row)-len(res))\n", + " return res\n", + " def transpose(m): return [list(row) for row in zip(*m)]\n", + " m = [r[:] for r in mat]\n", + " if dir == 'W': # up\n", + " m = transpose(m)\n", + " m = [compress(row) for row in m]\n", + " m = transpose(m)\n", + " elif dir == 'S': # down\n", + " m = transpose(m)\n", + " m = [compress(row[::-1])[::-1] for row in m]\n", + " m = transpose(m)\n", + " elif dir == 'A': # left\n", + " m = [compress(row) for row in m]\n", + " elif dir == 'D': # right\n", + " m = [compress(row[::-1])[::-1] for row in m]\n", + " return m\n", + "\n", + " # Evaluate board by total merge value\n", + " def score(mat):\n", + " return sum(sum(row) for row in mat)\n", + "\n", + " best_move = None\n", + " best_score = -1\n", + " for move_char in 'WASD':\n", + " new_board = move(board, move_char)\n", + " sc = score(new_board)\n", + " if sc > best_score:\n", + " best_score = sc\n", + " best_move = move_char\n", + " return best_move\n", + "Timeout\n", + "Timeout\n", + "Steps = 1264 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1157 State = success\n", + "def strategy(board):\n", + " import random\n", + " moves = ['W', 'A', 'S', 'D']\n", + " # Simple heuristic: choose a random valid move\n", + " return random.choice(moves)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " return random.choice(moves)\n", + "Steps = 1490 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1072 State = failed\n", + "def strategy(board):\n", + " import copy, random\n", + " def move(b, d):\n", + " # simple 2048 move implementation\n", + " def slide(arr):\n", + " arr = [x for x in arr if x!=0]\n", + " res=[]\n", + " skip=False\n", + " for i in range(len(arr)):\n", + " if skip: skip=False; continue\n", + " if i+1 best_empty:\n", + " best_empty = e\n", + " best = m\n", + " return best if best else random.choice(moves)\n", + "Timeout\n", + "Timeout\n", + "Steps = 1372 State = success\n", + "def strategy(board):\n", + " import random\n", + " # choose a random valid move from 'W', 'A', 'S', 'D'\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1228 State = success\n", + "def strategy(board):\n", + " from random import choice\n", + " \n", + " # Possible moves\n", + " moves = ['W', 'A', 'S', 'D']\n", + " \n", + " # Simple heuristic: prefer moves that generate a merge or create a larger tile\n", + " def can_merge(b, move):\n", + " # Simulate a move and check if any tiles merge\n", + " # For brevity, just return False for this example\n", + " return False\n", + " \n", + " # Filter moves that could potentially merge\n", + " valid_moves = [m for m in moves if can_merge(board, m)]\n", + " if valid_moves:\n", + " return choice(valid_moves)\n", + " \n", + " # Fallback: random move\n", + " return choice(moves)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "def strategy(board):\n", + " import random\n", + " # Simple heuristic: try moves in random order until one changes the board\n", + " moves = ['W','A','S','D']\n", + " random.shuffle(moves)\n", + " def can_move(b, dir):\n", + " # simulate a move and check if board changes\n", + " def rotate(b, times):\n", + " for _ in range(times):\n", + " b = [list(row) for row in zip(*b[::-1])]\n", + " return b\n", + " n = len(b)\n", + " def merge_line(line):\n", + " new = [x for x in line if x]\n", + " merged = []\n", + " skip = False\n", + " for i in range(len(new)):\n", + " if skip: skip = False; continue\n", + " if i+1 < len(new) and new[i] == new[i+1]:\n", + " merged.append(new[i]*2)\n", + " skip = True\n", + " else:\n", + " merged.append(new[i])\n", + " merged += [0]*(n-len(merged))\n", + " return merged\n", + " def move(b, dir):\n", + " if dir=='W':\n", + " b = rotate(b,3)\n", + " elif dir=='S':\n", + " b = rotate(b,1)\n", + " elif dir=='D':\n", + " b = rotate(b,2)\n", + " new_b = []\n", + " for row in b:\n", + " new_b.append(merge_line(row))\n", + " # rotate back\n", + " for _ in range((4-({'W':3,'S':1,'D':2,'A':0}[dir]))%4):\n", + " new_b = [list(row) for row in zip(*new_b[::-1])]\n", + " return new_b\n", + " return move(b, dir) != b\n", + " for m in moves:\n", + " if can_move(board, m):\n", + " return m\n", + " return random.choice(moves)\n", + "Steps = 1173 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1221 State = success\n", + "def strategy(board):\n", + " import random\n", + " # Convert board to 4x4 grid\n", + " size = len(board)\n", + " directions = [\"W\", \"A\", \"S\", \"D\"]\n", + " \n", + " def move_possible(d):\n", + " # Basic check: return True if at least one move in that direction changes board\n", + " rowc, colc = 0, 0\n", + " for r in range(size):\n", + " for c in range(size):\n", + " if board[r][c] == 0:\n", + " return True\n", + " return False\n", + " \n", + " # Randomly pick a direction that is valid (here we just return a random choice)\n", + " # In a real strategy you'd evaluate each move, but for brevity we pick random\n", + " return random.choice(directions)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # A very simple strategy: always move up ('W') unless it would lose immediately.\n", + " # This is a placeholder; a more sophisticated strategy would evaluate moves.\n", + " return \"W\"\n", + "Timeout\n", + "Exception = name 'copy' is not defined\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # Simple heuristic: choose the move that yields the most empty tiles after simulation\n", + " import random, copy\n", + "\n", + " moves = ['W', 'A', 'S', 'D']\n", + " def simulate(b, m):\n", + " # naive clone and apply a single shift (no merging logic)\n", + " return b # placeholder, as full 2048 logic is complex\n", + "\n", + " best = moves[0]\n", + " best_empty = -1\n", + " for m in moves:\n", + " b_copy = copy.deepcopy(board)\n", + " # placeholder: pretend each move yields random empty count\n", + " empty = random.randint(0, 15) # dummy\n", + " if empty > best_empty:\n", + " best_empty = empty\n", + " best = m\n", + " return best\n", + "Steps = 1260 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Steps = 1500 State = failed\n", + "def strategy(board):\n", + " # Simple heuristic: try moves in order, pick first that changes board\n", + " def tilt(board, dir):\n", + " n = len(board)\n", + " def compress(row):\n", + " new = [x for x in row if x]\n", + " for i in range(len(new)-1):\n", + " if new[i] == new[i+1]:\n", + " new[i] *= 2\n", + " new[i+1] = 0\n", + " new = [x for x in new if x]\n", + " return new + [0]*(n-len(new))\n", + " result = [[0]*n for _ in range(n)]\n", + " for i in range(n):\n", + " for j in range(n):\n", + " result[i][j] = board[i][j]\n", + " if dir == \"W\":\n", + " for j in range(n):\n", + " col = [result[i][j] for i in range(n)]\n", + " newcol = compress(col)\n", + " for i in range(n): result[i][j] = newcol[i]\n", + " elif dir == \"S\":\n", + " for j in range(n):\n", + " col = [result[i][j] for i in range(n)][::-1]\n", + " newcol = compress(col)[::-1]\n", + " for i in range(n): result[i][j] = newcol[i]\n", + " elif dir == \"A\":\n", + " for i in range(n):\n", + " newrow = compress(result[i])\n", + " result[i] = newrow\n", + " elif dir == \"D\":\n", + " for i in range(n):\n", + " newrow = compress(result[i][::-1])[::-1]\n", + " result[i] = newrow\n", + " return result\n", + " moves = [\"W\",\"A\",\"S\",\"D\"]\n", + " for m in moves:\n", + " if tilt(board, m) != board:\n", + " return m\n", + " return moves[0]\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;208m1024\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " # Simple Monte‑Carlo style: try all moves, pick the one that gives the highest\n", + " # immediate score (sum of merged tiles) in one step. \n", + " def simulate_move(b, dir):\n", + " import copy\n", + " b2 = copy.deepcopy(b)\n", + " size = len(b2)\n", + " score = 0\n", + "\n", + " def compress_line(line):\n", + " nonlocal score\n", + " new = [x for x in line if x != 0]\n", + " merged = []\n", + " i = 0\n", + " while i < len(new):\n", + " if i+1 < len(new) and new[i] == new[i+1]:\n", + " merged.append(new[i]*2)\n", + " score += new[i]*2\n", + " i += 2\n", + " else:\n", + " merged.append(new[i])\n", + " i += 1\n", + " merged += [0]*(size-len(merged))\n", + " return merged\n", + "\n", + " def move_left(mat):\n", + " for i in range(size):\n", + " mat[i] = compress_line(mat[i])\n", + "\n", + " def transpose(mat):\n", + " return [list(row) for row in zip(*mat)]\n", + "\n", + " if dir == \"W\":\n", + " move_left(transpose(b2))\n", + " transpose(b2)\n", + " elif dir == \"S\":\n", + " move_left(b2)\n", + " elif dir == \"A\":\n", + " move_left(b2)\n", + " elif dir == \"D\":\n", + " move_left(transpose(b2))\n", + " transpose(b2)\n", + "\n", + " return score\n", + "\n", + " best_dir = None\n", + " best_score = -1\n", + " for d in \"WASD\":\n", + " sc = simulate_move(board, d)\n", + " if sc > best_score:\n", + " best_score, best_dir = sc, d\n", + " return best_dir if best_dir else \"W\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import copy, random\n", + " def move(b, dir):\n", + " size=len(b)\n", + " def rotate(b):\n", + " return [list(row) for row in zip(*b[::-1])]\n", + " if dir=='W':\n", + " g=rotate(rotate(rotate(rotate(b))))\n", + " elif dir=='A':\n", + " g=rotate(rotate(b))\n", + " elif dir=='D':\n", + " g=rotate(b)\n", + " else:\n", + " g=b\n", + " # slide rows left\n", + " def slide(row):\n", + " new=[i for i in row if i!=0]\n", + " res=[]\n", + " i=0\n", + " while ibestscore:\n", + " bestscore=score;bestdir=d\n", + " return bestdir or random.choice(\"WASD\")\n", + "Timeout\n", + "Timeout\n", + "Steps = 1427 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\",\"A\",\"S\",\"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Steps = 1150 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " # Simple strategy: always try to move up if possible, otherwise random\n", + " # Since we don't have a full engine, just return \"W\".\n", + " return \"W\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Steps = 1347 State = success\n", + "def strategy(board):\n", + " # Simple random move strategy\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " # Simple heuristic: try all moves and pick the one that results in the most merges\n", + " def rotate_cw(b): # rotate the board 90° clockwise\n", + " return [ [b[3-j][i] for j in range(4)] for i in range(4) ]\n", + "\n", + " def compress(b):\n", + " new_b = [[0]*4 for _ in range(4)]\n", + " score = 0\n", + " for i in range(4):\n", + " pos = 0\n", + " last = 0\n", + " for j in range(4):\n", + " val = b[i][j]\n", + " if val:\n", + " if val == last:\n", + " new_b[i][pos-1] *= 2\n", + " score += new_b[i][pos-1]\n", + " last = 0\n", + " else:\n", + " last = val\n", + " new_b[i][pos] = val\n", + " pos += 1\n", + " return new_b, score\n", + "\n", + " def move_left(b):\n", + " compressed, s = compress(b)\n", + " return compressed, s\n", + "\n", + " def move(board, dir):\n", + " b = [row[:] for row in board]\n", + " for _ in range(dir): # 0:W,1:D,2:S,3:A\n", + " b = rotate_cw(b)\n", + " new_b, score = move_left(b)\n", + " for _ in range(4-dir):\n", + " new_b = rotate_cw(new_b)\n", + " return new_b, score\n", + "\n", + " moves = ['W','A','S','D']\n", + " best_move = None\n", + " best_score = -1\n", + " for i, m in enumerate(moves):\n", + " _, s = move(board, i)\n", + " if s > best_score:\n", + " best_score, best_move = s, m\n", + " return best_move\n", + "Timeout\n", + "Steps = 1363 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\",\"A\",\"S\",\"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " \"\"\"\n", + " A very simple strategy for 2048: try moves in the order W, A, S, D\n", + " and return the first one that changes the board state.\n", + " \"\"\"\n", + " def can_move(b, dir):\n", + " # simulate a move and check if board changes\n", + " from copy import deepcopy\n", + " import numpy as np\n", + "\n", + " def move(b):\n", + " # inner helper to shift and merge once\n", + " def merge(arr):\n", + " result = []\n", + " skip = False\n", + " for i in range(len(arr)):\n", + " if skip:\n", + " skip = False\n", + " continue\n", + " if i+1 < len(arr) and arr[i] and arr[i] == arr[i+1]:\n", + " result.append(arr[i]*2)\n", + " skip = True\n", + " else:\n", + " result.append(arr[i])\n", + " return result + [0]*(len(arr)-len(result))\n", + "\n", + " n = len(b)\n", + " new_board = [[0]*n for _ in range(n)]\n", + " if dir == 'W':\n", + " for j in range(n):\n", + " col = [b[i][j] for i in range(n)]\n", + " moved = merge(col)\n", + " for i in range(n):\n", + " new_board[i][j] = moved[i]\n", + " elif dir == 'S':\n", + " for j in range(n):\n", + " col = [b[i][j] for i in range(n)][::-1]\n", + " moved = merge(col)\n", + " moved = moved[::-1]\n", + " for i in range(n):\n", + " new_board[i][j] = moved[i]\n", + " elif dir == 'A':\n", + " for i in range(n):\n", + " row = b[i]\n", + " moved = merge(row)\n", + " new_board[i] = moved\n", + " elif dir == 'D':\n", + " for i in range(n):\n", + " row = b[i][::-1]\n", + " moved = merge(row)\n", + " new_board[i] = moved[::-1]\n", + " return new_board\n", + "\n", + " new_board = move(b)\n", + " return new_board != b\n", + "\n", + " for d in ['W','A','S','D']:\n", + " if can_move(board, d):\n", + " return d\n", + " # if no move changes board, pick any (fallback)\n", + " return 'W'\n", + "Timeout\n", + "Steps = 1136 State = success\n", + "def strategy(board):\n", + " import random\n", + " # Simple heuristic: Random move that changes the board\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " \n", + " def board_after_move(b, m):\n", + " # simulate movement by creating a copy of board and applying move\n", + " # This is a very simplified implementation: in actual 2048 logic\n", + " # you'd need to merge tiles. For demo purposes, just return original.\n", + " return b # placeholder\n", + " \n", + " random.shuffle(moves)\n", + " for m in moves:\n", + " if board_after_move(board, m) != board:\n", + " return m\n", + " return moves[0]\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import random\n", + " # simple heuristic: pick a random valid move\n", + " # Define helper to check if move is valid (changes board)\n", + " def move_possible(b, move):\n", + " # create a copy and apply move, compare\n", + " import copy\n", + " tmp = copy.deepcopy(b)\n", + " # apply move on tmp\n", + " def move_board(bd, dir):\n", + " size = len(bd)\n", + " # helper to compress row/col\n", + " def compress(line):\n", + " # shift and merge\n", + " new = [v for v in line if v!=0]\n", + " res = []\n", + " skip = False\n", + " i = 0\n", + " while i < len(new):\n", + " if i+1 < len(new) and new[i]==new[i+1]:\n", + " res.append(new[i]*2)\n", + " i+=2\n", + " else:\n", + " res.append(new[i])\n", + " i+=1\n", + " res += [0]*(size-len(res))\n", + " return res\n", + " if dir==\"L\":\n", + " for i in range(size):\n", + " bd[i]=compress(bd[i])\n", + " elif dir==\"R\":\n", + " for i in range(size):\n", + " bd[i]=list(reversed(compress(list(reversed(bd[i])))))\n", + " elif dir==\"U\":\n", + " for j in range(size):\n", + " col=[bd[i][j] for i in range(size)]\n", + " col=compress(col)\n", + " for i in range(size):\n", + " bd[i][j]=col[i]\n", + " elif dir==\"D\":\n", + " for j in range(size):\n", + " col=[bd[i][j] for i in range(size)]\n", + " col=list(reversed(compress(list(reversed(col)))))\n", + " for i in range(size):\n", + " bd[i][j]=col[i]\n", + " move_board(tmp, move)\n", + " return tmp != b\n", + "\n", + " directions = [\"W\",\"A\",\"S\",\"D\"]\n", + " valid_moves = [m for m in directions if move_possible(board, m)]\n", + " return random.choice(valid_moves) if valid_moves else \"W\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Steps = 2185 State = failed\n", + "def strategy(board):\n", + " def can_move(board, dir):\n", + " def move(board, dir):\n", + " def compress(line):\n", + " new = [x for x in line if x]\n", + " merged = []\n", + " skip = False\n", + " i = 0\n", + " while i < len(new):\n", + " if i+1 < len(new) and new[i] == new[i+1]:\n", + " merged.append(new[i]*2)\n", + " i += 2\n", + " else:\n", + " merged.append(new[i])\n", + " i += 1\n", + " merged += [0]*(len(line)-len(merged))\n", + " return merged\n", + " n = len(board)\n", + " b = [row[:] for row in board]\n", + " if dir=='W':\n", + " for j in range(n):\n", + " col = [b[i][j] for i in range(n)]\n", + " merged = compress(col)\n", + " for i in range(n): b[i][j] = merged[i]\n", + " elif dir=='S':\n", + " for j in range(n):\n", + " col = [b[i][j] for i in range(n)][::-1]\n", + " merged = compress(col)\n", + " merged = merged[::-1]\n", + " for i in range(n): b[i][j] = merged[i]\n", + " elif dir=='A':\n", + " for i in range(n):\n", + " row = b[i]\n", + " merged = compress(row)\n", + " b[i] = merged\n", + " elif dir=='D':\n", + " for i in range(n):\n", + " row = b[i][::-1]\n", + " merged = compress(row)\n", + " b[i] = merged[::-1]\n", + " return b\n", + " moved = move(board, dir)\n", + " return moved != board\n", + " for d in \"WASD\":\n", + " if can_move(board, d):\n", + " return d\n", + " return \"W\"\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;208m1024\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;208m1024\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1127 State = success\n", + "def strategy(board):\n", + " import random\n", + " # Simple heuristic: if any move possible, pick a random legal one.\n", + " moves = ['W', 'A', 'S', 'D']\n", + " # Randomly shuffle and pick first that changes board (or return any if all invalid)\n", + " def can_move(board, move):\n", + " # Very simple check: ensure move is within bounds and not all cells zero\n", + " return any(any(row) for row in board)\n", + " random.shuffle(moves)\n", + " return moves[0]\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " # Simple heuristic: always try to move up (\"W\") if possible, otherwise down (\"S\")\n", + " # We'll simulate a single move to see if any tile merges or moves.\n", + " def can_move_up(b):\n", + " for col in range(4):\n", + " for row in range(1, 4):\n", + " if b[row][col] != 0 and (b[row-1][col] == 0 or b[row-1][col] == b[row][col]):\n", + " return True\n", + " return False\n", + " return \"W\" if can_move_up(board) else \"S\"\n", + "Timeout\n", + "Exception = list index out of range\n", + "Steps = 1218 State = failed\n", + "def strategy(board):\n", + " import copy, random\n", + "\n", + " dirs = {\"W\": (-1, 0), \"A\": (0, -1), \"S\": (1, 0), \"D\": (0, 1)}\n", + "\n", + " def slide_line(line):\n", + " new = [x for x in line if x != 0]\n", + " res = []\n", + " i = 0\n", + " while i < len(new):\n", + " if i + 1 < len(new) and new[i] == new[i + 1]:\n", + " res.append(new[i] * 2)\n", + " i += 2\n", + " else:\n", + " res.append(new[i])\n", + " i += 1\n", + " res += [0] * (len(line) - len(res))\n", + " return res\n", + "\n", + " def move(b, d):\n", + " n = len(b)\n", + " bx = [row[:] for row in b]\n", + " moved = False\n", + " for i in range(n):\n", + " if d[0] == -1 or d[0] == 1:\n", + " line = [bx[j][i] for j in range(n)]\n", + " if d[0] == 1: line.reverse()\n", + " new = slide_line(line)\n", + " if d[0] == 1: new.reverse()\n", + " for j in range(n):\n", + " if bx[j][i] != new[j]:\n", + " moved = True\n", + " bx[j][i] = new[j]\n", + " else:\n", + " line = bx[i][:]\n", + " if d[1] == 1: line.reverse()\n", + " new = slide_line(line)\n", + " if d[1] == 1: new.reverse()\n", + " if new != bx[i]:\n", + " moved = True\n", + " bx[i] = new\n", + " return bx, moved\n", + "\n", + " def score(b):\n", + " return sum(sum(row) for row in b)\n", + "\n", + " best = None\n", + " best_score = -1\n", + " for key, d in dirs.items():\n", + " new_board, moved = move(board, d)\n", + " if not moved: continue\n", + " s = score(new_board)\n", + " if s > best_score:\n", + " best_score = s\n", + " best = key\n", + " return best if best else random.choice(list(dirs.keys()))\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;208m1024\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # Simple deterministic strategy: try to push upwards if possible otherwise right\n", + " # Check if any merge or move possible upward, else right\n", + " def can_move(board, drow, dcol):\n", + " for r in range(4):\n", + " for c in range(4):\n", + " val = board[r][c]\n", + " if val == 0: continue\n", + " nr, nc = r + drow, c + dcol\n", + " if 0 <= nr < 4 and 0 <= nc < 4:\n", + " nb = board[nr][nc]\n", + " if nb == 0 or nb == val: return True\n", + " return False\n", + "\n", + " if can_move(board, -1, 0):\n", + " return \"W\"\n", + " if can_move(board, 0, 1):\n", + " return \"D\"\n", + " if can_move(board, 1, 0):\n", + " return \"S\"\n", + " if can_move(board, 0, -1):\n", + " return \"A\"\n", + " # if no moves possible, just return \"W\"\n", + " return \"W\"\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " # Simple heuristic: always try to move 'W' (up) if possible,\n", + " # otherwise pick the first available move among A, S, D.\n", + " moves = ['W', 'A', 'S', 'D']\n", + " for m in moves:\n", + " if can_move(board, m):\n", + " return m\n", + " return 'W'\n", + "\n", + " def can_move(b, m):\n", + " # Check if a move in direction m is possible (board not empty)\n", + " # This is a minimal placeholder that always returns True\n", + " # for demonstration purposes.\n", + " return True\n", + "Exception = cannot access local variable 'can_move' where it is not associated with a value\n", + "Steps = 1376 State = success\n", + "def strategy(board):\n", + " import random\n", + " return random.choice([\"W\", \"A\", \"S\", \"D\"])\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Steps = 1393 State = success\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\",\"A\",\"S\",\"D\"]\n", + " # Simple heuristic: prefer moves that don't change board, otherwise random\n", + " def can_move(b, dir_):\n", + " # simulate a move and check if board changes\n", + " bcopy = [row[:] for row in b]\n", + " # placeholder for actual move logic\n", + " return True # assume any direction always possible for simplicity\n", + " \n", + " valid_moves = [m for m in moves if can_move(board, m)]\n", + " return random.choice(valid_moves)\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "def strategy(board):\n", + " # simulate a move in 2048\n", + " def move(b, dir):\n", + " def transpose(m): return [list(x) for x in zip(*m)]\n", + " def reverse(m): return [row[::-1] for row in m]\n", + " def compress(row):\n", + " new = [x for x in row if x]\n", + " merged = []\n", + " skip = False\n", + " for i in range(len(new)):\n", + " if skip: skip = False; continue\n", + " if i+1 < len(new) and new[i]==new[i+1]:\n", + " merged.append(new[i]*2)\n", + " skip = True\n", + " else:\n", + " merged.append(new[i])\n", + " return merged + [0]*(len(row)-len(merged))\n", + " def slide(m):\n", + " return [compress(row) for row in m]\n", + " m = [row[:] for row in b]\n", + " if dir==\"W\":\n", + " m = transpose(m)\n", + " m = slide(m)\n", + " m = transpose(m)\n", + " elif dir==\"S\":\n", + " m = transpose(m)\n", + " m = reverse(m)\n", + " m = slide(m)\n", + " m = reverse(m)\n", + " m = transpose(m)\n", + " elif dir==\"A\":\n", + " m = reverse(m)\n", + " m = slide(m)\n", + " m = reverse(m)\n", + " elif dir==\"D\":\n", + " m = slide(m)\n", + " return m\n", + " dirs = \"WASD\"\n", + " for d in dirs:\n", + " if move(board, d) != board:\n", + " return d\n", + " return dirs[0]\n", + "Timeout\n", + "Steps = 1343 State = success\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " # Randomly pick a move that actually changes the board state\n", + " board_str = str(board)\n", + " for _ in range(10):\n", + " mv = random.choice(moves)\n", + " # Very simple: pretend every move is valid\n", + " return mv\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "Steps = 1013 State = success\n", + "def strategy(board):\n", + " import random\n", + " # simple heuristic: try moves that combine tiles\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " best_move = random.choice(moves)\n", + " # Simple check: if any move leads to a merge, prioritize that\n", + " def can_merge(b, move):\n", + " def copy_board(b):\n", + " return [row[:] for row in b]\n", + " def slide(row):\n", + " tiles = [t for t in row if t]\n", + " new = []\n", + " skip = False\n", + " for i in range(len(tiles)):\n", + " if skip:\n", + " skip = False\n", + " continue\n", + " if i+1 < len(tiles) and tiles[i] == tiles[i+1]:\n", + " new.append(tiles[i]*2)\n", + " skip = True\n", + " else:\n", + " new.append(tiles[i])\n", + " return new + [0]*(len(row)-len(new))\n", + " def transpose(b):\n", + " return [list(col) for col in zip(*b)]\n", + " b2 = copy_board(b)\n", + " if move == \"W\":\n", + " b2 = transpose(b2)\n", + " for i in range(4):\n", + " b2[i] = slide(b2[i])\n", + " b2 = transpose(b2)\n", + " elif move == \"S\":\n", + " b2 = transpose(b2)\n", + " for i in range(4):\n", + " b2[i] = list(reversed(slide(list(reversed(b2[i])))))\n", + " b2 = transpose(b2)\n", + " elif move == \"A\":\n", + " for i in range(4):\n", + " b2[i] = slide(b2[i])\n", + " elif move == \"D\":\n", + " for i in range(4):\n", + " b2[i] = list(reversed(slide(list(reversed(b2[i])))))\n", + " return b2 != b\n", + " # evaluate moves\n", + " for m in moves:\n", + " if can_merge(board, m):\n", + " best_move = m\n", + " break\n", + " return best_move\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\", \"A\", \"S\", \"D\"]\n", + " return random.choice(moves)\n", + "Steps = 1620 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;214m 512\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Steps = 1342 State = success\n", + "def strategy(board):\n", + " # Simple strategy: choose a random legal move from those that change the board\n", + " import random, copy\n", + " moves = ['W', 'A', 'S', 'D']\n", + " def apply_move(b, m):\n", + " def rotate(b, times):\n", + " for _ in range(times):\n", + " b = [list(row) for row in zip(*b[::-1])]\n", + " return b\n", + " def slide_and_merge(b):\n", + " new_b = []\n", + " for row in b:\n", + " tiles = [t for t in row if t != 0]\n", + " merged = []\n", + " skip = False\n", + " for i in range(len(tiles)):\n", + " if skip:\n", + " skip = False\n", + " continue\n", + " if i+1 < len(tiles) and tiles[i] == tiles[i+1]:\n", + " merged.append(tiles[i]*2)\n", + " skip = True\n", + " else:\n", + " merged.append(tiles[i])\n", + " merged += [0]*(4-len(merged))\n", + " new_b.append(merged)\n", + " return new_b\n", + " rot = {'W':0,'A':1,'S':2,'D':3}[m]\n", + " b_rot = rotate(b, rot)\n", + " b_new = slide_and_merge(b_rot)\n", + " b_final = rotate(b_new, (4-rot)%4)\n", + " return b_final\n", + " legal_moves = []\n", + " for m in moves:\n", + " if apply_move(copy.deepcopy(board), m) != board:\n", + " legal_moves.append(m)\n", + " return random.choice(legal_moves) if legal_moves else 'W'\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;118m 64\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;154m 128\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;49m 8\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Timeout\n", + "Timeout\n", + "def strategy(board):\n", + " import random\n", + " moves = [\"W\",\"A\",\"S\",\"D\"]\n", + " # Prefer moves that combine tiles or create empty spaces\n", + " def can_move(m):\n", + " n = len(board)\n", + " tmp = [row[:] for row in board]\n", + " def move_left(b):\n", + " changed = False\n", + " for i in range(n):\n", + " merged = [False]*n\n", + " for j in range(1,n):\n", + " if b[i][j]==0: continue\n", + " k=j\n", + " while k>0 and b[i][k-1]==0:\n", + " b[i][k-1]=b[i][k]; b[i][k]=0; k-=1; changed=True\n", + " if k>0 and b[i][k-1]==b[i][k]:\n", + " b[i][k-1]*=2; b[i][k]=0; changed=True; merged[k-1]=True\n", + " return changed\n", + " def rotate(b, times):\n", + " for _ in range(times):\n", + " b = [list(row) for row in zip(*b[::-1])]\n", + " return b\n", + " def revert(b, times):\n", + " for _ in range(times):\n", + " b = [list(row) for row in zip(*b)][::-1]\n", + " return b\n", + " for t in range(4):\n", + " tmp = rotate(tmp,1)\n", + " if move_left(tmp):\n", + " return True\n", + " return False\n", + " viable = [m for m in moves if can_move(m)]\n", + " return random.choice(viable) if viable else random.choice(moves)\n", + "Steps = 1201 State = success\n", + "┌────┬────┬────┬────┬────┬────┐\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;47m 16\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;49m 8\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;196m2048\u001b[0m│\u001b[38;5;226m 256\u001b[0m│\u001b[38;5;239m .\u001b[0m│\u001b[38;5;239m .\u001b[0m│\n", + "├────┼────┼────┼────┼────┼────┤\n", + "│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;46m 32\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\u001b[38;5;51m 4\u001b[0m│\u001b[38;5;45m 2\u001b[0m│\n", + "└────┴────┴────┴────┴────┴────┘\n", + "Exception = 'str' object does not support item assignment\n" + ] + } + ], + "source": [ + "trainer.train()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now with the LoRA we just trained with GRPO - we first save the LoRA first!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify LoRA is actually trained!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from safetensors import safe_open\n", + "\n", + "tensors = {}\n", + "with safe_open(\"grpo_saved_lora/adapter_model.safetensors\", framework = \"pt\") as f:\n", + " # Verify both A and B are non zero\n", + " for key in f.keys():\n", + " tensor = f.get_tensor(key)\n", + " n_zeros = (tensor == 0).sum() / tensor.numel()\n", + " assert(n_zeros.item() != tensor.numel())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Inference\n", + "Now let's try the model we just trained!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "_ = model.generate(\n", + " **tokenizer(images = None, text = text, return_tensors = \"pt\").to(\"cuda\"),\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " max_new_tokens = 1024,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = False),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Merge to 16bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Merge to 4bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Just LoRA adapters\n", + "if False:\n", + " model.save_pretrained(\"gemma_4_lora\")\n", + " tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "if False:\n", + " model.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")\n", + " tokenizer.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF.\n", + "\n", + "Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)):\n", + "* `q8_0` - Fast conversion. High resource use, but generally acceptable.\n", + "* `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K.\n", + "* `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K.\n", + "\n", + "[**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Save to 8bit Q8_0\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer,)\n", + "# Remember to go to https://huggingface.co/settings/tokens for a token!\n", + "# And change hf to your username!\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to 16bit GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"f16\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"f16\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to q4_k_m GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to multiple GGUF options - much faster if you want multiple!\n", + "if False:\n", + " model.push_to_hub_gguf(\n", + " \"HF_USERNAME/gemma_4_finetune\", # Change hf to your username!\n", + " tokenizer,\n", + " quantization_method = [\"q4_k_m\", \"q8_0\", \"q5_k_m\",],\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.ipynb new file mode 100644 index 0000000..333786e --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.ipynb @@ -0,0 +1,10738 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "cP7xBi17919u" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hzPgFeIkZn9q" + }, + "source": [ + "# Goal: Make Gemma 4 solve Sudoku puzzles with Reinforcement Learning\n", + "\n", + "Our goal is to make Gemma 4 learn to solve Sudoku puzzles using reinforcement learning (GRPO).\n", + "The model will devise a strategy to fill in empty cells, and we'll reward it for correct placements\n", + "and completing valid puzzles.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "31KIMLJLnHET" + }, + "source": [ + "# Installation\n", + "We'll be using [Unsloth](https://github.com/unslothai/unsloth) to do RL on Gemma 4. Unsloth saves 70% VRAM usage and makes reinforcement learning 2 to 6x faster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CGoDZwcunHEU" + }, + "outputs": [], + "source": [ + "%%capture\n", + "import os, importlib.util\n", + "!pip install --upgrade -qqq uv\n", + "if importlib.util.find_spec(\"torch\") is None or \"COLAB_\" in \"\".join(os.environ.keys()):\n", + " try: import numpy, PIL; _numpy = f\"numpy=={numpy.__version__}\"; _pil = f\"pillow=={PIL.__version__}\"\n", + " except: _numpy = \"numpy\"; _pil = \"pillow\"\n", + " # Gemma 4 requires transformers >= 5.5.0 — do NOT pin to 4.x here\n", + " !uv pip install -qqq \\\n", + " \"torch>=2.8.0\" \"triton>=3.4.0\" {_numpy} {_pil} torchvision bitsandbytes \\\n", + " \"unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo\" \\\n", + " \"unsloth[base] @ git+https://github.com/unslothai/unsloth\" \\\n", + " git+https://github.com/triton-lang/triton.git@0add68262ab0a2e33b84524346cb27cbb2787356#subdirectory=python/triton_kernels\n", + "elif importlib.util.find_spec(\"unsloth\") is None:\n", + " !uv pip install -qqq unsloth\n", + "# Gemma 4 requires transformers >= 5.5.0\n", + "!uv pip install --upgrade --no-deps \"transformers>=5.5.0\" tokenizers \"trl>=0.28.0\" unsloth unsloth_zoo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-9Hbdy3yxkDe" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "liF15-XtmF26" + }, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 415, + "referenced_widgets": [ + "7f2f1d7c247f45bb93ff417cb186c2eb", + "535adc052cf742b08633c3e05a9eeb52", + "5c19e35c5f934891b5ce135843529a5b", + "cc934485e87748579a7b2176f8470dd0", + "dfdfcf6e8b564262bd28ff6eb2558190", + "101a1cf35bb24d79a6e8b4ce77eb5bf7", + "0b4ac68cb5ea43f8a2c196c7f24bb349", + "c5fa4165c9f44af8acb5a35d53269863", + "ce301e618b3e4a7f9c081174974f7548", + "2f67d427db03445ca24bc0f7a7a17cbd", + "c9dfc15b3f89476189e4d2347f504e2e", + "6c41947826904b1db57cc32055f0eccb", + "c688bd93590c4270acb23f423ca85946", + "fdf731aed6144145a41c873115a3af61", + "a98e3900409d4bcebf9ddc25441bf56a", + "a6dc10a4fb0d474e819b3ecfa656b66a", + "0c11138badda42f1b3681626bcbe6ed0", + "cb84d4ce92124f94b4d7897cd3ee7fd4", + "743aa5ba0a8c41019cd0cbdb97b779df", + "d627022e756048e497691196783e374b", + "f0820395ae644b50988896600368588b", + "8a12ba8d6b9744468b652d460ce10295", + "0d90074b1b56432a8a8af05cadd57eea", + "b44c516743f944559b21e963b6e559b9", + "e5e07f71eee54e828dcb7b9dc5305b56", + "ceca217e98384421934db2fd81c78b08", + "74783be6311840b58560b8ae249292c8", + "3d96500eae194cd3a6a9f92c39f8760e", + "6761c9faa81040e1866b73ad40ca5e02", + "022dbbd06beb434b8cde47f13d1d9f3b", + "157505960e3f4d04be6bdeae7119b4a8", + "ea70dad5f2aa48a2adab37c178f34baf", + "a0fab082e7364d3391d765cb785ed2db", + "9273d234d79247fabcb5a2ace2ec118b", + "75f48d69379947af82ddb10ce4fca453", + "e2c30cdce58440b8afb1665297661883", + "6ea2009e3bd442fba3e001bed472b00e", + "4e026a1dbae64137a45f7c2b114b3178", + "e29039073cc7474cb0fe704cc7a668b7", + "5f3cc4d26ee742bcb19dbfc9598080ee", + "996e80a09e254708923e6e76e92c2554", + "5fec6f60f4274b9e964c916197dd155e", + "98536a63b3c94c018a16a9997bda38cf", + "ae3e1b9c33964a94a405952e9120fd0a", + "1e6181166ca0420eb9dce94d9ca0eceb", + "2161c02b9b984a47aa4539b5e3625ed5", + "55e46a3096a4438d9663c3b5a0b75f34", + "9825b277c4ca49a891c01739f2feaae0", + "284e45208cdd471ea6c361e5c9599481", + "2ca2adf3b2924431aba041483ad76c0e", + "3e6969868d724975bb067c1f962cbec6", + "915b8f0bc15a416c8e31f163838db6b4", + "6421eac0ecd14d4e9a7debd117178381", + "fb0e65319f7a400da1457acf2a7f4b38", + "ab9ee6b2f00a476a84b634404c573cba", + "913104b57a984d08af47073b60b2dc09", + "e5c3875f5d7f43e1acb57da68a5810d6", + "8bba15c72cdf4b9e995af58424d2021e", + "a6b55e2f0fca456c9c9a2c8546e56595", + "a82f008a06a6408c8520831378f433ef", + "152d919539764660b1223a911e580fa3", + "29394f0ef562422993d43a78c93eb1f1", + "f5f6ac53523743bbad0d09a8476c917c", + "9805bc6b1149455ca9d6a09cf05992fe", + "72a14d17820e446eb22e6261b97ce3e4", + "31d9ffc210964cd5ab82dcf38cddbc5b", + "6dd46cd00a7c45c484187857a89c844f", + "6230a33eb2ad43cdbd8999a1dea7bd4c", + "9d12ca85c4cb4c6d83cc70f0f4f7c527", + "2eb4215e9ef84c9b8ad121f0f6f531d0", + "5693cc3536314347856a708cceeda383", + "9539188d02584eb985835b4986935ced", + "ef49681d55954ce9876d0d1ce5d10fc9", + "e28e70aa5f834335ad7ea21450a25d32", + "fdd2d273a3bb495e99ed707bc6783b5d", + "0dd65ad33c184ebaa5ccaef977f34e83", + "b34efc6222d3420e90c13f02b726e6b5" + ] + }, + "id": "DkIvEkIIkEyB", + "outputId": "63346ae4-bef3-44ae-b99c-51b48ae829c4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:unsloth_zoo.log:Unsloth: Patched trl.models.utils.disable_gradient_checkpointing with a no-op to preserve Unsloth gradient checkpointing across TRL generation passes.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.4.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = None. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Unsloth: QLoRA and full finetuning all not selected. Switching to 16bit LoRA.\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7f2f1d7c247f45bb93ff417cb186c2eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00 0 ! Suggested 8, 16, 32, 64, 128\n", + " target_modules = [\n", + " \"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", + " \"gate_proj\", \"up_proj\", \"down_proj\",\n", + " ],\n", + " lora_alpha = lora_rank*2, # *2 speeds up training\n", + " use_gradient_checkpointing = \"unsloth\", # Reduces memory usage\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "N0QnO9_YJBOI" + }, + "source": [ + "# Sudoku Game Implementation\n", + "\n", + "We use GPT-5 to create a clean Sudoku solver environment. The strategy outputs \"row,col,value\" to fill cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "D9CI4jtgL5mw" + }, + "outputs": [], + "source": [ + "#@title Sudoku Game Implementation\n", + "from dataclasses import dataclass, field\n", + "from typing import List, Tuple, Optional\n", + "import random\n", + "import copy\n", + "\n", + "def _is_valid_placement(board: List[List[int]], row: int, col: int, num: int) -> bool:\n", + " \"\"\"Check if placing num at (row, col) is valid.\"\"\"\n", + " # Check row\n", + " if num in board[row]:\n", + " return False\n", + "\n", + " # Check column\n", + " if num in [board[r][col] for r in range(9)]:\n", + " return False\n", + "\n", + " # Check 3x3 box\n", + " box_row, box_col = 3 * (row // 3), 3 * (col // 3)\n", + " for r in range(box_row, box_row + 3):\n", + " for c in range(box_col, box_col + 3):\n", + " if board[r][c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + "def _solve_sudoku(board: List[List[int]]) -> bool:\n", + " \"\"\"Solve sudoku using backtracking (for puzzle generation).\"\"\"\n", + " for row in range(9):\n", + " for col in range(9):\n", + " if board[row][col] == 0:\n", + " for num in range(1, 10):\n", + " if _is_valid_placement(board, row, col, num):\n", + " board[row][col] = num\n", + " if _solve_sudoku(board):\n", + " return True\n", + " board[row][col] = 0\n", + " return False\n", + " return True\n", + "\n", + "def _generate_complete_board(rng: random.Random) -> List[List[int]]:\n", + " \"\"\"Generate a complete valid Sudoku board.\"\"\"\n", + " board = [[0 for _ in range(9)] for _ in range(9)]\n", + "\n", + " # Fill diagonal 3x3 boxes first (they don't affect each other)\n", + " for box in range(3):\n", + " nums = list(range(1, 10))\n", + " rng.shuffle(nums)\n", + " for i in range(3):\n", + " for j in range(3):\n", + " board[box * 3 + i][box * 3 + j] = nums[i * 3 + j]\n", + "\n", + " # Solve the rest\n", + " _solve_sudoku(board)\n", + " return board\n", + "\n", + "@dataclass\n", + "class SudokuGame:\n", + " difficulty: int = 40 # Number of cells to remove (20 = easy, 40 = medium, 50 = hard)\n", + " seed: Optional[int] = None\n", + " _rng: random.Random = field(init = False, repr = False)\n", + " _board: List[List[int]] = field(init = False, repr = False)\n", + " _solution: List[List[int]] = field(init = False, repr = False)\n", + " _initial_board: List[List[int]] = field(init = False, repr = False)\n", + " _moves: int = field(default = 0, init = False, repr = False)\n", + " _state: str = field(default = \"ongoing\", init = False, repr = False)\n", + "\n", + " def __post_init__(self):\n", + " self._rng = random.Random(self.seed)\n", + "\n", + " # Generate complete board\n", + " complete_board = _generate_complete_board(self._rng)\n", + " self._solution = copy.deepcopy(complete_board)\n", + "\n", + " # Remove cells to create puzzle\n", + " self._board = copy.deepcopy(complete_board)\n", + " cells = [(r, c) for r in range(9) for c in range(9)]\n", + " self._rng.shuffle(cells)\n", + "\n", + " for r, c in cells[:self.difficulty]:\n", + " self._board[r][c] = 0\n", + "\n", + " self._initial_board = copy.deepcopy(self._board)\n", + " self._update_state()\n", + "\n", + " def board(self) -> List[List[int]]:\n", + " \"\"\"Return current board state.\"\"\"\n", + " return [row[:] for row in self._board]\n", + "\n", + " def initial_board(self) -> List[List[int]]:\n", + " \"\"\"Return initial puzzle state.\"\"\"\n", + " return [row[:] for row in self._initial_board]\n", + "\n", + " def state(self) -> str:\n", + " \"\"\"Return game state: 'ongoing', 'success', or 'failed'.\"\"\"\n", + " return self._state\n", + "\n", + " def moves(self) -> int:\n", + " \"\"\"Return number of moves made.\"\"\"\n", + " return self._moves\n", + "\n", + " def place_number(self, row: int, col: int, num: int) -> bool:\n", + " \"\"\"Place a number on the board. Returns True if valid move.\"\"\"\n", + " # Validate input\n", + " if not (0 <= row < 9 and 0 <= col < 9):\n", + " self._state = \"failed\"\n", + " return False\n", + "\n", + " if not (1 <= num <= 9):\n", + " self._state = \"failed\"\n", + " return False\n", + "\n", + " # Can't modify initial cells\n", + " if self._initial_board[row][col] != 0:\n", + " self._state = \"failed\"\n", + " return False\n", + " if self._board[row][col] != 0:\n", + " self._state = \"failed\"\n", + " return False\n", + " # Check if placement is valid\n", + " if not _is_valid_placement(self._board, row, col, num):\n", + " self._state = \"failed\"\n", + " return False\n", + "\n", + " # Place number\n", + " self._board[row][col] = num\n", + " self._moves += 1\n", + " self._update_state()\n", + " return True\n", + "\n", + " def _update_state(self) -> None:\n", + " \"\"\"Update game state based on current board.\"\"\"\n", + " # Check if puzzle is complete\n", + " if all(self._board[r][c] != 0 for r in range(9) for c in range(9)):\n", + " # Verify solution is correct\n", + " if self._board == self._solution:\n", + " self._state = \"success\"\n", + " else:\n", + " self._state = \"failed\"\n", + " else:\n", + " self._state = \"ongoing\"\n", + "\n", + " def pretty(self, colors: bool = True) -> str:\n", + " \"\"\"Pretty print the Sudoku board.\"\"\"\n", + " RESET = \"\\x1b[0m\"\n", + " INITIAL = \"\\x1b[38;5;45m\" # Cyan for initial numbers\n", + " PLACED = \"\\x1b[38;5;226m\" # Yellow for placed numbers\n", + " EMPTY = \"\\x1b[38;5;239m\" # Gray for empty cells\n", + "\n", + " lines = []\n", + " lines.append(\"┌───────┬───────┬───────┐\")\n", + "\n", + " for row in range(9):\n", + " row_str = \"│ \"\n", + " for col in range(9):\n", + " num = self._board[row][col]\n", + "\n", + " if colors:\n", + " if num == 0:\n", + " row_str += f\"{EMPTY}.{RESET}\"\n", + " elif self._initial_board[row][col] != 0:\n", + " row_str += f\"{INITIAL}{num}{RESET}\"\n", + " else:\n", + " row_str += f\"{PLACED}{num}{RESET}\"\n", + " else:\n", + " row_str += str(num) if num != 0 else \".\"\n", + "\n", + " if col % 3 == 2:\n", + " row_str += \" │ \"\n", + " else:\n", + " row_str += \" \"\n", + "\n", + " lines.append(row_str.rstrip())\n", + "\n", + " if row == 8:\n", + " lines.append(\"└───────┴───────┴───────┘\")\n", + " elif row % 3 == 2:\n", + " lines.append(\"├───────┼───────┼───────┤\")\n", + "\n", + " return \"\\n\".join(lines)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BBPHTCLYFivc" + }, + "source": [ + "Test the Sudoku environment:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-M8kGaFRJ2ic", + "outputId": "5da676f8-7495-47ea-a570-74457cccd13c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial puzzle:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "State: ongoing, Moves: 0\n" + ] + } + ], + "source": [ + "# Create an easy puzzle\n", + "game = SudokuGame(difficulty = 30, seed = 42)\n", + "print(\"Initial puzzle:\")\n", + "print(game.pretty())\n", + "print(f\"\\nState: {game.state()}, Moves: {game.moves()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zclUeNxosv4k", + "outputId": "113ab4e3-6c94-4f2d-e5bd-0ceb7736d71d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "SudokuGame(difficulty=30, seed=42)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "game" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "envzrXmjKRff" + }, + "source": [ + "Try making some moves:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b-gSgthFI_wq", + "outputId": "e6a98078-9a31-4cad-ab1c-3b067c538930" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "After placing 7 at (1,0):\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "State: ongoing, Moves: 1\n" + ] + } + ], + "source": [ + "# Make a valid move\n", + "game.place_number(0, 1, 7)\n", + "print(\"\\nAfter placing 7 at (1,0):\")\n", + "print(game.pretty())\n", + "print(f\"State: {game.state()}, Moves: {game.moves()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gGL1X29Fy4n5" + }, + "source": [ + "If we do some other action that's not part of the action space, we will get an error, and the game will not accept anymore actions." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VR6czU96cpxf" + }, + "source": [ + "# RL Environment Setup\n", + "\n", + "Execute strategies with time limits to prevent infinite loops." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tdgjnf-8z_kr" + }, + "outputs": [], + "source": [ + "from typing import Callable\n", + "from unsloth import execute_with_time_limit\n", + "\n", + "def _execute_strategy(strategy: Callable, game: SudokuGame):\n", + " \"\"\"Execute a strategy function on a Sudoku game.\"\"\"\n", + " assert callable(strategy)\n", + "\n", + " max_moves = 100\n", + " valid_moves = 0 # Track successful moves\n", + "\n", + " while game.state() == \"ongoing\" and valid_moves < max_moves:\n", + " try:\n", + " board = game.board()\n", + " initial = game.initial_board()\n", + " result = strategy(board, initial)\n", + "\n", + " # Validate result format\n", + " if not isinstance(result, (tuple, list)) or len(result) != 3:\n", + " # Invalid format = immediate fail, but return valid moves made\n", + " return valid_moves, \"failed\"\n", + "\n", + " row, col, num = result\n", + "\n", + " # Validate types\n", + " if not all(isinstance(x, int) for x in [row, col, num]):\n", + " return valid_moves, \"failed\"\n", + "\n", + " # Try to place number\n", + " success = game.place_number(row, col, num)\n", + "\n", + " if success:\n", + " valid_moves += 1 # Count this valid move\n", + " else:\n", + " # Invalid move = game fails, but return valid_moves made so far\n", + " return valid_moves, \"failed\"\n", + "\n", + " except Exception:\n", + " return valid_moves, \"failed\"\n", + "\n", + " if valid_moves >= max_moves and game.state() == \"ongoing\":\n", + " return valid_moves, \"failed\"\n", + "\n", + " return valid_moves, game.state()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dkuHVdB09sgf" + }, + "source": [ + "To allow longer strategies for Reinforcement Learning, we shall allow a 10 second timer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SK-LfzsA9wbW" + }, + "outputs": [], + "source": [ + "@execute_with_time_limit(10)\n", + "def execute_strategy(strategy: Callable, game: SudokuGame):\n", + " \"\"\"Execute strategy with 10 second time limit.\"\"\"\n", + " return _execute_strategy(strategy, game)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p7t7XMulLkpy" + }, + "source": [ + "Test with a simple strategy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VvwUzwSlLif2", + "outputId": "a6cdd742-2c78-4e68-c698-ee2810588f96" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moves: 1, State: failed\n" + ] + } + ], + "source": [ + "def simple_strategy(board, initial):\n", + " \"\"\"Simple strategy: fill first empty cell with 1.\"\"\"\n", + " for r in range(9):\n", + " for c in range(9):\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " return (r, c, 7)\n", + " return (0, 0, 7)\n", + "\n", + "game = SudokuGame(difficulty = 30, seed = 42)\n", + "try:\n", + " moves, state = execute_strategy(simple_strategy, game)\n", + " print(f\"Moves: {moves}, State: {state}\")\n", + "except TimeoutError as e:\n", + " print(f\"Timed out: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FWN9b9TAk89-", + "outputId": "760ff7f0-db9b-4d5f-b1a2-5542c7bd6843" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n" + ] + } + ], + "source": [ + "print(game.pretty())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tRhLV_bZMYxy" + }, + "source": [ + "# Code Execution\n", + "\n", + "To execute and create a new Python function, we first have to check if the function does not call other global variables or cheat. This is called `countering reward hacking` since we don't want the function to cheat.\n", + "\n", + "For example the below piece of code is fine, since it only imports Python level functions. We use `check_python_modules`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zz80kvg6M4BG", + "outputId": "60daace0-c1be-4038-ecd3-2620214e9193" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Safe Python code? True\n", + "{'stdlib': [], 'non_stdlib': [], 'relative_imports': 0}\n" + ] + } + ], + "source": [ + "from unsloth import check_python_modules, create_locked_down_function\n", + "\n", + "# Test safe code\n", + "sample = \"\"\"\n", + "def strategy(board, initial):\n", + " for r in range(9):\n", + " for c in range(9):\n", + " if board[r][c] == 0:\n", + " return (r, c, 1)\n", + " return (0, 0, 1)\n", + "\"\"\"\n", + "\n", + "ok, info = check_python_modules(sample)\n", + "print(\"Safe Python code?\", ok)\n", + "print(info)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bZzVWgKQ-VIg" + }, + "source": [ + "For the below piece of code, since we import `numpy`, we should not allow the execution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Z89Jw1KB-Ux7", + "outputId": "cde92f58-02b0-4622-9a6d-9306900c3d06" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Safe Python code? False\n", + "{'stdlib': [], 'non_stdlib': ['numpy'], 'relative_imports': 0}\n" + ] + } + ], + "source": [ + "sample = \"\"\"\n", + "def strategy(board, initial):\n", + " import numpy as np\n", + " return (0, 0, 1)\n", + "\"\"\"\n", + "\n", + "ok, info = check_python_modules(sample)\n", + "print(\"Safe Python code?\", ok)\n", + "print(info)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8CzwCyXIPK04" + }, + "source": [ + "# Data & RL task setup\n", + "\n", + "Create the prompt that instructs the model to generate a Sudoku solving strategy. You can customize this to some other task for another RL task." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "B-2RRE4HMrQO", + "outputId": "cb3a9a79-0bf3-47d7-e3a8-e44592ed1f1b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Create a Sudoku solving strategy using only native Python built-in functions without any import statements.\n", + "You are given two lists of lists (9x9 grids):\n", + "- board: current state (0 means empty)\n", + "- initial: starting puzzle (0 means was empty, numbers are fixed)\n", + "\n", + "Return a tuple (row, col, number) for the next move.\n", + "- row: 0-8 (row index)\n", + "- col: 0-8 (column index)\n", + "- number: 1-9 (digit to place)\n", + "\n", + "Only place numbers in cells that are BOTH empty in initial AND empty in board (initial[row][col] == 0 AND board[row][col] == 0)\n", + "Use Sudoku rules: no duplicates in rows, columns, or 3x3 boxes.\n", + "Output your function in backticks:\n", + "```python\n", + "def strategy(board, initial):\n", + " # Your logic here\n", + " return (row, col, number)\n", + "```\n", + "All helper functions must be inside def strategy. Output only the function.\n" + ] + } + ], + "source": [ + "prompt = \"\"\"\n", + "Create a Sudoku solving strategy using only native Python built-in functions without any import statements.\n", + "You are given two lists of lists (9x9 grids):\n", + "- board: current state (0 means empty)\n", + "- initial: starting puzzle (0 means was empty, numbers are fixed)\n", + "\n", + "Return a tuple (row, col, number) for the next move.\n", + "- row: 0-8 (row index)\n", + "- col: 0-8 (column index)\n", + "- number: 1-9 (digit to place)\n", + "\n", + "Only place numbers in cells that are BOTH empty in initial AND empty in board (initial[row][col] == 0 AND board[row][col] == 0)\n", + "Use Sudoku rules: no duplicates in rows, columns, or 3x3 boxes.\n", + "Output your function in backticks:\n", + "```python\n", + "def strategy(board, initial):\n", + " # Your logic here\n", + " return (row, col, number)\n", + "```\n", + "All helper functions must be inside def strategy. Output only the function.\n", + "\"\"\".strip()\n", + "\n", + "print(prompt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MIdudFUodN4i" + }, + "source": [ + "First, let's prompt the model without RL and see how it goes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9HJxrS76h3Ds", + "outputId": "056b4001-c877-4913-bd48-d8618146e7e0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n", + "BASE MODEL OUTPUT (before RL training):\n", + "==================================================\n", + "This is a complex request. Implementing a full, robust Sudoku solver strategy using *only* native Python built-in functions (no imports like `collections.Counter` or complex data structures beyond standard lists/dicts) requires implementing the core logic of constraint checking and candidate generation.\n", + "\n", + "Since the goal is to find *a* valid next move, we will use a simple backtracking/constraint propagation approach:\n", + "1. Identify all empty cells.\n", + "2. For each empty cell, determine the set of valid numbers (1-9) that can be placed there without violating Sudoku rules based on the current `board`.\n", + "3.\n" + ] + } + ], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "print(\"=\" * 50)\n", + "print(\"BASE MODEL OUTPUT (before RL training):\")\n", + "print(\"=\" * 50)\n", + "\n", + "inputs = tokenizer(\n", + " text = text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "text_streamer = TextStreamer(tokenizer, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iknaWZNudTNq" + }, + "source": [ + "# Reward functions\n", + "\n", + "We now design a `extract_function` function which simply extracts the function wrapped in 3 back ticks.\n", + "\n", + "And 3 reward functions:\n", + "\n", + "1. `function_works` which rewards the model if the strategy is a valid Python function.\n", + "2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it.\n", + "3. `strategy_succeeds` which checks if the game strategy actually succeeds in attaining Sudoku after running the auto-generated strategy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8JJGXKdJ-Zl_" + }, + "outputs": [], + "source": [ + "def extract_function(text):\n", + " \"\"\"Extract Python function from markdown code blocks.\"\"\"\n", + " if text.count(\"```\") >= 2:\n", + " first = text.find(\"```\") + 3\n", + " second = text.find(\"```\", first)\n", + " fx = text[first:second].strip()\n", + " fx = fx.removeprefix(\"python\\n\")\n", + " fx = fx[fx.find(\"def\"):]\n", + " if fx.startswith(\"def strategy(board, initial):\"):\n", + " return fx\n", + " return None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KLXEcf_HSJlI" + }, + "source": [ + "**Reward 1: Function Works**\n", + "\n", + "Checks if the generated code is valid Python and can be executed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "h3-B0IIsS56S" + }, + "outputs": [], + "source": [ + "def function_works(completions, **kwargs):\n", + " \"\"\"Reward for generating valid executable Python code.\"\"\"\n", + " scores = []\n", + " for completion in completions:\n", + " score = 0\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + "\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + "\n", + " if function is None or \"error\" in info:\n", + " score = -2.0 # Invalid function\n", + " else:\n", + " try:\n", + " new_strategy = create_locked_down_function(function)\n", + " score = 1.0 # Valid function\n", + " except:\n", + " score = -1.0 # Function has errors\n", + "\n", + " scores.append(score)\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SDyEfDGjM6_2" + }, + "source": [ + "**Reward 2: No Cheating**\n", + "\n", + "Penalizes functions that import external libraries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uGPkLhqjM-jK" + }, + "outputs": [], + "source": [ + "def no_cheating(completions, **kwargs):\n", + " \"\"\"Penalize use of external imports.\"\"\"\n", + " scores = []\n", + " for completion in completions:\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + "\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + " scores.append(1.0 if ok else -20.0) # Heavy penalty for cheating\n", + " else:\n", + " scores.append(-1.0) # Failed to create function\n", + "\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FRgHkfQ4M_d9" + }, + "source": [ + "**Reward 3: Strategy Succeeds**\n", + "\n", + "Rewards strategies that successfully solve Sudoku puzzles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sSM7ya5aNFGh" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "global PRINTER\n", + "PRINTER = 0\n", + "\n", + "def strategy_succeeds(completions, **kwargs):\n", + " \"\"\"Reward valid moves even if strategy eventually fails.\"\"\"\n", + " global PRINTER\n", + " scores = []\n", + "\n", + " seed = np.random.randint(10000)\n", + " difficulty = 40\n", + " for completion in completions:\n", + " printed = False\n", + " response = completion[0][\"content\"]\n", + " function = extract_function(response)\n", + "\n", + " if PRINTER % 5 == 0:\n", + " printed = True\n", + " print(\"\\n\" + \"=\" * 60)\n", + " print(function)\n", + " print(\"=\" * 60)\n", + " PRINTER += 1\n", + "\n", + " if function is not None:\n", + " ok, info = check_python_modules(function)\n", + "\n", + " if function is None or \"error\" in info:\n", + " scores.append(0)\n", + " continue\n", + "\n", + " try:\n", + " new_strategy = create_locked_down_function(function)\n", + " except:\n", + " scores.append(0)\n", + " continue\n", + "\n", + " try:\n", + " game = SudokuGame(difficulty = difficulty, seed = seed)\n", + " valid_moves, game_state = execute_strategy(new_strategy, game)\n", + " if valid_moves == difficulty:\n", + " game_state = \"success\"\n", + "\n", + " print(f\"\\n Valid moves: {valid_moves}, Final state: {game_state}\")\n", + "\n", + " if not printed:\n", + " print(\"Strategy:\")\n", + " print(function[:200] + \"...\" if len(function) > 200 else function)\n", + "\n", + " print(\"\\nFinal board:\")\n", + " print(game.pretty())\n", + "\n", + " if game_state == \"success\":\n", + " scores.append(30.0) # Solved the puzzle!\n", + " elif valid_moves > 0:\n", + " # Reward based on valid moves made before failure\n", + " # Each valid move is worth 0.2 points\n", + " reward = valid_moves * 0.2\n", + " scores.append(reward)\n", + " else:\n", + " scores.append(-2.0) # Failed immediately with no valid moves\n", + "\n", + " except TimeoutError:\n", + " print(\"Timeout\")\n", + " scores.append(-1.0)\n", + " except Exception as e:\n", + " print(f\"Exception: {str(e)[:100]}\")\n", + " scores.append(-3.0)\n", + "\n", + " return scores" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCpSxtvSeAG_" + }, + "source": [ + "# Dataset Preparation\n", + "\n", + "Create the training dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ldf6SjLHVPRv", + "outputId": "e6c0afa5-e90c-43e6-e1ff-2ca353360854" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Maximum prompt length: 830\n", + "\n", + "Dataset sample:\n", + "{'prompt': [{'content': 'Create a Sudoku solving strategy using only native Python built-in functions without any import statements.\\nYou are given two lists of lists (9x9 grids):\\n- board: current state (0 means empty)\\n- initial: starting puzzle (0 means was empty, numbers are fixed)\\n\\nReturn a tuple (row, col, number) for the next move.\\n- row: 0-8 (row index)\\n- col: 0-8 (column index)\\n- number: 1-9 (digit to place)\\n\\nOnly place numbers in cells that are BOTH empty in initial AND empty in board (initial[row][col] == 0 AND board[row][col] == 0)\\nUse Sudoku rules: no duplicates in rows, columns, or 3x3 boxes.\\nOutput your function in backticks:\\n```python\\ndef strategy(board, initial):\\n # Your logic here\\n return (row, col, number)\\n```\\nAll helper functions must be inside def strategy. Output only the function.', 'role': 'user'}], 'answer': 0}\n" + ] + } + ], + "source": [ + "from datasets import Dataset\n", + "\n", + "dataset = Dataset.from_list([\n", + " {\n", + " \"prompt\": [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " \"answer\": 0,\n", + " }\n", + "] * 1000)\n", + "\n", + "maximum_length = len(tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " add_generation_prompt = True\n", + "))\n", + "\n", + "print(f\"Maximum prompt length: {maximum_length}\")\n", + "print(\"\\nDataset sample:\")\n", + "print(dataset[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9-IOMhVg-2AM" + }, + "source": [ + "\n", + "### Train the model\n", + "\n", + "Now set up GRPO Trainer and all configurations! We also support GSPO, GAPO, Dr GRPO and more! Go the Unsloth [Reinforcement Learning Docs](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) for more options." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ptqkXK2D4d6p", + "outputId": "7ffb2e77-3bb3-4af1-db5c-446e63fb0351" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + } + ], + "source": [ + "# Leave room for the prompt (plus 1 token safety margin)\n", + "max_completion_length = max_seq_length - (maximum_length + 1)\n", + "\n", + "from trl import GRPOConfig, GRPOTrainer\n", + "training_args = GRPOConfig(\n", + " temperature = 1.0,\n", + " learning_rate = 5e-5,\n", + " weight_decay = 0.001,\n", + " warmup_ratio = 0.1,\n", + " lr_scheduler_type = \"linear\",\n", + " optim = \"adamw_8bit\",\n", + " logging_steps = 1,\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 2, # Increase to 4 for smoother training\n", + " num_generations = 2, # Decrease if out of memory\n", + " max_completion_length = max_completion_length,\n", + " # num_train_epochs = 1, # Set to 1 for a full training run\n", + " max_steps = 60,\n", + " save_steps = 100,\n", + " report_to = \"none\", # Can use Weights & Biases, TrackIO\n", + " output_dir = \"outputs\",\n", + " epsilon = 0.2,\n", + " epsilon_high = 0.28, # one sided\n", + " delta = 1.5, # two sided\n", + " loss_type = 'bnpo',\n", + " mask_truncated_completions = True\n", + " # For optional training + evaluation\n", + " # fp16_full_eval = True,\n", + " # per_device_eval_batch_size = 4,\n", + " # eval_accumulation_steps = 1,\n", + " # eval_strategy = \"steps\",\n", + " # eval_steps = 1,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r9Mv8UZO5hz-" + }, + "source": [ + "And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase!\n", + "\n", + "You might have to wait 150 to 200 steps for any action. You'll probably get low reward for the first 100 steps. Please be patient!\n", + "\n", + "| Step | Training Loss | reward | reward_std | completion_length | kl |\n", + "|------|---------------|-----------|------------|-------------------|----------|\n", + "| 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 |\n", + "| 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 |\n", + "| 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vzOuSVCL_GA9" + }, + "outputs": [], + "source": [ + "# For optional training + evaluation\n", + "# new_dataset = dataset.train_test_split(test_size = 0.01)\n", + "\n", + "trainer = GRPOTrainer(\n", + " model = model,\n", + " processing_class = tokenizer,\n", + " reward_funcs = [\n", + " function_works,\n", + " no_cheating,\n", + " strategy_succeeds,\n", + " ],\n", + " args = training_args,\n", + " train_dataset = dataset,\n", + "\n", + " # For optional training + evaluation\n", + " # train_dataset = new_dataset[\"train\"],\n", + " # eval_dataset = new_dataset[\"test\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fQhtuwP4cf34" + }, + "source": [ + "And let's train the model!\n", + "\n", + "**NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "VGRxPdSCcfC3", + "outputId": "c90a4a3d-faa2-4785-d922-69e1d2fc9072" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 1,000 | Num Epochs = 1 | Total steps = 100\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 2\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 2 x 1) = 2\n", + " \"-____-\" Trainable parameters = 59,719,680 of 5,164,017,184 (1.16% trained)\n", + "Passing `generation_config` together with generation-related arguments=({'pad_token_id'}) is deprecated and will be removed in future versions. Please pass either a `generation_config` object OR all generation parameters explicitly, but not both.\n", + "Caching is incompatible with gradient checkpointing in Gemma4TextDecoderLayer. Setting `past_key_values=None`.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " def get_candidates(r, c):\n", + " if board[r][c] != 0:\n", + " return set()\n", + "\n", + " used = set()\n", + "\n", + " # Check row\n", + " for col in range(9):\n", + " if board[r][col] != 0:\n", + " used.add(board[r][col])\n", + "\n", + " # Check column\n", + " for row in range(9):\n", + " if board[row][c] != 0:\n", + " used.add(board[row][c])\n", + "\n", + " # Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " current_r = start_row + i\n", + " current_c = start_col + j\n", + " if board[current_r][current_c] != 0:\n", + " used.add(board[current_r][current_c])\n", + "\n", + " all_digits = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", + " return all_digits - used\n", + "\n", + " # 1. Find all empty cells where a move can potentially be made\n", + " empty_cells = []\n", + " for r in range(9):\n", + " for c in range(9):\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " empty_cells.append((r, c))\n", + "\n", + " # 2. Iterate through empty cells and check for 'Naked Singles'\n", + " for r, c in empty_cells:\n", + " candidates = get_candidates(r, c)\n", + " \n", + " # If only one candidate exists, this is our move\n", + " if len(candidates) == 1:\n", + " number = list(candidates)[0]\n", + " return (r, c, number)\n", + "\n", + " # If no immediate naked single is found, return None (or an arbitrary valid empty cell if required, \n", + " # but the prompt implies returning a move if possible based on the strategy).\n", + " # For this constrained problem, if no single is found, we return None, though the prompt structure \n", + " # implies a move will be returned if the input is solvable by this simple strategy.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 40, Final state: success\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + "\n", + " # Che...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [ 60/60 ]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Lossrewardreward_stdcompletions / mean_lengthcompletions / min_lengthcompletions / max_lengthcompletions / clipped_ratiocompletions / mean_terminated_lengthcompletions / min_terminated_lengthcompletions / max_terminated_lengthklrewards / function_works / meanrewards / function_works / stdrewards / no_cheating / meanrewards / no_cheating / stdrewards / strategy_succeeds / meanrewards / strategy_succeeds / std
10.00000020.60000016.122034501.000000368.000000634.0000000.000000501.000000368.000000634.0000000.0000061.0000000.0000001.0000000.00000018.60000016.122034
20.0000008.8000000.000000392.000000380.000000404.0000000.000000392.000000380.000000404.0000000.0000041.0000000.0000001.0000000.0000006.8000000.000000
30.0000008.4000000.000000338.500000329.000000348.0000000.000000338.500000329.000000348.0000000.0000421.0000000.0000001.0000000.0000006.4000000.000000
40.0000008.0000000.000000369.500000360.000000379.0000000.000000369.500000360.000000379.0000000.0003711.0000000.0000001.0000000.0000006.0000000.000000
50.0000015.8000003.676955470.000000429.000000511.0000000.000000470.000000429.000000511.0000000.0014491.0000000.0000001.0000000.0000003.8000003.676955
60.00000220.40000016.404879576.500000415.000000738.0000000.000000576.500000415.000000738.0000000.0022731.0000000.0000001.0000000.00000018.40000016.404877
70.0000317.5000001.555635404.500000349.000000460.0000000.000000404.500000349.000000460.0000000.0308221.0000000.0000001.0000000.0000005.5000001.555635
80.00000720.60000016.122034906.000000811.0000001001.0000000.000000906.000000811.0000001001.0000000.0070961.0000000.0000001.0000000.00000018.60000016.122034
90.0000058.9000000.424264737.500000634.000000841.0000000.000000737.500000634.000000841.0000000.0063611.0000000.0000001.0000000.0000006.9000000.424264
100.0000158.7000010.141421649.500000631.000000668.0000000.000000649.500000631.000000668.0000000.0120281.0000000.0000001.0000000.0000006.7000000.141422
110.00000932.0000000.000000692.000000650.000000734.0000000.000000692.000000650.000000734.0000000.0088931.0000000.0000001.0000000.00000030.0000000.000000
120.0000156.5000003.818376543.000000481.000000605.0000000.000000543.000000481.000000605.0000000.0148791.0000000.0000001.0000000.0000004.5000003.818377
130.00002232.0000000.000000514.000000494.000000534.0000000.000000514.000000494.000000534.0000000.0215011.0000000.0000001.0000000.00000030.0000000.000000
140.00002232.0000000.000000679.500000615.000000744.0000000.000000679.500000615.000000744.0000000.0215871.0000000.0000001.0000000.00000030.0000000.000000
150.0000146.0000002.828427723.500000612.000000835.0000000.000000723.500000612.000000835.0000000.0144671.0000000.0000001.0000000.0000004.0000002.828427
160.00004320.00000016.970562575.500000500.000000651.0000000.000000575.500000500.000000651.0000000.0426461.0000000.0000001.0000000.00000018.00000016.970562
170.00002320.60000016.122034815.000000779.000000851.0000000.000000815.000000779.000000851.0000000.0226291.0000000.0000001.0000000.00000018.60000016.122034
180.00001420.60000016.122034702.000000528.000000876.0000000.000000702.000000528.000000876.0000000.0136691.0000000.0000001.0000000.00000018.60000016.122034
190.0000318.6000000.000000534.000000530.000000538.0000000.000000534.000000530.000000538.0000000.0308641.0000000.0000001.0000000.0000006.6000000.000000
200.0000209.4000000.282843600.500000481.000000720.0000000.000000600.500000481.000000720.0000000.0217241.0000000.0000001.0000000.0000007.4000000.282843
210.00002520.10000016.829140571.500000564.000000579.0000000.000000571.500000564.000000579.0000000.0245441.0000000.0000001.0000000.00000018.10000016.829142
220.00002232.0000000.000000772.000000674.000000870.0000000.000000772.000000674.000000870.0000000.0224141.0000000.0000001.0000000.00000030.0000000.000000
230.0000378.0000000.000000534.000000512.000000556.0000000.000000534.000000512.000000556.0000000.0369321.0000000.0000001.0000000.0000006.0000000.000000
240.0000208.2000000.000000539.000000492.000000586.0000000.000000539.000000492.000000586.0000000.0201431.0000000.0000001.0000000.0000006.2000000.000000
250.0000438.0000000.565685703.000000512.000000894.0000000.000000703.000000512.000000894.0000000.0429911.0000000.0000001.0000000.0000006.0000000.565686
260.0000398.4000000.000000509.000000493.000000525.0000000.000000509.000000493.000000525.0000000.0394601.0000000.0000001.0000000.0000006.4000000.000000
270.00004720.40000016.404879735.000000490.000000980.0000000.000000735.000000490.000000980.0000000.0471551.0000000.0000001.0000000.00000018.40000016.404877
280.0000398.0000000.000000504.000000489.000000519.0000000.000000504.000000489.000000519.0000000.0390001.0000000.0000001.0000000.0000006.0000000.000000
290.0000568.4000000.000000540.000000519.000000561.0000000.000000540.000000519.000000561.0000000.0561591.0000000.0000001.0000000.0000006.4000000.000000
300.0000468.4000000.000000534.000000524.000000544.0000000.000000534.000000524.000000544.0000000.0460861.0000000.0000001.0000000.0000006.4000000.000000
310.0000478.8000000.000000489.500000480.000000499.0000000.000000489.500000480.000000499.0000000.0465801.0000000.0000001.0000000.0000006.8000000.000000
320.0000408.2000000.000000525.500000476.000000575.0000000.000000525.500000476.000000575.0000000.0404871.0000000.0000001.0000000.0000006.2000000.000000
330.0000378.4000000.000000482.500000450.000000515.0000000.000000482.500000450.000000515.0000000.0368421.0000000.0000001.0000000.0000006.4000000.000000
340.0000588.8000000.000000516.500000512.000000521.0000000.000000516.500000512.000000521.0000000.0577501.0000000.0000001.0000000.0000006.8000000.000000
350.0000378.8000000.000000525.000000514.000000536.0000000.000000525.000000514.000000536.0000000.0374511.0000000.0000001.0000000.0000006.8000000.000000
360.0000654.1000005.798275874.000000681.0000001067.0000000.000000874.000000681.0000001067.0000000.0649731.0000000.0000001.0000000.0000002.1000005.798275
370.0000388.2000000.000000498.500000498.000000499.0000000.000000498.500000498.000000499.0000000.0382141.0000000.0000001.0000000.0000006.2000000.000000
380.0000598.4000000.000000480.000000480.000000480.0000000.000000480.000000480.000000480.0000000.0586451.0000000.0000001.0000000.0000006.4000000.000000
390.0000378.4000000.000000465.500000454.000000477.0000000.000000465.500000454.000000477.0000000.0368111.0000000.0000001.0000000.0000006.4000000.000000
400.0000768.4000000.000000523.500000501.000000546.0000000.000000523.500000501.000000546.0000000.0761751.0000000.0000001.0000000.0000006.4000000.000000
410.0000558.4000000.000000483.500000466.000000501.0000000.000000483.500000466.000000501.0000000.0553551.0000000.0000001.0000000.0000006.4000000.000000
420.00008920.60000016.122034717.000000534.000000900.0000000.000000717.000000534.000000900.0000000.0887321.0000000.0000001.0000000.00000018.60000016.122034
430.0000698.4000000.000000493.000000475.000000511.0000000.000000493.000000475.000000511.0000000.0693491.0000000.0000001.0000000.0000006.4000000.000000
440.0000788.0000000.000000530.500000480.000000581.0000000.000000530.500000480.000000581.0000000.0780021.0000000.0000001.0000000.0000006.0000000.000000
450.0000847.8000000.000000538.000000508.000000568.0000000.000000538.000000508.000000568.0000000.0837141.0000000.0000001.0000000.0000005.8000000.000000
460.0000758.6000000.000000519.500000505.000000534.0000000.000000519.500000505.000000534.0000000.0749361.0000000.0000001.0000000.0000006.6000000.000000
470.0000839.2000000.000000517.000000502.000000532.0000000.000000517.000000502.000000532.0000000.0827791.0000000.0000001.0000000.0000007.2000000.000000
480.0000788.4000000.000000458.000000453.000000463.0000000.000000458.000000453.000000463.0000000.0775231.0000000.0000001.0000000.0000006.4000000.000000
490.0000738.6000000.000000518.500000513.000000524.0000000.000000518.500000513.000000524.0000000.0725321.0000000.0000001.0000000.0000006.6000000.000000
500.0000749.6000000.000000525.500000509.000000542.0000000.000000525.500000509.000000542.0000000.0743911.0000000.0000001.0000000.0000007.6000000.000000
510.0000958.2000000.000000492.000000479.000000505.0000000.000000492.000000479.000000505.0000000.0951471.0000000.0000001.0000000.0000006.2000000.000000
520.0000788.2000000.000000618.000000477.000000759.0000000.000000618.000000477.000000759.0000000.0784011.0000000.0000001.0000000.0000006.2000000.000000
530.0000798.8000000.000000480.500000469.000000492.0000000.000000480.500000469.000000492.0000000.0788171.0000000.0000001.0000000.0000006.8000000.000000
540.0000829.2000000.000000721.500000680.000000763.0000000.000000721.500000680.000000763.0000000.0820421.0000000.0000001.0000000.0000007.2000000.000000
550.0000838.4000000.000000459.500000425.000000494.0000000.000000459.500000425.000000494.0000000.0830101.0000000.0000001.0000000.0000006.4000000.000000
560.0000638.2000000.000000572.000000474.000000670.0000000.000000572.000000474.000000670.0000000.0627901.0000000.0000001.0000000.0000006.2000000.000000
570.0000739.6000000.000000502.500000469.000000536.0000000.000000502.500000469.000000536.0000000.0725581.0000000.0000001.0000000.0000007.6000000.000000
580.0000728.2000000.000000655.000000538.000000772.0000000.000000655.000000538.000000772.0000000.0724101.0000000.0000001.0000000.0000006.2000000.000000
590.0000898.8000000.000000454.000000435.000000473.0000000.000000454.000000435.000000473.0000000.0889811.0000000.0000001.0000000.0000006.8000000.000000
600.0000954.3000006.081119641.000000542.000000740.0000000.000000641.000000542.000000740.0000000.0949311.0000000.0000001.0000000.0000002.3000006.081119

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + "\n", + " # Che...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " rows = [0, 1, 2, 3, 4, 5, 6, 7, 8]\n", + " cols = [0, 1, 2, 3, 4, 5, 6, 7, 8]\n", + "\n", + " def is_safe(b, r, c, num):\n", + " # Check row\n", + " for j in range(9):\n", + " i...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for j in range(9):\n", + " if b[r][j] == num:\n", + " return False\n", + " \n", + " # Check column...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for j in range(9):\n", + " if b[r][j] == num:\n", + " return False\n", + " \n", + " # Check column\n", + " for i in range(9):\n", + " if b[i][c] == num:\n", + " return False\n", + " \n", + " # Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " if b[start_row + i][start_col + j] == num:\n", + " return False\n", + " \n", + " return True\n", + "\n", + " def find_next_move():\n", + " for r in range(9):\n", + " for c in range(9):\n", + " # Only consider placing numbers in cells that are empty in both initial and current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid(board, r, c, num):\n", + " return (r, c, num)\n", + " return None\n", + "\n", + " result = find_next_move()\n", + " if result:\n", + " return result\n", + " else:\n", + " # No immediate deterministic move found based on this simple strategy\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + " \n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + "\n", + " # Che...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 6, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if b[r][col] == num:\n", + " return False\n", + " \n", + " # Check co...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def get_possible_values(r, c):\n", + " if board[r][c] != 0:\n", + " return []\n", + "\n", + " used_values = set()\n", + "\n", + " # Check row\n", + " for col in range(9):\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " def get_possible_values(r, c):\n", + " if board[r][c] != 0:\n", + " return []\n", + "\n", + " used = set()\n", + "\n", + " # Check row\n", + " for col in range(9):\n", + " if board[r][col] != 0:\n", + " used.add(board[r][col])\n", + "\n", + " # Check column\n", + " for row in range(9):\n", + " if board[row][c] != 0:\n", + " used.add(board[row][c])\n", + "\n", + " # Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " current_row = start_row + i\n", + " current_col = start_col + j\n", + " if board[current_row][current_col] != 0:\n", + " used.add(board[current_row][current_col])\n", + "\n", + " possible = []\n", + " for num in range(1, 10):\n", + " if num not in used:\n", + " possible.append(num)\n", + " return possible\n", + "\n", + " # Find the first empty cell that is also empty in the initial board\n", + " for r in range(9):\n", + " for c in range(9):\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " possible_values = get_possible_values(r, c)\n", + " if possible_values:\n", + " # Return the first possible move found\n", + " return (r, c, possible_values[0])\n", + " \n", + " # If no move is found (puzzle might be full or unsolvable with this simple strategy)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the top-left coordinates (start_row, start_col) of the 3x3 box containing (r, c).\"\"\"\n", + " start_row = (r //...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 22, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_safe(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + "\n", + " # Chec...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_safe(b, r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and b[r][col] == num:\n", + " return False\n", + "\n", + " # Chec...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " rows = 9\n", + " cols = 9\n", + "\n", + " def get_box_indices(r, c):\n", + " \"\"\"Returns the starting row and column indices of the 3x3 box containing (r, c).\"\"\"\n", + " start_row = ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " R = 9\n", + " C = 9\n", + "\n", + " def get_box_indices(r, c):\n", + " \"\"\"Returns the top-left coordinates of the 3x3 box containing (r, c).\"\"\"\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " return start_row, start_col\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " \"\"\"Checks if placing 'num' at (r, c) is valid based on current board state.\"\"\"\n", + " \n", + " # Check row\n", + " for col in range(C):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + " \n", + " # Check column\n", + " for row in range(R):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + " \n", + " # Check 3x3 box\n", + " start_row, start_col = get_box_indices(r, c)\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + " \n", + " return True\n", + "\n", + " # 1. Identify candidate cells (where both board and initial are 0)\n", + " empty_cells = []\n", + " for r in range(R):\n", + " for c in range(C):\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " empty_cells.append((r, c))\n", + "\n", + " # 2. Iterate through empty cells and test numbers 1-9\n", + " for r, c in empty_cells:\n", + " possible_numbers = []\n", + " \n", + " # Determine which numbers (1-9) are possible for this cell (r, c)\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " possible_numbers.append(num)\n", + "\n", + " # 3. Check for Naked Single (only one possibility)\n", + " if len(possible_numbers) == 1:\n", + " number = possible_numbers[0]\n", + " return (r, c, number)\n", + "\n", + " # If no immediate single solution is found, return None or an arbitrary empty move\n", + " # Based on the prompt, we must return a tuple (row, col, number). \n", + " # If no move is found, we return an arbitrary valid empty cell and 0, \n", + " # though ideally, a real solver would backtrack or use more complex heuristics.\n", + " # For this constrained requirement, we return the first empty cell found with 0.\n", + " for r, c in empty_cells:\n", + " return (r, c, 0) \n", + " \n", + " # Should not be reached if empty_cells is not empty, but defensive return\n", + " return (-1, -1, 0)\n", + "============================================================\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " # Helper function to check if placing 'num' at (r, c) is valid\n", + " def is_safe(b, r, c, num):\n", + " # 1. Check row\n", + " for j in range(9):\n", + " if j != c ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of possible valid numbers for cell (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return set()\n", + "\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " # Helper function to check if placing 'num' at (r, c) is valid based on the current board state\n", + " def is_valid(r, c, num, current_board):\n", + " # Check row\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " R = 9\n", + " C = 9\n", + "\n", + " def is_safe(r, c, num, current_board):\n", + " # Check row\n", + " for col in range(C):\n", + " if col != c and current_board[r][col] == num:...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_numbers(r, c):\n", + " \"\"\"Determines which numbers (1-9) can legally be placed at board[r][c].\"\"\"\n", + " if board[r][c] != 0:\n", + " return []\n", + "\n", + " used_numbers = []\n", + "\n", + " # Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] != 0:\n", + " used_numbers.append(board[r][col])\n", + "\n", + " # Check Column\n", + " for row in range(N):\n", + " if row != r and board[row][c] != 0:\n", + " used_numbers.append(board[row][c])\n", + "\n", + " # Check 3x3 Box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] != 0:\n", + " used_numbers.append(board[curr_r][curr_c])\n", + "\n", + " # Find numbers from 1 to 9 that are not in used_numbers\n", + " possible = []\n", + " for num in range(1, 10):\n", + " is_used = False\n", + " for used in used_numbers:\n", + " if num == used:\n", + " is_used = True\n", + " break\n", + " if not is_used:\n", + " possible.append(num)\n", + " \n", + " return possible\n", + "\n", + " # Iterate through all cells to find a Naked Single candidate\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in the current board AND were empty initially\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " \n", + " possible = get_possible_numbers(r, c)\n", + " \n", + " # If exactly one number can be placed, we found our move\n", + " if len(possible) == 1:\n", + " number = possible[0]\n", + " return (r, c, number)\n", + "\n", + " # If no Naked Single move is found, return None (or an arbitrary value, \n", + " # but None is clearer for \"no immediate move found\")\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 40, Final state: success\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(9):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 9, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_numbers(r, c):\n", + " if board[r][c] != 0:\n", + " return []\n", + "\n", + " used_in_row = set()\n", + " for val in board[r]:\n", + " if...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + " \n", + " return True\n", + "\n", + " # Iterate through every cell to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_safe(r, c, num):\n", + " # Found the first valid move based on simple checking\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable by this simple check)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 40, Final state: success\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of numbers (1-9) that can legally be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 10, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Calculates the top-left coordinates of the 3x3 box containing (r, c).\"\"\"\n", + " start_row = (r // 3) * 3\n", + " star...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + " \n", + " # Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + " \n", + " # Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + " \n", + " return True\n", + "\n", + " # 1. Find all empty cells that need to be filled (board[r][c] == 0)\n", + " empty_cells = []\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " empty_cells.append((r, c))\n", + "\n", + " # 2. Iterate through empty cells and check for Naked Singles\n", + " for r, c in empty_cells:\n", + " possible_numbers = []\n", + " \n", + " # Determine which numbers (1-9) are possible for this cell (r, c)\n", + " for num in range(1, 10):\n", + " if is_safe(r, c, num):\n", + " possible_numbers.append(num)\n", + " \n", + " # If exactly one number is possible, we found a Naked Single\n", + " if len(possible_numbers) == 1:\n", + " return (r, c, possible_numbers[0])\n", + "\n", + " # If no immediate Naked Single is found, return None (or a default failure state)\n", + " # Since the prompt implies a move should be returned, if no single move is found, \n", + " # we return None, though in a real solver, backtracking or deeper heuristics would follow.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 40, Final state: success\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Calculates the set of valid candidates (1-9) for cell (r, c) based on current board state.\"\"\"\n", + " candidates = []\n", + "...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Determines possible candidates for cell (r, c) based on current board state.\"\"\"\n", + " if board[r][c] != 0:\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col_idx in range(N):\n", + " if col_idx != c and board[r][col_idx] == num:\n", + " r...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Determines the set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return set() # Already filled\n", + "\n", + " possible = set(range(1, 10))\n", + "\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] != 0 and board[r][col] in possible:\n", + " possible.discard(board[r][col])\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] != 0 and board[row][c] in possible:\n", + " possible.discard(board[row][c])\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r, curr_c = start_row + i, start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] != 0 and board[curr_r][curr_c] in possible:\n", + " possible.discard(board[curr_r][curr_c])\n", + "\n", + " return possible\n", + "\n", + " # 1. Find all candidate empty cells (where initial and board are 0)\n", + " candidate_cells = []\n", + " for r in range(N):\n", + " for c in range(N):\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " candidate_cells.append((r, c))\n", + "\n", + " if not candidate_cells:\n", + " return None # No moves possible\n", + "\n", + " best_score = 10 # Max possible options is 9\n", + " best_move = None\n", + "\n", + " # 2. Evaluate each candidate cell\n", + " for r, c in candidate_cells:\n", + " possible_values = get_possible_values(r, c)\n", + " num_options = len(possible_values)\n", + "\n", + " # We prioritize cells with fewer options (MRV heuristic)\n", + " if num_options < best_score:\n", + " best_score = num_options\n", + " best_move = (r, c, list(possible_values)[0]) # Pick the first available option\n", + "\n", + " # If we find a cell with 0 options, it means the current board state is invalid\n", + " # based on the initial constraints, but we still return the best found so far.\n", + " if best_score == 0:\n", + " break\n", + "\n", + " if best_move:\n", + " return best_move\n", + " else:\n", + " # This case should ideally not be reached if candidate_cells is not empty,\n", + " # but as a fallback, return None.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 40, Final state: success\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through every cell to find the first possible move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider placing a number if the cell is currently empty (0)\n", + " if board[r][c] == 0:\n", + " # Determine what numbers are allowed in this cell based on the initial puzzle constraints\n", + " # (Although the prompt implies we only place numbers in cells that are empty in BOTH,\n", + " # we must ensure we only test numbers 1-9)\n", + " \n", + " for num in range(1, 10):\n", + " # Check if placing 'num' at (r, c) is valid according to Sudoku rules\n", + " if is_safe(r, c, num):\n", + " # Found the first valid move\n", + " return (r, c, num)\n", + "\n", + " # If no move is found, return None (or handle as per specific requirements, \n", + " # but for this prompt, we assume a move is usually found or we return a default/failure state)\n", + " return (None, None, None)\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_valid_candidates(r, c):\n", + " \"\"\"Returns a set of numbers (1-9) that can legally be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through the board to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " # Try placing numbers 1 through 9\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable by this simple heuristic)\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 28, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # 1. Find the first empty cell (r, c) where both board and initial are 0\n", + " for r in range(N):\n", + " for c in range(N):\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " # Found an empty cell. Now find the smallest valid number.\n", + " for num in range(1, 10):\n", + " if is_safe(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or no empty cells matching criteria)\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " # Helper to check if a number 'num' is valid at (r, c) based on current 'board' state\n", + " def is_valid(r, c, num):\n", + " # 1. Check Row\n", + " for col i...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return Fa...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check Column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 Box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (the board is full or unsolvable from this state)\n", + " # We return None or an arbitrary marker if no move exists.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row constraint\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable based on this simple search), return None or similar indication.\n", + " # Since the prompt implies a move *will* be found if the board isn't complete, we return None if stuck.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check Column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 Box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (puzzle is full or unsolvable from this state)\n", + " # In a real solver, this would indicate failure or completion.\n", + " # For this specific function signature, we might return None or a default if no move exists.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return set()\n", + "\n", + " possible = set(range(1, 10))\n", + "\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] != 0 and board[r][col] in possible:\n", + " possible.discard(board[r][col])\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] != 0 and board[row][c] in possible:\n", + " possible.discard(board[row][c])\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] != 0 and board[curr_r][curr_c] in possible:\n", + " possible.discard(board[curr_r][curr_c])\n", + "\n", + " return possible\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Check placement condition: Must be empty in both board and initial\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " \n", + " possible_values = get_possible_values(r, c)\n", + " \n", + " if possible_values:\n", + " # Found a valid move. Return the first one found (smallest number first for determinism)\n", + " # Since we only need *a* next move, we can sort and take the first.\n", + " \n", + " # To ensure a deterministic output, we sort the possibilities.\n", + " sorted_values = sorted(list(possible_values))\n", + " \n", + " return (r, c, sorted_values[0])\n", + "\n", + " # If no moves are found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1) # Sentinel for no move found\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 0, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable by this strategy)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_row = (r // 3) * 3\n", + " start_col = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_row + i\n", + " curr_c = start_col + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Condition: Must be empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the starting (top-left) coordinates (box_r, box_c) for the 3x3 box containing (r, c).\"\"\"\n", + " box_r = (r //...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Check placement constraints: must be empty in both current board and initial\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " # Try placing numbers 1 through 9\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable by this simple heuristic)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 29, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 29, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Find all candidate empty cells (where initial and board are both 0)\n", + " candidates = []\n", + " for r in range(N):\n", + " for c in range(N):\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " candidates.append((r, c))\n", + "\n", + " # Iterate through candidates and find the first valid move\n", + " for r, c in candidates:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (the board is full or stuck), return None or handle as necessary.\n", + " # Based on the prompt, we assume a move should be returned if possible.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or stuck), return None or handle as appropriate.\n", + " # Since the prompt implies a move can be found if the state is solvable, \n", + " # we return None if nothing is found.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 36, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the starting (top-left) coordinates (r_start, c_start) of the 3x3 box containing (r, c).\"\"\"\n", + " r_start = ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return set()\n", + "\n", + " possible = set(range(1, 10))\n", + "\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] != 0 and board[r][col] in possible:\n", + " possible.discard(board[r][col])\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] != 0 and board[row][c] in possible:\n", + " possible.discard(board[row][c])\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] != 0 and board[curr_r][curr_c] in possible:\n", + " possible.discard(board[curr_r][curr_c])\n", + "\n", + " return possible\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers if the cell is empty in both board and initial\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " \n", + " possible_moves = get_possible_values(r, c)\n", + " \n", + " if possible_moves:\n", + " # Found a valid move. Return the first one found (smallest number first for determinism)\n", + " \n", + " # Since we cannot use sorted() easily without import, we iterate 1 to 9\n", + " for num in range(1, 10):\n", + " if num in possible_moves:\n", + " return (r, c, num)\n", + " \n", + " # If no move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for j in range(N):\n", + " if j != c and board[r][j] == num:\n", + " return F...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or stuck), return None or handle as required.\n", + " # Based on the prompt, we assume a move exists if the puzzle isn't solved.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 0, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of valid candidates for cell (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return set()\n", + "\n", + " c...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " # Try placing numbers 1 through 9\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable by this heuristic)\n", + " return (-1, -1, -1) # Indicate no immediate move found\n", + "============================================================\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 35, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the (start_r, start_c) of the 3x3 box containing (r, c).\"\"\"\n", + " start_r = (r // 3) * 3\n", + " start_c = (...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 35, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 28, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Check placement constraints:\n", + " # 1. Must be empty in the current board\n", + " # 2. Must be empty in the initial puzzle (fixed numbers cannot be overwritten)\n", + " if board[r][c] == 0 and initial[r][c] == 0:\n", + " # Try placing numbers 1 through 9\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or blocked), return None or handle as appropriate.\n", + " # Based on the prompt, we assume a move should be found if the puzzle isn't solved.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 28, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a list of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no valid move is found (puzzle is solved or stuck), return None or handle as appropriate.\n", + " # Based on the prompt, we assume a move *can* be found if the puzzle isn't solved.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 38, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_possible_values(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 31, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 35, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the starting (top-left) coordinates (start_r, start_c) of the 3x3 box containing (r, c).\"\"\"\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " return start_r, start_c\n", + "\n", + " # 1. Identify all potential empty cells\n", + " potential_moves = []\n", + " for r in range(N):\n", + " for c in range(N):\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " potential_moves.append((r, c))\n", + "\n", + " # 2. Iterate through potential moves and check validity for numbers 1 through 9\n", + " for r, c in potential_moves:\n", + " for num in range(1, 10):\n", + " is_valid = True\n", + "\n", + " # Check Row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " is_valid = False\n", + " break\n", + " if not is_valid:\n", + " continue\n", + "\n", + " # Check Column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " is_valid = False\n", + " break\n", + " if not is_valid:\n", + " continue\n", + "\n", + " # Check 3x3 Box\n", + " start_r, start_c = get_box_coords(r, c)\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " is_valid = False\n", + " break\n", + " if not is_valid:\n", + " break\n", + " \n", + " if is_valid:\n", + " # Found the first valid move\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is solved or blocked), return None or handle as per requirement.\n", + " # Since the prompt implies a move should be returned if possible, we return None if stuck.\n", + " return None\n", + "============================================================\n", + "\n", + " Valid moves: 35, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 37, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 37, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the starting (r_start, c_start) coordinates of the 3x3 box containing (r, c).\"\"\"\n", + " box_r_start = (r // 3) * 3\n", + " box_c_start = (c // 3) * 3\n", + " return box_r_start, box_c_start\n", + "\n", + " def is_safe(r, c, num):\n", + " \"\"\"Checks if placing 'num' at (r, c) is valid according to Sudoku rules.\"\"\"\n", + "\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " r_start, c_start = get_box_coords(r, c)\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = r_start + i\n", + " curr_c = c_start + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Constraint: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_safe(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " retur...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_box_coords(r, c):\n", + " \"\"\"Returns the starting (top-left) coordinates (box_r, box_c) for the 3x3 box containing (r, c).\"\"\"\n", + " box_r = (r // 3) * 3\n", + " box_c = (c // 3) * 3\n", + " return box_r, box_c\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " \"\"\"Checks if placing 'num' at (r, c) is valid according to Sudoku rules.\"\"\"\n", + "\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " box_r, box_c = get_box_coords(r, c)\n", + " for i in range(box_r, box_r + 3):\n", + " for j in range(box_c, box_c + 3):\n", + " if (i != r or j != c) and board[i][j] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Rule: Only place numbers in cells that are BOTH empty in initial AND empty in board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is full or unsolvable from this state)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Iterate through all cells to find the first valid move\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " return (r, c, num)\n", + "\n", + " # If no move is found (puzzle is solved or stuck for this strategy iteration)\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 30, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m7\u001b[0m │\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " retur...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 32, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_safe(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " retur...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + "============================================================\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " return False\n", + "\n", + " # 2. Check column\n", + " for row in range(N):\n", + " if row != r and board[row][c] == num:\n", + " return False\n", + "\n", + " # 3. Check 3x3 box\n", + " start_r = (r // 3) * 3\n", + " start_c = (c // 3) * 3\n", + " for i in range(3):\n", + " for j in range(3):\n", + " curr_r = start_r + i\n", + " curr_c = start_c + j\n", + " if (curr_r != r or curr_c != c) and board[curr_r][curr_c] == num:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " # Find all valid cells to try\n", + " possible_moves = []\n", + " for r in range(N):\n", + " for c in range(N):\n", + " # Only consider cells that are empty in both the initial puzzle and the current board\n", + " if initial[r][c] == 0 and board[r][c] == 0:\n", + " for num in range(1, 10):\n", + " if is_valid_placement(r, c, num):\n", + " possible_moves.append((r, c, num))\n", + " # Optimization: Since we only need *one* next move, we can break early\n", + " # after finding the first valid move for this specific (r, c)\n", + " break\n", + "\n", + " if possible_moves:\n", + " # Return the first valid move found (based on iteration order: row-major)\n", + " return possible_moves[0]\n", + " else:\n", + " # If no immediate move is found, return None or handle as appropriate.\n", + " # Based on the prompt, we must return (row, col, number). If no move exists,\n", + " # we return a sentinel value, though typically in a solver, this means the puzzle is stuck\n", + " # or needs backtracking. We will return (-1, -1, -1) to signify no move found.\n", + " return (-1, -1, -1)\n", + "============================================================\n", + "\n", + " Valid moves: 34, Final state: failed\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 33, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " retur...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 40, Final state: success\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " retur...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m6\u001b[0m │ \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;226m7\u001b[0m │\n", + "│ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │ \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m9\u001b[0m │\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m1\u001b[0m │\n", + "│ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;226m8\u001b[0m │\n", + "│ \u001b[38;5;45m5\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │\n", + "│ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m4\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 29, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def is_valid_placement(r, c, num):\n", + " # 1. Check row\n", + " for col in range(N):\n", + " if col != c and board[r][col] == num:\n", + " re...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n", + "\n", + " Valid moves: 29, Final state: failed\n", + "Strategy:\n", + "def strategy(board, initial):\n", + " N = 9\n", + "\n", + " def get_candidates(r, c):\n", + " \"\"\"Returns a set of valid numbers (1-9) that can be placed at (r, c).\"\"\"\n", + " if board[r][c] != 0:\n", + " return ...\n", + "\n", + "Final board:\n", + "┌───────┬───────┬───────┐\n", + "│ \u001b[38;5;226m3\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m7\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m5\u001b[0m │ \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m9\u001b[0m │\n", + "│ \u001b[38;5;226m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;45m3\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m7\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;226m5\u001b[0m │\n", + "│ \u001b[38;5;226m5\u001b[0m \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m7\u001b[0m │ \u001b[38;5;226m1\u001b[0m \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m2\u001b[0m \u001b[38;5;226m3\u001b[0m \u001b[38;5;226m5\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m4\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m1\u001b[0m │\n", + "│ \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;45m4\u001b[0m │ \u001b[38;5;45m1\u001b[0m \u001b[38;5;226m2\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;45m9\u001b[0m \u001b[38;5;45m8\u001b[0m \u001b[38;5;45m6\u001b[0m │\n", + "│ \u001b[38;5;45m8\u001b[0m \u001b[38;5;226m9\u001b[0m \u001b[38;5;45m1\u001b[0m │ \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m3\u001b[0m \u001b[38;5;45m6\u001b[0m │ \u001b[38;5;226m4\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;45m2\u001b[0m │\n", + "├───────┼───────┼───────┤\n", + "│ \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;239m.\u001b[0m │ \u001b[38;5;226m6\u001b[0m \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m3\u001b[0m │ \u001b[38;5;45m2\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │\n", + "│ \u001b[38;5;226m6\u001b[0m \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m2\u001b[0m │ \u001b[38;5;226m8\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;226m1\u001b[0m │ \u001b[38;5;45m5\u001b[0m \u001b[38;5;45m9\u001b[0m \u001b[38;5;226m4\u001b[0m │\n", + "│ \u001b[38;5;45m4\u001b[0m \u001b[38;5;45m1\u001b[0m \u001b[38;5;45m8\u001b[0m │ \u001b[38;5;239m.\u001b[0m \u001b[38;5;226m5\u001b[0m \u001b[38;5;45m9\u001b[0m │ \u001b[38;5;45m6\u001b[0m \u001b[38;5;45m7\u001b[0m \u001b[38;5;239m.\u001b[0m │\n", + "└───────┴───────┴───────┘\n" + ] + } + ], + "source": [ + "trainer.train()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mPCjD6Tdnqi8" + }, + "source": [ + "And now with the LoRA we just trained with GRPO - we first save the LoRA first!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "MPjc98y_nrTF" + }, + "outputs": [], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eC0MBN8AnvJb" + }, + "source": [ + "Verify LoRA is actually trained!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fFBpVx6SnytW" + }, + "outputs": [], + "source": [ + "from safetensors import safe_open\n", + "\n", + "tensors = {}\n", + "with safe_open(\"grpo_saved_lora/adapter_model.safetensors\", framework = \"pt\") as f:\n", + " # Verify both A and B are non zero\n", + " for key in f.keys():\n", + " tensor = f.get_tensor(key)\n", + " n_zeros = (tensor == 0).sum() / tensor.numel()\n", + " assert(n_zeros.item() != tensor.numel())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tlaUdxC_VHpz" + }, + "source": [ + "\n", + "# Inference\n", + "Now let's try the model we just trained!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8BZZHOKiF9Ct" + }, + "outputs": [], + "source": [ + "text = tokenizer.apply_chat_template(\n", + " [{\"role\": \"user\", \"content\": prompt.strip()}],\n", + " tokenize = False,\n", + " add_generation_prompt = True,\n", + ")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "_ = model.generate(\n", + " **tokenizer(images = None,text = text, return_tensors = \"pt\").to(\"cuda\"),\n", + " temperature = 1.0,\n", + " max_new_tokens = 512,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = False),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-NUEmHFSYNTp" + }, + "source": [ + "\n", + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NjXGTkp7YNtB" + }, + "outputs": [], + "source": [ + "# Merge to 16bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_16bit\", tokenizer, save_method = \"merged_16bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Merge to 4bit\n", + "if False: model.save_pretrained_merged(\"gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\",)\n", + "if False: model.push_to_hub_merged(\"HF_USERNAME/gemma_4_finetune_4bit\", tokenizer, save_method = \"merged_4bit\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Just LoRA adapters\n", + "if False:\n", + " model.save_pretrained(\"gemma_4_lora\")\n", + " tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "if False:\n", + " model.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")\n", + " tokenizer.push_to_hub(\"HF_USERNAME/gemma_4_lora\", token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_bBqsonjoD7Z" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF.\n", + "\n", + "Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)):\n", + "* `q8_0` - Fast conversion. High resource use, but generally acceptable.\n", + "* `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K.\n", + "* `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K.\n", + "\n", + "[**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "TV0C6l7SoGDr" + }, + "outputs": [], + "source": [ + "# Save to 8bit Q8_0\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer,)\n", + "# Remember to go to https://huggingface.co/settings/tokens for a token!\n", + "# And change hf to your username!\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to 16bit GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"f16\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"f16\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to q4_k_m GGUF\n", + "if False: model.save_pretrained_gguf(\"gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\")\n", + "if False: model.push_to_hub_gguf(\"HF_USERNAME/gemma_4_finetune\", tokenizer, quantization_method = \"q4_k_m\", token = \"YOUR_HF_TOKEN\")\n", + "\n", + "# Save to multiple GGUF options - much faster if you want multiple!\n", + "if False:\n", + " model.push_to_hub_gguf(\n", + " \"HF_USERNAME/gemma_4_finetune\", # Change hf to your username!\n", + " tokenizer,\n", + " quantization_method = [\"q4_k_m\", \"q8_0\", \"q5_k_m\",],\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tLtYuKEioJj9" + }, + "source": [ + "Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "022dbbd06beb434b8cde47f13d1d9f3b": { + "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 + } + }, + "0b4ac68cb5ea43f8a2c196c7f24bb349": { + "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": "" + } + }, + "0c11138badda42f1b3681626bcbe6ed0": { + "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 + } + }, + "0d90074b1b56432a8a8af05cadd57eea": { + "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_b44c516743f944559b21e963b6e559b9", + "IPY_MODEL_e5e07f71eee54e828dcb7b9dc5305b56", + "IPY_MODEL_ceca217e98384421934db2fd81c78b08" + ], + "layout": "IPY_MODEL_74783be6311840b58560b8ae249292c8" + } + }, + "0dd65ad33c184ebaa5ccaef977f34e83": { + "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 + } + }, + "101a1cf35bb24d79a6e8b4ce77eb5bf7": { + "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 + } + }, + "152d919539764660b1223a911e580fa3": { + "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 + } + }, + "157505960e3f4d04be6bdeae7119b4a8": { + "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": "" + } + }, + "1e6181166ca0420eb9dce94d9ca0eceb": { + "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_2161c02b9b984a47aa4539b5e3625ed5", + "IPY_MODEL_55e46a3096a4438d9663c3b5a0b75f34", + "IPY_MODEL_9825b277c4ca49a891c01739f2feaae0" + ], + "layout": "IPY_MODEL_284e45208cdd471ea6c361e5c9599481" + } + }, + "2161c02b9b984a47aa4539b5e3625ed5": { + "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_2ca2adf3b2924431aba041483ad76c0e", + "placeholder": "​", + "style": "IPY_MODEL_3e6969868d724975bb067c1f962cbec6", + "value": "chat_template.jinja: " + } + }, + "284e45208cdd471ea6c361e5c9599481": { + "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 + } + }, + "29394f0ef562422993d43a78c93eb1f1": { + "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": "" + } + }, + "2ca2adf3b2924431aba041483ad76c0e": { + "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 + } + }, + "2eb4215e9ef84c9b8ad121f0f6f531d0": { + "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_0dd65ad33c184ebaa5ccaef977f34e83", + "placeholder": "​", + "style": "IPY_MODEL_b34efc6222d3420e90c13f02b726e6b5", + "value": " 32.2M/32.2M [00:01<00:00, 160MB/s]" + } + }, + "2f67d427db03445ca24bc0f7a7a17cbd": { + "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 + } + }, + "31d9ffc210964cd5ab82dcf38cddbc5b": { + "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": "" + } + }, + "3d96500eae194cd3a6a9f92c39f8760e": { + "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 + } + }, + "3e6969868d724975bb067c1f962cbec6": { + "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": "" + } + }, + "4e026a1dbae64137a45f7c2b114b3178": { + "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 + } + }, + "535adc052cf742b08633c3e05a9eeb52": { + "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_101a1cf35bb24d79a6e8b4ce77eb5bf7", + "placeholder": "​", + "style": "IPY_MODEL_0b4ac68cb5ea43f8a2c196c7f24bb349", + "value": "model.safetensors: 100%" + } + }, + "55e46a3096a4438d9663c3b5a0b75f34": { + "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_915b8f0bc15a416c8e31f163838db6b4", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6421eac0ecd14d4e9a7debd117178381", + "value": 1 + } + }, + "5693cc3536314347856a708cceeda383": { + "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 + } + }, + "5c19e35c5f934891b5ce135843529a5b": { + "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_c5fa4165c9f44af8acb5a35d53269863", + "max": 10246621918, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ce301e618b3e4a7f9c081174974f7548", + "value": 10246621918 + } + }, + "5f3cc4d26ee742bcb19dbfc9598080ee": { + "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": "" + } + }, + "5fec6f60f4274b9e964c916197dd155e": { + "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": "" + } + }, + "6230a33eb2ad43cdbd8999a1dea7bd4c": { + "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_9539188d02584eb985835b4986935ced", + "placeholder": "​", + "style": "IPY_MODEL_ef49681d55954ce9876d0d1ce5d10fc9", + "value": "tokenizer.json: 100%" + } + }, + "6421eac0ecd14d4e9a7debd117178381": { + "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": "" + } + }, + "6761c9faa81040e1866b73ad40ca5e02": { + "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": "" + } + }, + "6c41947826904b1db57cc32055f0eccb": { + "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_c688bd93590c4270acb23f423ca85946", + "IPY_MODEL_fdf731aed6144145a41c873115a3af61", + "IPY_MODEL_a98e3900409d4bcebf9ddc25441bf56a" + ], + "layout": "IPY_MODEL_a6dc10a4fb0d474e819b3ecfa656b66a" + } + }, + "6dd46cd00a7c45c484187857a89c844f": { + "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_6230a33eb2ad43cdbd8999a1dea7bd4c", + "IPY_MODEL_9d12ca85c4cb4c6d83cc70f0f4f7c527", + "IPY_MODEL_2eb4215e9ef84c9b8ad121f0f6f531d0" + ], + "layout": "IPY_MODEL_5693cc3536314347856a708cceeda383" + } + }, + "6ea2009e3bd442fba3e001bed472b00e": { + "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_98536a63b3c94c018a16a9997bda38cf", + "placeholder": "​", + "style": "IPY_MODEL_ae3e1b9c33964a94a405952e9120fd0a", + "value": " 1.69k/? [00:00<00:00, 107kB/s]" + } + }, + "72a14d17820e446eb22e6261b97ce3e4": { + "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 + } + }, + "743aa5ba0a8c41019cd0cbdb97b779df": { + "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 + } + }, + "74783be6311840b58560b8ae249292c8": { + "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 + } + }, + "75f48d69379947af82ddb10ce4fca453": { + "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_e29039073cc7474cb0fe704cc7a668b7", + "placeholder": "​", + "style": "IPY_MODEL_5f3cc4d26ee742bcb19dbfc9598080ee", + "value": "processor_config.json: " + } + }, + "7f2f1d7c247f45bb93ff417cb186c2eb": { + "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_535adc052cf742b08633c3e05a9eeb52", + "IPY_MODEL_5c19e35c5f934891b5ce135843529a5b", + "IPY_MODEL_cc934485e87748579a7b2176f8470dd0" + ], + "layout": "IPY_MODEL_dfdfcf6e8b564262bd28ff6eb2558190" + } + }, + "8a12ba8d6b9744468b652d460ce10295": { + "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": "" + } + }, + "8bba15c72cdf4b9e995af58424d2021e": { + "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_f5f6ac53523743bbad0d09a8476c917c", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9805bc6b1149455ca9d6a09cf05992fe", + "value": 1 + } + }, + "913104b57a984d08af47073b60b2dc09": { + "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_e5c3875f5d7f43e1acb57da68a5810d6", + "IPY_MODEL_8bba15c72cdf4b9e995af58424d2021e", + "IPY_MODEL_a6b55e2f0fca456c9c9a2c8546e56595" + ], + "layout": "IPY_MODEL_a82f008a06a6408c8520831378f433ef" + } + }, + "915b8f0bc15a416c8e31f163838db6b4": { + "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": "20px" + } + }, + "9273d234d79247fabcb5a2ace2ec118b": { + "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_75f48d69379947af82ddb10ce4fca453", + "IPY_MODEL_e2c30cdce58440b8afb1665297661883", + "IPY_MODEL_6ea2009e3bd442fba3e001bed472b00e" + ], + "layout": "IPY_MODEL_4e026a1dbae64137a45f7c2b114b3178" + } + }, + "9539188d02584eb985835b4986935ced": { + "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 + } + }, + "9805bc6b1149455ca9d6a09cf05992fe": { + "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": "" + } + }, + "9825b277c4ca49a891c01739f2feaae0": { + "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_fb0e65319f7a400da1457acf2a7f4b38", + "placeholder": "​", + "style": "IPY_MODEL_ab9ee6b2f00a476a84b634404c573cba", + "value": " 16.3k/? [00:00<00:00, 922kB/s]" + } + }, + "98536a63b3c94c018a16a9997bda38cf": { + "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 + } + }, + "996e80a09e254708923e6e76e92c2554": { + "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": "20px" + } + }, + "9d12ca85c4cb4c6d83cc70f0f4f7c527": { + "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_e28e70aa5f834335ad7ea21450a25d32", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fdd2d273a3bb495e99ed707bc6783b5d", + "value": 32169626 + } + }, + "a0fab082e7364d3391d765cb785ed2db": { + "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": "" + } + }, + "a6b55e2f0fca456c9c9a2c8546e56595": { + "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_72a14d17820e446eb22e6261b97ce3e4", + "placeholder": "​", + "style": "IPY_MODEL_31d9ffc210964cd5ab82dcf38cddbc5b", + "value": " 19.4k/? [00:00<00:00, 1.76MB/s]" + } + }, + "a6dc10a4fb0d474e819b3ecfa656b66a": { + "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 + } + }, + "a82f008a06a6408c8520831378f433ef": { + "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 + } + }, + "a98e3900409d4bcebf9ddc25441bf56a": { + "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_f0820395ae644b50988896600368588b", + "placeholder": "​", + "style": "IPY_MODEL_8a12ba8d6b9744468b652d460ce10295", + "value": " 1951/1951 [00:44<00:00, 214.19it/s]" + } + }, + "ab9ee6b2f00a476a84b634404c573cba": { + "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": "" + } + }, + "ae3e1b9c33964a94a405952e9120fd0a": { + "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": "" + } + }, + "b34efc6222d3420e90c13f02b726e6b5": { + "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": "" + } + }, + "b44c516743f944559b21e963b6e559b9": { + "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_3d96500eae194cd3a6a9f92c39f8760e", + "placeholder": "​", + "style": "IPY_MODEL_6761c9faa81040e1866b73ad40ca5e02", + "value": "generation_config.json: 100%" + } + }, + "c5fa4165c9f44af8acb5a35d53269863": { + "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 + } + }, + "c688bd93590c4270acb23f423ca85946": { + "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_0c11138badda42f1b3681626bcbe6ed0", + "placeholder": "​", + "style": "IPY_MODEL_cb84d4ce92124f94b4d7897cd3ee7fd4", + "value": "Loading weights: 100%" + } + }, + "c9dfc15b3f89476189e4d2347f504e2e": { + "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": "" + } + }, + "cb84d4ce92124f94b4d7897cd3ee7fd4": { + "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": "" + } + }, + "cc934485e87748579a7b2176f8470dd0": { + "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_2f67d427db03445ca24bc0f7a7a17cbd", + "placeholder": "​", + "style": "IPY_MODEL_c9dfc15b3f89476189e4d2347f504e2e", + "value": " 10.2G/10.2G [03:17<00:00, 176MB/s]" + } + }, + "ce301e618b3e4a7f9c081174974f7548": { + "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": "" + } + }, + "ceca217e98384421934db2fd81c78b08": { + "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_ea70dad5f2aa48a2adab37c178f34baf", + "placeholder": "​", + "style": "IPY_MODEL_a0fab082e7364d3391d765cb785ed2db", + "value": " 208/208 [00:00<00:00, 22.2kB/s]" + } + }, + "d627022e756048e497691196783e374b": { + "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": "" + } + }, + "dfdfcf6e8b564262bd28ff6eb2558190": { + "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 + } + }, + "e28e70aa5f834335ad7ea21450a25d32": { + "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 + } + }, + "e29039073cc7474cb0fe704cc7a668b7": { + "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 + } + }, + "e2c30cdce58440b8afb1665297661883": { + "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_996e80a09e254708923e6e76e92c2554", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5fec6f60f4274b9e964c916197dd155e", + "value": 1 + } + }, + "e5c3875f5d7f43e1acb57da68a5810d6": { + "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_152d919539764660b1223a911e580fa3", + "placeholder": "​", + "style": "IPY_MODEL_29394f0ef562422993d43a78c93eb1f1", + "value": "tokenizer_config.json: " + } + }, + "e5e07f71eee54e828dcb7b9dc5305b56": { + "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_022dbbd06beb434b8cde47f13d1d9f3b", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_157505960e3f4d04be6bdeae7119b4a8", + "value": 208 + } + }, + "ea70dad5f2aa48a2adab37c178f34baf": { + "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 + } + }, + "ef49681d55954ce9876d0d1ce5d10fc9": { + "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": "" + } + }, + "f0820395ae644b50988896600368588b": { + "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 + } + }, + "f5f6ac53523743bbad0d09a8476c917c": { + "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": "20px" + } + }, + "fb0e65319f7a400da1457acf2a7f4b38": { + "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 + } + }, + "fdd2d273a3bb495e99ed707bc6783b5d": { + "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": "" + } + }, + "fdf731aed6144145a41c873115a3af61": { + "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_743aa5ba0a8c41019cd0cbdb97b779df", + "max": 1951, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d627022e756048e497691196783e374b", + "value": 1951 + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Audio.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Audio.ipynb new file mode 100644 index 0000000..6cf604b --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Audio.ipynb @@ -0,0 +1,5742 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "4RQuEItXqjUN" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a **free** Tesla T4 Google Colab instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "STd3-4v9qjUO" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5r82a21yqjUP" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2pK4zPKsqjUP" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "csoGx5FzqjUQ" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "hhrWHOOFqjUQ" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 380, + "referenced_widgets": [ + "f410af63026a45c99add96178f79d89f", + "53016ab2f4044590a70a539539943f0e", + "52e12698e0484947a5e653dd75eafc0d", + "5b837f4e901a4c65a785ea1aeda64d88", + "335e402420454301b91472c6d57e84b5", + "7c79674d29da4d109d08144b1b041aaf", + "c0a71411c1b5450b9251a77537c4b5f1", + "a3c2dacd2d304e9ca47ac75b78e16a2e", + "30f9fd3ac0e34bbe911c8fac4b1e088e", + "e9c8a5ce0e494c37ab92a83b7ff572ec", + "f4d821418b9346618b71b71ce3685691", + "9673ddb6186a481bad6e2f7dd5be0e38", + "3f4b5a7e87f74988b98e29b93245152b", + "d16a20ae3c7e4f64958e435a989010b7", + "ec254568f26e44e1b9b3e9f55591cb03", + "81aa18df41064d1191bd8b70168fc4c4", + "1959561121044bab931b0c508598d21b", + "a05deffd7ac045aa86f299d96937ff7e", + "20fb640986e24578b5e88203620fb234", + "1284d32779d044e78e12c204299a23d9", + "ad55ab8e488a4fae956acbacde8b949d", + "0796662db3e64a03b3bb63404d112058", + "73bcace4f1064ce79d527f08ce32e91d", + "7ca7f08acb594e3b9ec3b86d9ef64f04", + "12dc4d8f0bb248f4aa8d5b83a588a498", + "9af6ba7716214c70b314f4f20f992c2f", + "ac9af7fdb9504ea5a5cf61d6e7856880", + "8c0efbf9883d4c1c83f23b53c876d463", + "5082837d05184d30be04e233aacf10f0", + "52b5a37078e149fa86170c83a33f3cde", + "29255e9634df4d1ab06af95bdecee46e", + "4e562a778ee84f8e8e0bb2341510aafa", + "2acf420f9f95457f8b1c2fd99ca91399", + "c66064d73fcb4297bd184c0aad8c9992", + "070a79ac591a46e19d269baeea4fd6c5", + "1174f271c48649d288b8cd3f6ebe88c9", + "1a149c6b325c4e438b7eff7dfb4dd7b7", + "03680f63749843a99713a4d0d5a3841e", + "c011b819ad7043faac43f774e01e39d5", + "531b3795e2eb4690b4cc6a7c57254dbf", + "6dde1dd97f6a4c8eb74b4e6a541cf6e3", + "2100d97d1b024f0d94fbf17a8f7f8bd2", + "e5d0c6b85acd47a2b97d174f2cb05ac0", + "64c6e8b82a994d8c8d7bee2db8e11095", + "79e4f519ce354778993398adfcaf8c0c", + "23d003381f774921b0bbba989628a953", + "ee768e79196645789673399538027f84", + "ebcc3520e6b448669e86c216cf447e85", + "be3c7b112e6c4c709534d37d905f8ca3", + "8fd629aab65847f8bfc8784ba4967053", + "71f692d49a834179977f7e46312a2382", + "f655e41b3b76407f803a3a7cac886331", + "a7f74450f28c4d89a7fa48a3bdcad0b2", + "ab73bb5ad7534739992e830528452a1b", + "2e1fb2e8a2d34d249daee3f4be63397a", + "2678b1294fc44508bbc031e1f8ebaa84", + "13a8e8e55fb1420f98dcf2a391fe31e2", + "a9ab6a8075554c88a353fb779bf3f11b", + "206bda5a7946468099699003ce99f361", + "fb3a74b6f88f4b09862baee03cee8302", + "29d110ef78ef46609421da0495e6467d", + "04a6f124897543549ad5aed50e480ed5", + "ba292ae9569840d396d87aefee0d3d26", + "45a413a7b6a3442a86e7def1d6697ac1", + "698fba63eb244ed2bb2ee63f24ec6f65", + "93d823e74553487ab278af9eee38e9c4", + "d500f1a39c7f40f4b2c9d963f504d213", + "9b955d354b75489cac2226fd4be5064c", + "8a24aba3bcde472298685e72cfb3427a", + "50a608a731a44709ba28d32b7f159b7d", + "6dedecd63e4f47218bc5802f7cb07dc4", + "6ff2024770cf401ebc44106f343b8f30", + "7db57d9dc2df4744a28fc079f48b2d0e", + "8b97315532964a4c84fb78073d738e3c", + "ddb90a7a730b4463bdaf6c8da724f8b0", + "45a1e46160aa4b9895d8583a8fae9890", + "a10943fa524b420ba8ff854665119e43" + ] + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:16:21.155888Z", + "iopub.status.busy": "2025-07-20T12:16:21.155077Z", + "iopub.status.idle": "2025-07-20T12:17:36.514669Z", + "shell.execute_reply": "2025-07-20T12:17:36.513831Z", + "shell.execute_reply.started": "2025-07-20T12:16:21.155861Z" + }, + "id": "-Xbb0cuLzwgf", + "outputId": "73a29692-4e1d-4de7-e822-f49a5e5fa7f8", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/16.0G [00:00Let's Evaluate Gemma 4 Baseline Performance on German Transcription" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:46:26.982493Z", + "iopub.status.busy": "2025-07-20T12:46:26.982188Z", + "iopub.status.idle": "2025-07-20T12:46:28.166576Z", + "shell.execute_reply": "2025-07-20T12:46:28.165889Z", + "shell.execute_reply.started": "2025-07-20T12:46:26.982472Z" + }, + "id": "GHBGeJhYcorh", + "trusted": true, + "outputId": "11d0f8cc-50b4-40ae-b2b0-c2c0481d0e2b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 145, + "referenced_widgets": [ + "7ead793edcdc4542868bc35988087a41", + "9d9bc2085aa64e17a7cb03743fc13ce0", + "4dc9a224e9ed4fffb797c145520c2153", + "73018ba3aebd4a0a9c16150ecde428e7", + "0ab572241a14413381c618316769bea5", + "341d2ebe48d54ae58ef822a61a4ea55d", + "1c9ebc55fb584b5b89516e376ec00cfc", + "92db0e2905db4aa39552b7818b2282d3", + "6f730b26ae1447a9af2c7e3f8509f048", + "d26ca88568a94ef1beb9dd3102757a42", + "465de8b97846426cb7455bfbaaa66895", + "59102102d47c4d5b941afe38b1e327c5", + "ba1b1d94170b41ad82a5431e64854fd0", + "85c06e2df7cf426d888b2e885c9ff373", + "756f82f0ed2b4537ae922ac65de71e2c", + "6b92ebfc7af2452fb88700cd29549845", + "78b1fd5436694c7a883829a3373ba164", + "49285608dabb458bae5125ae9313a0b6", + "7d1762feec4a461284a762018372eef6", + "0504d2ea9d6b4c769b50be9e859c6b48", + "cc4fe7b5633d4932bb70b9ce0f46c169", + "e4717c8e5d234eba94fbc5e7c7369f65", + "7f2edc965f6d4418bfeaf01911425606", + "33f366b3b13d4a63b56ec57dd5f28836", + "2ee730d4eda94bbea4e0a4df58b7f84d", + "67f489c853be494b83456cca77bf2a0d", + "f8bf5e48834d418eb423737cf0a0c66d", + "7b63ed98dea64347bd8ffeb4e94c1e0c", + "c7b48c5df1e74383955e010b4f411854", + "aa7b6c960df84140b59c40a166279b23", + "215bf5b5eef844f9ad392e2b93db8da2", + "0cdf4bf1b09c481a95ab4c9351bf605c", + "d310fdb8b35d4173a1c2213118197d89", + "84d7352d2921443fa2b76d60bd2a51d1", + "5506b7e456b84c6890b12579d815e6ea", + "a68bd900917c4ec3bc7fced86a909643", + "4e4a231bbf20450fac8d6775cc6d1a1a", + "ca763ea2a041412280338cdf806dafc3", + "a8be70e3ed014df9bddd8f72dec5702e", + "97c34bf202644e82bed87aa2defa5ed7", + "92b1ae8f54b246b790ddd66493ddf7cc", + "5a90282515bf44aa88374f3a7f05df1e", + "904619a3cc624a25925cb66f6ab86564", + "8870940de0534e98b9189e7c168b80e1" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/540 [00:00" + ], + "text/html": [ + "\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 6 + } + ], + "source": [ + "from IPython.display import Audio, display\n", + "print(test_audio['text'])\n", + "Audio(test_audio['audio']['array'],rate = test_audio['audio']['sampling_rate'])" + ] + }, + { + "cell_type": "markdown", + "source": [ + "And the translation of the audio from German to English is:\n", + "\n", + "> I—I hold myself directly accountable. That much is, of course, clear: namely, that there are political interests involved in trade—in the exchange of goods—and that political influences are at play. The question is: that should not be the alternative." + ], + "metadata": { + "id": "3XGomsRxl5d_" + } + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:18:05.249062Z", + "iopub.status.busy": "2025-07-20T12:18:05.248355Z", + "iopub.status.idle": "2025-07-20T12:18:37.319606Z", + "shell.execute_reply": "2025-07-20T12:18:37.318802Z", + "shell.execute_reply.started": "2025-07-20T12:18:05.249040Z" + }, + "id": "BJr_D4O9Z2Zh", + "outputId": "ab2cb578-03a5-4322-ea56-c9caa785c5a8", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sie reden direkt mich an, und ist mir völlig klar, dass es politische Interessen gibt im Handel, im Austausch mit Waren, dass es politische Einflüsse gibt. Wie qual ist die Alternative soll es nicht sein?\n" + ] + } + ], + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": test_audio['audio']['array']},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " }\n", + "]\n", + "\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Yc0nI6Gzcori" + }, + "source": [ + "

Baseline Model Performance: 32.43% Word Error Rate (WER) for this sample !

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text and audio parts" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:46:48.481871Z", + "iopub.status.busy": "2025-07-20T12:46:48.481594Z", + "iopub.status.idle": "2025-07-20T12:46:55.013627Z", + "shell.execute_reply": "2025-07-20T12:46:55.012955Z", + "shell.execute_reply.started": "2025-07-20T12:46:48.481854Z" + }, + "id": "6bZsfBuZDeCL", + "trusted": true + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # False if not finetuning vision layers\n", + " finetune_language_layers = True, # False if not finetuning language layers\n", + " finetune_attention_modules = True, # False if not finetuning attention layers\n", + " finetune_mlp_modules = True, # False if not finetuning MLP layers\n", + "\n", + " r = 8, # The larger, the higher the accuracy, but might overfit\n", + " lora_alpha = 16, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + " use_rslora = False, # We support rank stabilized LoRA\n", + " loftq_config = None, # And LoftQ\n", + " target_modules = [\n", + " \"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", + " \"gate_proj\", \"up_proj\", \"down_proj\",\n", + "\n", + " # Audio layers\n", + " \"post\", \"linear_start\", \"linear_end\",\n", + " \"embedding_projection\",\n", + " \"ffw_layer_1\", \"ffw_layer_2\",\n", + " \"output_proj\",\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We adapt the `kadirnar/Emilia-DE-B000000` dataset for our German ASR task using Gemma 4 multi-modal chat format. Each audio-text pair is structured into a conversation with `system`, `user`, and `assistant` roles. The processor then converts this into the final training format:\n", + "\n", + "```\n", + "<|turn>system\n", + "You are an assistant that transcribes speech accurately.\n", + "<|turn>user\n", + "<|audio|>Please transcribe this audio.\n", + "<|turn>model\n", + "Ich, ich rechne direkt mich an." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:47:03.723745Z", + "iopub.status.busy": "2025-07-20T12:47:03.723405Z", + "iopub.status.idle": "2025-07-20T12:47:03.729197Z", + "shell.execute_reply": "2025-07-20T12:47:03.728434Z", + "shell.execute_reply.started": "2025-07-20T12:47:03.723714Z" + }, + "id": "o8caH7vlcorj", + "trusted": true + }, + "outputs": [], + "source": [ + "def format_intersection_data(samples: dict) -> dict[str, list]:\n", + " \"\"\"Format intersection dataset to match expected message format\"\"\"\n", + " formatted_samples = {\"messages\": []}\n", + " for idx in range(len(samples[\"audio\"])):\n", + " audio = samples[\"audio\"][idx][\"array\"]\n", + " label = str(samples[\"text\"][idx])\n", + "\n", + " message = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": audio},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\":[{\"type\": \"text\", \"text\": label}]\n", + " }\n", + " ]\n", + " formatted_samples[\"messages\"].append(message)\n", + " return formatted_samples" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:47:08.489955Z", + "iopub.status.busy": "2025-07-20T12:47:08.489357Z", + "iopub.status.idle": "2025-07-20T12:47:09.221727Z", + "shell.execute_reply": "2025-07-20T12:47:09.221018Z", + "shell.execute_reply.started": "2025-07-20T12:47:08.489932Z" + }, + "id": "k7CQ3jvDcorj", + "trusted": true, + "outputId": "8aa74b98-32ea-4f20-a084-c8bb5b2d63e4", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "75e57ae8d4f94b3d9702a24a85b75f6e", + "a452f87440d34e2285dee4941cf558e2", + "d6d64f507469463ba1d678e966b78c28", + "9269fd899b71476faeffe5ca24ff3c23", + "d574cfbfa9f94ef7b1c037bc7884b8b5", + "cc44984cc78442ba9b73df356ad6e6b3", + "45cfbdff1db94eed80cbd6cf4ae19b3d", + "68f32e20479e4d61bda9adff2532ba70", + "c264561cd45b41109bcf3cacab8aa387", + "63351416559f4bfdb6c21adceaee17e8", + "5efb687bf68b45ca91797d17fbf88be4" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map (num_proc=4): 0%| | 0/3000 [00:00\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2025-07-20T12:48:17.004874Z", + "iopub.status.busy": "2025-07-20T12:48:17.004079Z", + "iopub.status.idle": "2025-07-20T12:48:17.279559Z", + "shell.execute_reply": "2025-07-20T12:48:17.278695Z", + "shell.execute_reply.started": "2025-07-20T12:48:17.004848Z" + }, + "id": "95_Nn-89DhsL", + "trusted": true, + "outputId": "4ab7d37a-efa4-43ab-b22d-e05c5ae7447e", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "# Use UnslothVisionDataCollator which handles audio token alignment correctly\n", + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 8,\n", + " gradient_accumulation_steps = 1,\n", + " warmup_ratio = 0.03,\n", + " # num_train_epochs = 1, # Use for full training runs\n", + " max_steps = 60,\n", + " learning_rate = 5e-5,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\",\n", + " remove_unused_columns = False,\n", + "\n", + " # The below are a must for audio finetuning:\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 8192,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "trusted": true, + "outputId": "1b81b661-b347-4ef8-bfa2-0e9211d96124", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "9.518 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2025-07-20T12:48:20.209164Z", + "iopub.status.busy": "2025-07-20T12:48:20.208832Z", + "iopub.status.idle": "2025-07-20T13:42:42.607026Z", + "shell.execute_reply": "2025-07-20T13:42:42.606099Z", + "shell.execute_reply.started": "2025-07-20T12:48:20.209142Z" + }, + "id": "yqxqAZ7KJ4oL", + "outputId": "9e4aa7ed-a720-48e9-e35c-42f458023208", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 3,000 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 8 | Gradient accumulation steps = 1\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (8 x 1 x 1) = 8\n", + " \"-____-\" Trainable parameters = 23,934,976 of 8,020,091,424 (0.30% trained)\n", + "Caching is incompatible with gradient checkpointing in Gemma4TextDecoderLayer. Setting `past_key_values=None`.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 02:44, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
117.025774
216.762154
316.299833
416.981674
516.810152
616.151384
714.198338
813.161330
911.982812
1010.303127
119.856644
129.201151
138.912704
147.209361
156.705412
166.741477
176.189445
185.548326
194.765179
204.548351
214.192586
224.059164
234.241319
243.192038
253.979971
263.580244
273.562336
283.121466
293.284021
302.820877
312.781770
323.181130
333.296061
342.908674
353.456495
363.174899
372.976336
383.142226
392.514387
402.838711
413.000938
422.302069
433.237894
442.881329
453.214046
463.095760
472.509252
482.897425
492.668692
502.657610
512.777081
522.495918
532.955339
542.717725
553.013832
562.617149
572.862764
582.879027
593.030071
602.632949

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "trusted": true, + "outputId": "20983c94-9f93-4053-e1f2-271c51939b65", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "193.5248 seconds used for training.\n", + "3.23 minutes used for training.\n", + "Peak reserved memory = 11.139 GB.\n", + "Peak reserved memory for training = 1.621 GB.\n", + "Peak reserved memory % of max memory = 76.488 %.\n", + "Peak reserved memory for training % of max memory = 11.131 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2025-07-20T13:57:34.004664Z", + "iopub.status.busy": "2025-07-20T13:57:34.004306Z", + "iopub.status.idle": "2025-07-20T13:57:59.332316Z", + "shell.execute_reply": "2025-07-20T13:57:59.331671Z", + "shell.execute_reply.started": "2025-07-20T13:57:34.004639Z" + }, + "id": "kR3gIAX-SM2q", + "outputId": "ab8ef181-270a-42c5-ea08-25b9d092ca51", + "trusted": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sie reden direkt mich an, und ist mir völlig klar, dass äh es politische Interessen gibt im Handel, im Austausch mit Waren, dass es politische Einflüsse gibt. Wie qual ist die Alternative soll es nicht sein?\n" + ] + } + ], + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"You are an assistant that transcribes speech accurately.\",\n", + " }\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"audio\": test_audio['audio']['array']},\n", + " {\"type\": \"text\", \"text\": \"Please transcribe this audio.\"}\n", + " ]\n", + " }\n", + "]\n", + "\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "upcOlWe7A1vc", + "trusted": true, + "outputId": "049b82a5-2741-4f7b-824b-cd36a7b445e0", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "MKX_XKs_BNZR", + "trusted": true, + "outputId": "0df68115-9684-45ca-ef64-fb04f3db1ec7", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "I am Gemma 4, a Large Language Model developed by Google DeepMind. I am an open weights model.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, processor = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(processor, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "iHjt_SMYsd3P", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4\", processor)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "ZV-CiKPrIFG0", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", processor,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "FqfebeAdT073", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " processor,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "ZgcJIhJ0I_es", + "trusted": true + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " processor,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [], + "machine_shape": "hm" + }, + "kaggle": { + "accelerator": "nvidiaTeslaT4", + "dataSources": [], + "dockerImageVersionId": 31040, + "isGpuEnabled": true, + "isInternetEnabled": true, + "language": "python", + "sourceType": "notebook" + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "f410af63026a45c99add96178f79d89f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_53016ab2f4044590a70a539539943f0e", + "IPY_MODEL_52e12698e0484947a5e653dd75eafc0d", + "IPY_MODEL_5b837f4e901a4c65a785ea1aeda64d88" + ], + "layout": "IPY_MODEL_335e402420454301b91472c6d57e84b5" + } + }, + "53016ab2f4044590a70a539539943f0e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7c79674d29da4d109d08144b1b041aaf", + "placeholder": "​", + "style": "IPY_MODEL_c0a71411c1b5450b9251a77537c4b5f1", + "value": "model.safetensors: 100%" + } + }, + "52e12698e0484947a5e653dd75eafc0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_a3c2dacd2d304e9ca47ac75b78e16a2e", + "max": 15992595884, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_30f9fd3ac0e34bbe911c8fac4b1e088e", + "value": 15992595884 + } + }, + "5b837f4e901a4c65a785ea1aeda64d88": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e9c8a5ce0e494c37ab92a83b7ff572ec", + "placeholder": "​", + "style": "IPY_MODEL_f4d821418b9346618b71b71ce3685691", + "value": " 16.0G/16.0G [08:10<00:00, 82.8MB/s]" + } + }, + "335e402420454301b91472c6d57e84b5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7c79674d29da4d109d08144b1b041aaf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c0a71411c1b5450b9251a77537c4b5f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a3c2dacd2d304e9ca47ac75b78e16a2e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "30f9fd3ac0e34bbe911c8fac4b1e088e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e9c8a5ce0e494c37ab92a83b7ff572ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "f4d821418b9346618b71b71ce3685691": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9673ddb6186a481bad6e2f7dd5be0e38": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_3f4b5a7e87f74988b98e29b93245152b", + "IPY_MODEL_d16a20ae3c7e4f64958e435a989010b7", + "IPY_MODEL_ec254568f26e44e1b9b3e9f55591cb03" + ], + "layout": "IPY_MODEL_81aa18df41064d1191bd8b70168fc4c4" + } + }, + "3f4b5a7e87f74988b98e29b93245152b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1959561121044bab931b0c508598d21b", + "placeholder": "​", + "style": "IPY_MODEL_a05deffd7ac045aa86f299d96937ff7e", + "value": "Loading weights: 100%" + } + }, + "d16a20ae3c7e4f64958e435a989010b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_20fb640986e24578b5e88203620fb234", + "max": 2130, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1284d32779d044e78e12c204299a23d9", + "value": 2130 + } + }, + "ec254568f26e44e1b9b3e9f55591cb03": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ad55ab8e488a4fae956acbacde8b949d", + "placeholder": "​", + "style": "IPY_MODEL_0796662db3e64a03b3bb63404d112058", + "value": " 2130/2130 [01:08<00:00, 407.41it/s]" + } + }, + "81aa18df41064d1191bd8b70168fc4c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1959561121044bab931b0c508598d21b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a05deffd7ac045aa86f299d96937ff7e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "20fb640986e24578b5e88203620fb234": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1284d32779d044e78e12c204299a23d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ad55ab8e488a4fae956acbacde8b949d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0796662db3e64a03b3bb63404d112058": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "73bcace4f1064ce79d527f08ce32e91d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_7ca7f08acb594e3b9ec3b86d9ef64f04", + "IPY_MODEL_12dc4d8f0bb248f4aa8d5b83a588a498", + "IPY_MODEL_9af6ba7716214c70b314f4f20f992c2f" + ], + "layout": "IPY_MODEL_ac9af7fdb9504ea5a5cf61d6e7856880" + } + }, + "7ca7f08acb594e3b9ec3b86d9ef64f04": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8c0efbf9883d4c1c83f23b53c876d463", + "placeholder": "​", + "style": "IPY_MODEL_5082837d05184d30be04e233aacf10f0", + "value": "generation_config.json: 100%" + } + }, + "12dc4d8f0bb248f4aa8d5b83a588a498": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_52b5a37078e149fa86170c83a33f3cde", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_29255e9634df4d1ab06af95bdecee46e", + "value": 208 + } + }, + "9af6ba7716214c70b314f4f20f992c2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4e562a778ee84f8e8e0bb2341510aafa", + "placeholder": "​", + "style": "IPY_MODEL_2acf420f9f95457f8b1c2fd99ca91399", + "value": " 208/208 [00:00<00:00, 21.3kB/s]" + } + }, + "ac9af7fdb9504ea5a5cf61d6e7856880": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8c0efbf9883d4c1c83f23b53c876d463": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5082837d05184d30be04e233aacf10f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "52b5a37078e149fa86170c83a33f3cde": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "29255e9634df4d1ab06af95bdecee46e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4e562a778ee84f8e8e0bb2341510aafa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2acf420f9f95457f8b1c2fd99ca91399": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c66064d73fcb4297bd184c0aad8c9992": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_070a79ac591a46e19d269baeea4fd6c5", + "IPY_MODEL_1174f271c48649d288b8cd3f6ebe88c9", + "IPY_MODEL_1a149c6b325c4e438b7eff7dfb4dd7b7" + ], + "layout": "IPY_MODEL_03680f63749843a99713a4d0d5a3841e" + } + }, + "070a79ac591a46e19d269baeea4fd6c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_c011b819ad7043faac43f774e01e39d5", + "placeholder": "​", + "style": "IPY_MODEL_531b3795e2eb4690b4cc6a7c57254dbf", + "value": "processor_config.json: " + } + }, + "1174f271c48649d288b8cd3f6ebe88c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_6dde1dd97f6a4c8eb74b4e6a541cf6e3", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2100d97d1b024f0d94fbf17a8f7f8bd2", + "value": 1 + } + }, + "1a149c6b325c4e438b7eff7dfb4dd7b7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e5d0c6b85acd47a2b97d174f2cb05ac0", + "placeholder": "​", + "style": "IPY_MODEL_64c6e8b82a994d8c8d7bee2db8e11095", + "value": " 1.69k/? [00:00<00:00, 114kB/s]" + } + }, + "03680f63749843a99713a4d0d5a3841e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c011b819ad7043faac43f774e01e39d5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "531b3795e2eb4690b4cc6a7c57254dbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6dde1dd97f6a4c8eb74b4e6a541cf6e3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "2100d97d1b024f0d94fbf17a8f7f8bd2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e5d0c6b85acd47a2b97d174f2cb05ac0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "64c6e8b82a994d8c8d7bee2db8e11095": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "79e4f519ce354778993398adfcaf8c0c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_23d003381f774921b0bbba989628a953", + "IPY_MODEL_ee768e79196645789673399538027f84", + "IPY_MODEL_ebcc3520e6b448669e86c216cf447e85" + ], + "layout": "IPY_MODEL_be3c7b112e6c4c709534d37d905f8ca3" + } + }, + "23d003381f774921b0bbba989628a953": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8fd629aab65847f8bfc8784ba4967053", + "placeholder": "​", + "style": "IPY_MODEL_71f692d49a834179977f7e46312a2382", + "value": "chat_template.jinja: " + } + }, + "ee768e79196645789673399538027f84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_f655e41b3b76407f803a3a7cac886331", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a7f74450f28c4d89a7fa48a3bdcad0b2", + "value": 1 + } + }, + "ebcc3520e6b448669e86c216cf447e85": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ab73bb5ad7534739992e830528452a1b", + "placeholder": "​", + "style": "IPY_MODEL_2e1fb2e8a2d34d249daee3f4be63397a", + "value": " 11.9k/? [00:00<00:00, 1.08MB/s]" + } + }, + "be3c7b112e6c4c709534d37d905f8ca3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8fd629aab65847f8bfc8784ba4967053": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "71f692d49a834179977f7e46312a2382": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f655e41b3b76407f803a3a7cac886331": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "a7f74450f28c4d89a7fa48a3bdcad0b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ab73bb5ad7534739992e830528452a1b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2e1fb2e8a2d34d249daee3f4be63397a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2678b1294fc44508bbc031e1f8ebaa84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_13a8e8e55fb1420f98dcf2a391fe31e2", + "IPY_MODEL_a9ab6a8075554c88a353fb779bf3f11b", + "IPY_MODEL_206bda5a7946468099699003ce99f361" + ], + "layout": "IPY_MODEL_fb3a74b6f88f4b09862baee03cee8302" + } + }, + "13a8e8e55fb1420f98dcf2a391fe31e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_29d110ef78ef46609421da0495e6467d", + "placeholder": "​", + "style": "IPY_MODEL_04a6f124897543549ad5aed50e480ed5", + "value": "tokenizer_config.json: " + } + }, + "a9ab6a8075554c88a353fb779bf3f11b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ba292ae9569840d396d87aefee0d3d26", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_45a413a7b6a3442a86e7def1d6697ac1", + "value": 1 + } + }, + "206bda5a7946468099699003ce99f361": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_698fba63eb244ed2bb2ee63f24ec6f65", + "placeholder": "​", + "style": "IPY_MODEL_93d823e74553487ab278af9eee38e9c4", + "value": " 14.9k/? [00:00<00:00, 1.05MB/s]" + } + }, + "fb3a74b6f88f4b09862baee03cee8302": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "29d110ef78ef46609421da0495e6467d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "04a6f124897543549ad5aed50e480ed5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ba292ae9569840d396d87aefee0d3d26": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "45a413a7b6a3442a86e7def1d6697ac1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "698fba63eb244ed2bb2ee63f24ec6f65": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "93d823e74553487ab278af9eee38e9c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d500f1a39c7f40f4b2c9d963f504d213": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9b955d354b75489cac2226fd4be5064c", + "IPY_MODEL_8a24aba3bcde472298685e72cfb3427a", + "IPY_MODEL_50a608a731a44709ba28d32b7f159b7d" + ], + "layout": "IPY_MODEL_6dedecd63e4f47218bc5802f7cb07dc4" + } + }, + "9b955d354b75489cac2226fd4be5064c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_6ff2024770cf401ebc44106f343b8f30", + "placeholder": "​", + "style": "IPY_MODEL_7db57d9dc2df4744a28fc079f48b2d0e", + "value": "tokenizer.json: 100%" + } + }, + "8a24aba3bcde472298685e72cfb3427a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_8b97315532964a4c84fb78073d738e3c", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ddb90a7a730b4463bdaf6c8da724f8b0", + "value": 32169626 + } + }, + "50a608a731a44709ba28d32b7f159b7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_45a1e46160aa4b9895d8583a8fae9890", + "placeholder": "​", + "style": "IPY_MODEL_a10943fa524b420ba8ff854665119e43", + "value": " 32.2M/32.2M [00:00<00:00, 161MB/s]" + } + }, + "6dedecd63e4f47218bc5802f7cb07dc4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6ff2024770cf401ebc44106f343b8f30": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7db57d9dc2df4744a28fc079f48b2d0e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8b97315532964a4c84fb78073d738e3c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ddb90a7a730b4463bdaf6c8da724f8b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "45a1e46160aa4b9895d8583a8fae9890": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a10943fa524b420ba8ff854665119e43": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7ead793edcdc4542868bc35988087a41": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9d9bc2085aa64e17a7cb03743fc13ce0", + "IPY_MODEL_4dc9a224e9ed4fffb797c145520c2153", + "IPY_MODEL_73018ba3aebd4a0a9c16150ecde428e7" + ], + "layout": "IPY_MODEL_0ab572241a14413381c618316769bea5" + } + }, + "9d9bc2085aa64e17a7cb03743fc13ce0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_341d2ebe48d54ae58ef822a61a4ea55d", + "placeholder": "​", + "style": "IPY_MODEL_1c9ebc55fb584b5b89516e376ec00cfc", + "value": "README.md: 100%" + } + }, + "4dc9a224e9ed4fffb797c145520c2153": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_92db0e2905db4aa39552b7818b2282d3", + "max": 540, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6f730b26ae1447a9af2c7e3f8509f048", + "value": 540 + } + }, + "73018ba3aebd4a0a9c16150ecde428e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d26ca88568a94ef1beb9dd3102757a42", + "placeholder": "​", + "style": "IPY_MODEL_465de8b97846426cb7455bfbaaa66895", + "value": " 540/540 [00:00<00:00, 52.6kB/s]" + } + }, + "0ab572241a14413381c618316769bea5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "341d2ebe48d54ae58ef822a61a4ea55d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1c9ebc55fb584b5b89516e376ec00cfc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "92db0e2905db4aa39552b7818b2282d3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6f730b26ae1447a9af2c7e3f8509f048": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d26ca88568a94ef1beb9dd3102757a42": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "465de8b97846426cb7455bfbaaa66895": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "59102102d47c4d5b941afe38b1e327c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ba1b1d94170b41ad82a5431e64854fd0", + "IPY_MODEL_85c06e2df7cf426d888b2e885c9ff373", + "IPY_MODEL_756f82f0ed2b4537ae922ac65de71e2c" + ], + "layout": "IPY_MODEL_6b92ebfc7af2452fb88700cd29549845" + } + }, + "ba1b1d94170b41ad82a5431e64854fd0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_78b1fd5436694c7a883829a3373ba164", + "placeholder": "​", + "style": "IPY_MODEL_49285608dabb458bae5125ae9313a0b6", + "value": "data/train-00000-of-00002.parquet: 100%" + } + }, + "85c06e2df7cf426d888b2e885c9ff373": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_7d1762feec4a461284a762018372eef6", + "max": 494804366, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0504d2ea9d6b4c769b50be9e859c6b48", + "value": 494804366 + } + }, + "756f82f0ed2b4537ae922ac65de71e2c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cc4fe7b5633d4932bb70b9ce0f46c169", + "placeholder": "​", + "style": "IPY_MODEL_e4717c8e5d234eba94fbc5e7c7369f65", + "value": " 495M/495M [00:03<00:00, 354MB/s]" + } + }, + "6b92ebfc7af2452fb88700cd29549845": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "78b1fd5436694c7a883829a3373ba164": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "49285608dabb458bae5125ae9313a0b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7d1762feec4a461284a762018372eef6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0504d2ea9d6b4c769b50be9e859c6b48": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "cc4fe7b5633d4932bb70b9ce0f46c169": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e4717c8e5d234eba94fbc5e7c7369f65": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7f2edc965f6d4418bfeaf01911425606": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_33f366b3b13d4a63b56ec57dd5f28836", + "IPY_MODEL_2ee730d4eda94bbea4e0a4df58b7f84d", + "IPY_MODEL_67f489c853be494b83456cca77bf2a0d" + ], + "layout": "IPY_MODEL_f8bf5e48834d418eb423737cf0a0c66d" + } + }, + "33f366b3b13d4a63b56ec57dd5f28836": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7b63ed98dea64347bd8ffeb4e94c1e0c", + "placeholder": "​", + "style": "IPY_MODEL_c7b48c5df1e74383955e010b4f411854", + "value": "data/train-00001-of-00002.parquet: 100%" + } + }, + "2ee730d4eda94bbea4e0a4df58b7f84d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_aa7b6c960df84140b59c40a166279b23", + "max": 502613920, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_215bf5b5eef844f9ad392e2b93db8da2", + "value": 502613920 + } + }, + "67f489c853be494b83456cca77bf2a0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0cdf4bf1b09c481a95ab4c9351bf605c", + "placeholder": "​", + "style": "IPY_MODEL_d310fdb8b35d4173a1c2213118197d89", + "value": " 503M/503M [00:11<00:00, 40.7MB/s]" + } + }, + "f8bf5e48834d418eb423737cf0a0c66d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7b63ed98dea64347bd8ffeb4e94c1e0c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c7b48c5df1e74383955e010b4f411854": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "aa7b6c960df84140b59c40a166279b23": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "215bf5b5eef844f9ad392e2b93db8da2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0cdf4bf1b09c481a95ab4c9351bf605c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d310fdb8b35d4173a1c2213118197d89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "84d7352d2921443fa2b76d60bd2a51d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_5506b7e456b84c6890b12579d815e6ea", + "IPY_MODEL_a68bd900917c4ec3bc7fced86a909643", + "IPY_MODEL_4e4a231bbf20450fac8d6775cc6d1a1a" + ], + "layout": "IPY_MODEL_ca763ea2a041412280338cdf806dafc3" + } + }, + "5506b7e456b84c6890b12579d815e6ea": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a8be70e3ed014df9bddd8f72dec5702e", + "placeholder": "​", + "style": "IPY_MODEL_97c34bf202644e82bed87aa2defa5ed7", + "value": "Generating train split: 100%" + } + }, + "a68bd900917c4ec3bc7fced86a909643": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_92b1ae8f54b246b790ddd66493ddf7cc", + "max": 12038, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5a90282515bf44aa88374f3a7f05df1e", + "value": 12038 + } + }, + "4e4a231bbf20450fac8d6775cc6d1a1a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_904619a3cc624a25925cb66f6ab86564", + "placeholder": "​", + "style": "IPY_MODEL_8870940de0534e98b9189e7c168b80e1", + "value": " 12038/12038 [00:04<00:00, 2288.38 examples/s]" + } + }, + "ca763ea2a041412280338cdf806dafc3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a8be70e3ed014df9bddd8f72dec5702e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "97c34bf202644e82bed87aa2defa5ed7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "92b1ae8f54b246b790ddd66493ddf7cc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5a90282515bf44aa88374f3a7f05df1e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "904619a3cc624a25925cb66f6ab86564": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8870940de0534e98b9189e7c168b80e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "75e57ae8d4f94b3d9702a24a85b75f6e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a452f87440d34e2285dee4941cf558e2", + "IPY_MODEL_d6d64f507469463ba1d678e966b78c28", + "IPY_MODEL_9269fd899b71476faeffe5ca24ff3c23" + ], + "layout": "IPY_MODEL_d574cfbfa9f94ef7b1c037bc7884b8b5" + } + }, + "a452f87440d34e2285dee4941cf558e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_cc44984cc78442ba9b73df356ad6e6b3", + "placeholder": "​", + "style": "IPY_MODEL_45cfbdff1db94eed80cbd6cf4ae19b3d", + "value": "Map (num_proc=4): 100%" + } + }, + "d6d64f507469463ba1d678e966b78c28": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_68f32e20479e4d61bda9adff2532ba70", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c264561cd45b41109bcf3cacab8aa387", + "value": 3000 + } + }, + "9269fd899b71476faeffe5ca24ff3c23": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_63351416559f4bfdb6c21adceaee17e8", + "placeholder": "​", + "style": "IPY_MODEL_5efb687bf68b45ca91797d17fbf88be4", + "value": " 3000/3000 [00:35<00:00, 45.77 examples/s]" + } + }, + "d574cfbfa9f94ef7b1c037bc7884b8b5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cc44984cc78442ba9b73df356ad6e6b3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "45cfbdff1db94eed80cbd6cf4ae19b3d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "68f32e20479e4d61bda9adff2532ba70": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c264561cd45b41109bcf3cacab8aa387": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "63351416559f4bfdb6c21adceaee17e8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5efb687bf68b45ca91797d17fbf88be4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Text.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Text.ipynb new file mode 100644 index 0000000..fb7c293 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Text.ipynb @@ -0,0 +1,7100 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "3FgedoPTwNIy" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab L4 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kD8yWWE9wNIz" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dYFNULMnwNIz" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DQ6w6D0UwNIz" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "LSA1qFrKwNIz" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lBN09c1tUlSV" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TGMWlrRdzwgf" + }, + "source": [ + "### Unsloth\n", + "\n", + "`FastModel` supports loading nearly any model now! This includes Vision and Text models!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "-Xbb0cuLzwgf", + "outputId": "b1936459-858a-460f-d39c-fe4d41114da8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 380, + "referenced_widgets": [ + "1aed93f4ca3b45b5b194aaaba43768ef", + "884a0c3267f743198b1cc2e51eabbd87", + "22ecfe66b78f4470877558859de40608", + "43caa59b7fa94ee39f6993007be26a6e", + "1a677ab08bec40cbaea059912e3f148d", + "7cc26327d62b4cd1b18a301df184e544", + "6cccb64fbc6c46afb29801e6c5f2b8d1", + "671a5973e5504d81a09e0ee30db56a85", + "8a379ddf368842b39c01e94b394b7dd1", + "d5e2df92e9de4dc5a274a545d4b732f1", + "02d78160f48b4145830fc3c61b7cffd1", + "1a60091e9bb54eb3af50e055b0fafd1f", + "e050c9d3e05643ef9657216f814962b1", + "9b0fceb9931a4bc5978fcae33a6ff811", + "2947239108e34a149ef13a84e0b00e3d", + "99e7b18e3811427aab73f1afc8bfb954", + "62aab9454a884fbea96de59255620f87", + "c9975a7e25d54a39a0c5547245fa6178", + "5f089afd43884d14b78a8238cb548f37", + "968e200f35b44909ba35df31d35e4bf7", + "1fd5bf7fbf6744d39f1de3de1b2194f4", + "ddb0c72cb0af468dae7916bdf6a06f24", + "8aee416b9f5e421aab44ff0eb87f5323", + "bc8f33128c8845a9bbf7766a3cf85db6", + "99c78071240d4a448b02a0f5201cc00c", + "5d3f6e5f5b7f46d59cfc1b0d319b5aca", + "63319aaee4cb4fb1b97972b62442815a", + "7d3fa936cd1d4ef189321a9a4df6d9a2", + "acafd4bfe22b47f895909f1f5e30803a", + "724487122781495d82fa21f066b03557", + "3717648cbcba4a76abfe9114906be386", + "0f4af67f55234ad88612edbad914041f", + "eb8e4d5a374b44f0be18fb7baec7051e", + "ca880e2479834f3c98a65a2258e787bd", + "9609898077d646f7a44c4233a9ba9932", + "817f1bdb1dac432c93d868bea15f31fa", + "f4104b3429a74af889509ab26e494fac", + "4d1588e4d6d04ec4885c38e161071463", + "db4d07a9db714f6f93d922882a410e4d", + "fb04cb323b934cde808ba8fba87e66bc", + "0e5806ad42b64bbda0f9f8e426e382c8", + "c56375c628ab44fd95f80fae39ebbd55", + "42bf4041d37540089e80a31afee69b12", + "2e77264ff5764d658fd0d8f03329a3e2", + "694f196a866f47b48024d21e4cb36610", + "8bf349f444c648a3b193d89b5ca48cc5", + "7382b653f8db451d809d65159b10e69f", + "924b0f616af04e0c9f8bb43e2ad4af11", + "409155dc6ebf4736ae18034fe1b53b26", + "0a3c799cf0f843d59681f4a7106ab74b", + "d6c1b7fb52e2481fa12ecc6735225717", + "397cbf2ac3fb49e5ad99e063423c4ef0", + "a5be697d40af4a3b890f9eb1864ee815", + "4fa8b5cfa38247549a3a21d99e7425d9", + "5a0f4872c23e411fa90876d6e8fc6724", + "d466fd0b0e6641769ac60088978f31ca", + "56b3b3f6e9344dc5bcf6f3fea4cefe40", + "275082e9212941399f35de978e507c5b", + "1f84016528874323b222908c7ac9c484", + "766f1105af5d4e298189d47e3288593a", + "76ac77bfac124cd3a16bb28385973b71", + "251468bed4f44c6296194fb80eda1f55", + "c3636672661443abb33d2a338c6ff82c", + "ebffe47f7cc14b67b32f4bd869571260", + "8f6ef19f400e4adc832e018838e8bd43", + "751202361c2046a6993d88bb454a21c7", + "4c07a504c4b84880a3971ef5863dbfab", + "4579e185e6db4a4fbda6d357918a30cd", + "984f24f050514ff9808c0cc0fbf25b55", + "9510f7509289400e9b3b628bc8fa8962", + "742783818d3c41e396cf4fdffa041d7c", + "e855f68299b840888c94c565ce347b29", + "e39e03b3cf5e40d2807391f4959d4e42", + "1ab5e182e89e46dfa26cbabfbc5b522a", + "b0776300bf984578981a4a2c88525ada", + "8a532284dde448e78079dac3b8a29ad9", + "0429d1b4a634476695d10a0eb8b4a6c9" + ] + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/16.0G [00:00" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "9jGeSb9bWe0k", + "outputId": "289205bd-b890-4659-8c82-8c7674befdfe", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "I am sorry, but I cannot answer that question because the image you provided is of an animal, and I have no information about any films it might feature in.\n" + ] + } + ], + "source": [ + "sloth_link = \"https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"Which films does this animal feature in?\" }\n", + " ]\n", + "}]\n", + "# You might have to wait 1 minute for Unsloth's auto compiler\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eh0BzbZPWtRD" + }, + "source": [ + "Let's make a poem about sloths!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "R3ExuK8cWuT3", + "outputId": "d63b198a-00c6-49a5-d0e5-78cbd18d217f", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "## The Gentle Pace\n", + "\n", + "In emerald woods, where moss hangs deep and low,\n", + "And dappled sunlight through the canopy does flow,\n", + "There moves a creature, draped in patient grace,\n", + "A living statue in this verdant space.\n", + "\n", + "The sloth, a marvel of the slow design,\n", + "A tapestry of stillness, truly divine.\n", + "His fur, a canvas where the lichen clings,\n", + "A quiet testament to what the stillness brings.\n", + "\n", + "He hangs suspended, a deliberate dream,\n", + "Within the slow, meandering forest stream\n", + "Of time itself, where urgency takes flight,\n", + "And moments linger bathed in amber light.\n", + "\n", + "His movements\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{ \"type\" : \"text\",\n", + " \"text\" : \"Write a poem about sloths.\" }]\n", + "}]\n", + "do_gemma_4_inference(messages)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wZrmFRZpZtGf" + }, + "source": [ + "# Gemma 4 can also hear!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "68crYajNZtw1", + "outputId": "e8ffe42f-79d8-473c-8b2b-8d4d05acc549", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 61 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "from IPython.display import Audio, display\n", + "Audio(\"https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "k3vrdoa0Z01X" + }, + "outputs": [], + "source": [ + "!wget -qqq https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3 -O audio.mp3" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "BJr_D4O9Z2Zh", + "outputId": "d6517a81-1d77-41dc-b2dd-2e6ab1aa3a29", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "This audio is about the goal of landing a man on the moon and returning him safely to Earth before the decade is out.\n" + ] + } + ], + "source": [ + "audio_file = \"audio.mp3\"\n", + "\n", + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio about?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L15JuAmmaOkB" + }, + "source": [ + "# Let's combine all 3 modalities together!" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "is37bsDZaRwV", + "outputId": "37235929-0289-4ba6-c352-da6d389cb5a0", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "This audio clip is a famous excerpt from John F. Kennedy's 1962 speech to Congress. He was advocating for the United States to commit to landing a man on the Moon and bringing him back safely to Earth before the decade was out.\n", + "\n", + "The image is a picture of a sloth.\n", + "\n", + "There is no relationship between the audio and the image. The audio is a political speech, while the image is a photograph of an animal.\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\" : \"user\",\n", + " \"content\": [\n", + " { \"type\": \"audio\", \"audio\" : audio_file },\n", + " { \"type\": \"image\", \"image\" : sloth_link },\n", + " { \"type\": \"text\", \"text\" : \"What is this audio and image about? \"\\\n", + " \"How are they related?\" }\n", + " ]\n", + "}]\n", + "do_gemma_4_inference(messages, max_new_tokens = 256)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bw5XPyYFajyM" + }, + "source": [ + "# Let's finetune Gemma 4!\n", + "\n", + "You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SXd9bTZd1aaL" + }, + "source": [ + "We now add LoRA adapters so we only need to update a small amount of parameters!" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "6bZsfBuZDeCL" + }, + "outputs": [], + "source": [ + "model = FastModel.get_peft_model(\n", + " model,\n", + " finetune_vision_layers = False, # Turn off for just text!\n", + " finetune_language_layers = True, # Should leave on!\n", + " finetune_attention_modules = True, # Attention good for GRPO\n", + " finetune_mlp_modules = True, # Should leave on always!\n", + "\n", + " r = 8, # Larger = higher accuracy, but might overfit\n", + " lora_alpha = 8, # Recommended alpha == r at least\n", + " lora_dropout = 0,\n", + " bias = \"none\",\n", + " random_state = 3407,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vITh0KVJ10qX" + }, + "source": [ + "\n", + "### Data Prep\n", + "We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below:\n", + "\n", + "```\n", + "<|turn>user\n", + "Hello\n", + "<|turn>model\n", + "Hey there!\n", + "```\n", + "We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "LjY75GoYUCB8" + }, + "outputs": [], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZQkXuGYxbJ-e" + }, + "source": [ + "We get the first 3000 rows of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "Mkq4RvEq7FQr", + "outputId": "e78c54dd-f931-4c00-a73d-e37f3eff19e8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 113, + "referenced_widgets": [ + "fabccf89d3904b678111fb12a8c7919f", + "496290c588ad4736906e89aa3f80b713", + "3cc36b868a834c19935e1613b114388a", + "6d5b8376f62f4b76b907312714bab547", + "13b8da7ffbd04a48a47e72d631825226", + "73d6158b09a9446d8ce764d75bcaa653", + "eec6c1a9c6d64f8ea02c0a3b35272cbe", + "0a8ea69380804347b38b95054f9a1687", + "dca6ee8c28a0441aba2fb7bdcb806246", + "4d8f3cd8f0ef4c86b987532df2c14a9b", + "1d4052c66e414ee89cb7454e3faac18c", + "e092b15159864c2eb45b15ff8dbcf659", + "d55e6ebfa3fb44d1b2e79c4848e83227", + "78baf58aa7c9410e9ebc74c04948f99c", + "cadca9302ab3450e92a1971c8a9528e7", + "ae7ddb3de6734906ac85729bf01709e7", + "d9b7ac1ff506461eaa9da424a8430c63", + "d0d9352121134f518ca4d9f1ae1d08a8", + "a0a01b6854194da0af7d2ddc96856945", + "a732bbffcaf34403869a6d86c1dd4871", + "10abfe1311914dbaa8f697a82fc567a3", + "7fbaf07e1b0e4fa0acea9a5d4b92559f", + "1503befd068143e992db7bcdca36557f", + "2fb84661a76e49f0912e36917adea52e", + "13d21d9087824744a6056f867dc4ff11", + "418e3b94a5a34882a6794e7092a89067", + "1d8d427198a946e8a2f364662da03b9e", + "76ee2c7cf99e44d7b403a328c5c85357", + "92ffae8e6c1447f8aea99ffae371f053", + "496535fa240f4cdebac514965d928b23", + "631c80e16bd24dd4861b5446e4fa3741", + "4856020cb14e471bab5619270d0d2dac", + "d2a6f7596d4343878a22f791613a3a34" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/982 [00:00` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "id": "1ahE8Ys37JDJ", + "outputId": "13973ed3-779d-485e-92aa-33b6925f1737", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "fa62d625aa06430caf57fbe8ff872b43", + "34cb4d22bf9d41329551a1135ebfca63", + "9258980fb6954200823889434a3e0a9a", + "8f8f53d0aff74f288b505717d7e2d625", + "922fe3cc3d88403dbec0c94fae364f93", + "de17d7225f1741aaa9a87e5689c2ada8", + "485e804c2a2b45b3a442219a9e73626c", + "dd0dc8a4da3f4c5897f18bde720a91bc", + "49151c4db95340608bf237e85563fa2f", + "b5c0dae215dc437fba607f57f6720632", + "0ca6a8f22d404f5b808769600655e54d" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Map: 0%| | 0/3000 [00:00') for convo in convos]\n", + " return { \"text\" : texts, }\n", + "\n", + "dataset = dataset.map(formatting_prompts_func, batched = True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "gGFzmplrEy9I", + "outputId": "36882276-635b-45f5-f9d8-3764373dc35e", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 17 + } + ], + "source": [ + "dataset[100][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "95_Nn-89DhsL", + "outputId": "87503724-3283-49e4-fec6-4b2c4e084fca", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "4f5e0be98f7b48b68f9e4d0b9bce31ee", + "89193bbcf50742e3a40c98f6332a51ce", + "6b1b3000713746a8a1e1309f3b319f3a", + "3f108d33c1d14c1ea82c1cf4c5aba5a3", + "e89d6c56927640ddbbf956a3b6f7c951", + "77c380ae4aa24032b80ecefced482997", + "3b4ebd09fa584e7a8a7f64841e4a3a22", + "bc6abe2b4d0b435c9ffa066c41641971", + "cd6e34ffab074155b6f6c84fad95b017", + "9372cb8b55424f679ed0a06820788cb5", + "573ce421fde44bb6b93677da04991e26" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Unsloth: Tokenizing [\"text\"] (num_proc=6): 0%| | 0/3000 [00:00user\\n\",\n", + " response_part = \"<|turn>model\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dv1NBUozV78l" + }, + "source": [ + "Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "LtsMVtlkUhja", + "outputId": "d3126757-2a14-4c6d-99f8-98b3bf91be55", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 140 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'<|turn>user\\nWhat is the modulus operator in programming and how can I use it to calculate the modulus of two given numbers?\\n<|turn>model\\nIn programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "tokenizer.decode(trainer.train_dataset[100][\"input_ids\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Kyjy__m9KY3" + }, + "source": [ + "Now let's print the masked out example - you should see only the answer is present:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "_rD6fl8EUxnG", + "outputId": "e579a2b3-9df6-4c40-ef7c-98d7c9cd9d82", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 139 + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "' In programming, the modulus operator is represented by the \\'%\\' symbol. It calculates the remainder when one number is divided by another. To calculate the modulus of two given numbers, you can use the modulus operator in the following way:\\n\\n```python\\n# Calculate the modulus\\nModulus = a % b\\n\\nprint(\"Modulus of the given numbers is: \", Modulus)\\n```\\n\\nIn this code snippet, the variables \\'a\\' and \\'b\\' represent the two given numbers for which you want to calculate the modulus. By using the modulus operator \\'%\\', we calculate the remainder when \\'a\\' is divided by \\'b\\'. The result is then stored in the variable \\'Modulus\\'. Finally, the modulus value is printed using the \\'print\\' statement.\\n\\nFor example, if \\'a\\' is 10 and \\'b\\' is 4, the modulus calculation would be 10 % 4, which equals 2. Therefore, the output of the above code would be:\\n\\n```\\nModulus of the given numbers is: 2\\n```\\n\\nThis means that the modulus of 10 and 4 is 2.\\n'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100][\"labels\"]]).replace(tokenizer.pad_token, \" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "outputId": "2ecea13f-2faa-4c7d-e006-a0a1cb90612a", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "9.891 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNP1Uidk9mrz" + }, + "source": [ + "# Let's train the model!\n", + "\n", + "To resume a training run, set `trainer.train(resume_from_checkpoint = True)`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "outputId": "180092e1-ae76-449a-9f2d-0dbc3894b8f8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 2,991 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 18,350,080 of 8,014,506,528 (0.23% trained)\n", + "Caching is incompatible with gradient checkpointing in Gemma4TextDecoderLayer. Setting `past_key_values=None`.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 05:40, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
110.523080
210.053988
312.042601
49.989527
510.095121
610.694251
710.364755
89.754461
98.304264
107.318188
117.289935
126.898206
136.666481
145.392871
156.022815
164.724240
174.793351
185.101266
195.203894
205.107642
214.166076
224.096564
234.555800
244.716465
254.108744
263.947126
274.030560
283.109566
293.588513
303.787085
313.353788
323.781386
333.406949
343.755966
353.335477
363.656681
373.317236
383.059520
393.279643
402.585943
413.501766
423.417128
432.781741
442.492920
452.859325
463.464297
472.931827
483.242573
492.751030
502.390760
512.890718
522.199112
533.136880
542.664481
552.288600
562.728267
572.804231
582.806247
592.632231
602.837519

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "outputId": "585888de-dbd8-4562-c6e5-a5f0dbf26dc7", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "368.1867 seconds used for training.\n", + "6.14 minutes used for training.\n", + "Peak reserved memory = 10.715 GB.\n", + "Peak reserved memory for training = 0.824 GB.\n", + "Peak reserved memory % of max memory = 73.577 %.\n", + "Peak reserved memory for training % of max memory = 5.658 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64`" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "id": "kR3gIAX-SM2q", + "outputId": "42097560-b2b6-4d32-a9f8-160db24434cc", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['<|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,\\n<|turn>model\\n13, 21, 34, 55, 89, ...\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones.']" + ], + "text/html": [ + "

['<bos><|turn>user\\nContinue the sequence: 1, 1, 2, 3, 5, 8,<turn|>\\n<|turn>model\\n13, 21, 34, 55, 89, ...\\n\\nThis is the **Fibonacci sequence**, where each number is the sum of the two preceding ones.<turn|>']
" + ] + }, + "metadata": {}, + "execution_count": 25 + } + ], + "source": [ + "from unsloth.chat_templates import get_chat_template\n", + "tokenizer = get_chat_template(\n", + " tokenizer,\n", + " chat_template = \"gemma-4\",\n", + ")\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\n", + " \"type\" : \"text\",\n", + " \"text\" : \"Continue the sequence: 1, 1, 2, 3, 5, 8,\",\n", + " }]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "outputs = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + ")\n", + "tokenizer.batch_decode(outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CrSvZObor0lY" + }, + "source": [ + " You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time!" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "e2pEuRb1r2Vg", + "outputId": "a648ff4f-3762-44d5-eb8b-5045a5c01a50", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The sky appears blue primarily due to a phenomenon called **Rayleigh scattering**. Here's a breakdown of how this works:\n", + "\n", + "1. **Sunlight is composed of different wavelengths:** Sunlight, which comes from the sun, is made up of various colors, each with a different wavelength. Blue light has a shorter wavelength\n" + ] + } + ], + "source": [ + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"Why is the sky blue?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 64, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "id": "upcOlWe7A1vc", + "outputId": "b38635d3-0eae-40ed-93f1-771f04c205c0", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "tokenizer.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# tokenizer.push_to_hub(\"HF_ACCOUNT/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "MKX_XKs_BNZR", + "outputId": "c6380f12-92c3-44da-ee71-c6895cb19a95", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "I am Gemma 4, a Large Language Model developed by Google DeepMind. I am an open weights model.\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastModel\n", + " model, tokenizer = FastModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " max_seq_length = 2048,\n", + " load_in_4bit = True,\n", + " )\n", + "\n", + "messages = [{\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\" : \"text\", \"text\" : \"What is Gemma-4?\",}]\n", + "}]\n", + "inputs = tokenizer.apply_chat_template(\n", + " messages,\n", + " add_generation_prompt = True, # Must add for generation\n", + " return_tensors = \"pt\",\n", + " tokenize = True,\n", + " return_dict = True,\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "_ = model.generate(\n", + " **inputs,\n", + " max_new_tokens = 128, # Increase for longer outputs!\n", + " # Recommended Gemma-4 settings!\n", + " temperature = 1.0, top_p = 0.95, top_k = 64,\n", + " streamer = TextStreamer(tokenizer, skip_prompt = True),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run!" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save finetune!\n", + " model.save_pretrained_merged(\"gemma-4-finetune\", tokenizer)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z6O48DbNIAr0" + }, + "source": [ + "If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "ZV-CiKPrIFG0" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload finetune\n", + " model.push_to_hub_merged(\n", + " \"HF_ACCOUNT/gemma-4-finetune\", tokenizer,\n", + " token = \"YOUR_HF_TOKEN\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TCv4vXHd61i7" + }, + "source": [ + "### GGUF / llama.cpp Conversion\n", + "To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later!" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "FqfebeAdT073" + }, + "outputs": [], + "source": [ + "if False: # Change to True to save to GGUF\n", + " model.save_pretrained_gguf(\n", + " \"gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # For now only Q8_0, BF16, F16 supported\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q974YEVPI7JS" + }, + "source": [ + "Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location!" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "ZgcJIhJ0I_es" + }, + "outputs": [], + "source": [ + "if False: # Change to True to upload GGUF\n", + " model.push_to_hub_gguf(\n", + " \"HF_ACCOUNT/gemma_4_finetune\",\n", + " tokenizer,\n", + " quantization_method = \"Q8_0\", # Only Q8_0, BF16, F16 supported\n", + " token = \"YOUR_HF_TOKEN\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pnz9QOYTMvbH" + }, + "source": [ + "Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp.\n", + "\n", + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.11" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "1aed93f4ca3b45b5b194aaaba43768ef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_884a0c3267f743198b1cc2e51eabbd87", + "IPY_MODEL_22ecfe66b78f4470877558859de40608", + "IPY_MODEL_43caa59b7fa94ee39f6993007be26a6e" + ], + "layout": "IPY_MODEL_1a677ab08bec40cbaea059912e3f148d" + } + }, + "884a0c3267f743198b1cc2e51eabbd87": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7cc26327d62b4cd1b18a301df184e544", + "placeholder": "​", + "style": "IPY_MODEL_6cccb64fbc6c46afb29801e6c5f2b8d1", + "value": "model.safetensors: 100%" + } + }, + "22ecfe66b78f4470877558859de40608": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_671a5973e5504d81a09e0ee30db56a85", + "max": 15992595884, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8a379ddf368842b39c01e94b394b7dd1", + "value": 15992595884 + } + }, + "43caa59b7fa94ee39f6993007be26a6e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d5e2df92e9de4dc5a274a545d4b732f1", + "placeholder": "​", + "style": "IPY_MODEL_02d78160f48b4145830fc3c61b7cffd1", + "value": " 16.0G/16.0G [05:22<00:00, 116MB/s]" + } + }, + "1a677ab08bec40cbaea059912e3f148d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7cc26327d62b4cd1b18a301df184e544": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6cccb64fbc6c46afb29801e6c5f2b8d1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "671a5973e5504d81a09e0ee30db56a85": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "8a379ddf368842b39c01e94b394b7dd1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d5e2df92e9de4dc5a274a545d4b732f1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "02d78160f48b4145830fc3c61b7cffd1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1a60091e9bb54eb3af50e055b0fafd1f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e050c9d3e05643ef9657216f814962b1", + "IPY_MODEL_9b0fceb9931a4bc5978fcae33a6ff811", + "IPY_MODEL_2947239108e34a149ef13a84e0b00e3d" + ], + "layout": "IPY_MODEL_99e7b18e3811427aab73f1afc8bfb954" + } + }, + "e050c9d3e05643ef9657216f814962b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_62aab9454a884fbea96de59255620f87", + "placeholder": "​", + "style": "IPY_MODEL_c9975a7e25d54a39a0c5547245fa6178", + "value": "Loading weights: 100%" + } + }, + "9b0fceb9931a4bc5978fcae33a6ff811": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_5f089afd43884d14b78a8238cb548f37", + "max": 2130, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_968e200f35b44909ba35df31d35e4bf7", + "value": 2130 + } + }, + "2947239108e34a149ef13a84e0b00e3d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1fd5bf7fbf6744d39f1de3de1b2194f4", + "placeholder": "​", + "style": "IPY_MODEL_ddb0c72cb0af468dae7916bdf6a06f24", + "value": " 2130/2130 [01:07<00:00, 407.11it/s]" + } + }, + "99e7b18e3811427aab73f1afc8bfb954": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "62aab9454a884fbea96de59255620f87": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "c9975a7e25d54a39a0c5547245fa6178": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5f089afd43884d14b78a8238cb548f37": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "968e200f35b44909ba35df31d35e4bf7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1fd5bf7fbf6744d39f1de3de1b2194f4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ddb0c72cb0af468dae7916bdf6a06f24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8aee416b9f5e421aab44ff0eb87f5323": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_bc8f33128c8845a9bbf7766a3cf85db6", + "IPY_MODEL_99c78071240d4a448b02a0f5201cc00c", + "IPY_MODEL_5d3f6e5f5b7f46d59cfc1b0d319b5aca" + ], + "layout": "IPY_MODEL_63319aaee4cb4fb1b97972b62442815a" + } + }, + "bc8f33128c8845a9bbf7766a3cf85db6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7d3fa936cd1d4ef189321a9a4df6d9a2", + "placeholder": "​", + "style": "IPY_MODEL_acafd4bfe22b47f895909f1f5e30803a", + "value": "generation_config.json: 100%" + } + }, + "99c78071240d4a448b02a0f5201cc00c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_724487122781495d82fa21f066b03557", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3717648cbcba4a76abfe9114906be386", + "value": 208 + } + }, + "5d3f6e5f5b7f46d59cfc1b0d319b5aca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0f4af67f55234ad88612edbad914041f", + "placeholder": "​", + "style": "IPY_MODEL_eb8e4d5a374b44f0be18fb7baec7051e", + "value": " 208/208 [00:00<00:00, 22.2kB/s]" + } + }, + "63319aaee4cb4fb1b97972b62442815a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7d3fa936cd1d4ef189321a9a4df6d9a2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "acafd4bfe22b47f895909f1f5e30803a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "724487122781495d82fa21f066b03557": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3717648cbcba4a76abfe9114906be386": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0f4af67f55234ad88612edbad914041f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "eb8e4d5a374b44f0be18fb7baec7051e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ca880e2479834f3c98a65a2258e787bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9609898077d646f7a44c4233a9ba9932", + "IPY_MODEL_817f1bdb1dac432c93d868bea15f31fa", + "IPY_MODEL_f4104b3429a74af889509ab26e494fac" + ], + "layout": "IPY_MODEL_4d1588e4d6d04ec4885c38e161071463" + } + }, + "9609898077d646f7a44c4233a9ba9932": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_db4d07a9db714f6f93d922882a410e4d", + "placeholder": "​", + "style": "IPY_MODEL_fb04cb323b934cde808ba8fba87e66bc", + "value": "processor_config.json: " + } + }, + "817f1bdb1dac432c93d868bea15f31fa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0e5806ad42b64bbda0f9f8e426e382c8", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c56375c628ab44fd95f80fae39ebbd55", + "value": 1 + } + }, + "f4104b3429a74af889509ab26e494fac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_42bf4041d37540089e80a31afee69b12", + "placeholder": "​", + "style": "IPY_MODEL_2e77264ff5764d658fd0d8f03329a3e2", + "value": " 1.69k/? [00:00<00:00, 117kB/s]" + } + }, + "4d1588e4d6d04ec4885c38e161071463": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "db4d07a9db714f6f93d922882a410e4d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "fb04cb323b934cde808ba8fba87e66bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0e5806ad42b64bbda0f9f8e426e382c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "c56375c628ab44fd95f80fae39ebbd55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "42bf4041d37540089e80a31afee69b12": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2e77264ff5764d658fd0d8f03329a3e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "694f196a866f47b48024d21e4cb36610": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_8bf349f444c648a3b193d89b5ca48cc5", + "IPY_MODEL_7382b653f8db451d809d65159b10e69f", + "IPY_MODEL_924b0f616af04e0c9f8bb43e2ad4af11" + ], + "layout": "IPY_MODEL_409155dc6ebf4736ae18034fe1b53b26" + } + }, + "8bf349f444c648a3b193d89b5ca48cc5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0a3c799cf0f843d59681f4a7106ab74b", + "placeholder": "​", + "style": "IPY_MODEL_d6c1b7fb52e2481fa12ecc6735225717", + "value": "chat_template.jinja: " + } + }, + "7382b653f8db451d809d65159b10e69f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_397cbf2ac3fb49e5ad99e063423c4ef0", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a5be697d40af4a3b890f9eb1864ee815", + "value": 1 + } + }, + "924b0f616af04e0c9f8bb43e2ad4af11": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4fa8b5cfa38247549a3a21d99e7425d9", + "placeholder": "​", + "style": "IPY_MODEL_5a0f4872c23e411fa90876d6e8fc6724", + "value": " 11.9k/? [00:00<00:00, 1.03MB/s]" + } + }, + "409155dc6ebf4736ae18034fe1b53b26": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0a3c799cf0f843d59681f4a7106ab74b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d6c1b7fb52e2481fa12ecc6735225717": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "397cbf2ac3fb49e5ad99e063423c4ef0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "a5be697d40af4a3b890f9eb1864ee815": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4fa8b5cfa38247549a3a21d99e7425d9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5a0f4872c23e411fa90876d6e8fc6724": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "d466fd0b0e6641769ac60088978f31ca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_56b3b3f6e9344dc5bcf6f3fea4cefe40", + "IPY_MODEL_275082e9212941399f35de978e507c5b", + "IPY_MODEL_1f84016528874323b222908c7ac9c484" + ], + "layout": "IPY_MODEL_766f1105af5d4e298189d47e3288593a" + } + }, + "56b3b3f6e9344dc5bcf6f3fea4cefe40": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_76ac77bfac124cd3a16bb28385973b71", + "placeholder": "​", + "style": "IPY_MODEL_251468bed4f44c6296194fb80eda1f55", + "value": "tokenizer_config.json: " + } + }, + "275082e9212941399f35de978e507c5b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c3636672661443abb33d2a338c6ff82c", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ebffe47f7cc14b67b32f4bd869571260", + "value": 1 + } + }, + "1f84016528874323b222908c7ac9c484": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8f6ef19f400e4adc832e018838e8bd43", + "placeholder": "​", + "style": "IPY_MODEL_751202361c2046a6993d88bb454a21c7", + "value": " 14.9k/? [00:00<00:00, 619kB/s]" + } + }, + "766f1105af5d4e298189d47e3288593a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "76ac77bfac124cd3a16bb28385973b71": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "251468bed4f44c6296194fb80eda1f55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c3636672661443abb33d2a338c6ff82c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "ebffe47f7cc14b67b32f4bd869571260": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8f6ef19f400e4adc832e018838e8bd43": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "751202361c2046a6993d88bb454a21c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4c07a504c4b84880a3971ef5863dbfab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_4579e185e6db4a4fbda6d357918a30cd", + "IPY_MODEL_984f24f050514ff9808c0cc0fbf25b55", + "IPY_MODEL_9510f7509289400e9b3b628bc8fa8962" + ], + "layout": "IPY_MODEL_742783818d3c41e396cf4fdffa041d7c" + } + }, + "4579e185e6db4a4fbda6d357918a30cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_e855f68299b840888c94c565ce347b29", + "placeholder": "​", + "style": "IPY_MODEL_e39e03b3cf5e40d2807391f4959d4e42", + "value": "tokenizer.json: 100%" + } + }, + "984f24f050514ff9808c0cc0fbf25b55": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_1ab5e182e89e46dfa26cbabfbc5b522a", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b0776300bf984578981a4a2c88525ada", + "value": 32169626 + } + }, + "9510f7509289400e9b3b628bc8fa8962": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_8a532284dde448e78079dac3b8a29ad9", + "placeholder": "​", + "style": "IPY_MODEL_0429d1b4a634476695d10a0eb8b4a6c9", + "value": " 32.2M/32.2M [00:00<00:00, 161MB/s]" + } + }, + "742783818d3c41e396cf4fdffa041d7c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e855f68299b840888c94c565ce347b29": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e39e03b3cf5e40d2807391f4959d4e42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1ab5e182e89e46dfa26cbabfbc5b522a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b0776300bf984578981a4a2c88525ada": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "8a532284dde448e78079dac3b8a29ad9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0429d1b4a634476695d10a0eb8b4a6c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "fabccf89d3904b678111fb12a8c7919f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_496290c588ad4736906e89aa3f80b713", + "IPY_MODEL_3cc36b868a834c19935e1613b114388a", + "IPY_MODEL_6d5b8376f62f4b76b907312714bab547" + ], + "layout": "IPY_MODEL_13b8da7ffbd04a48a47e72d631825226" + } + }, + "496290c588ad4736906e89aa3f80b713": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_73d6158b09a9446d8ce764d75bcaa653", + "placeholder": "​", + "style": "IPY_MODEL_eec6c1a9c6d64f8ea02c0a3b35272cbe", + "value": "README.md: 100%" + } + }, + "3cc36b868a834c19935e1613b114388a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_0a8ea69380804347b38b95054f9a1687", + "max": 982, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dca6ee8c28a0441aba2fb7bdcb806246", + "value": 982 + } + }, + "6d5b8376f62f4b76b907312714bab547": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4d8f3cd8f0ef4c86b987532df2c14a9b", + "placeholder": "​", + "style": "IPY_MODEL_1d4052c66e414ee89cb7454e3faac18c", + "value": " 982/982 [00:00<00:00, 102kB/s]" + } + }, + "13b8da7ffbd04a48a47e72d631825226": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "73d6158b09a9446d8ce764d75bcaa653": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "eec6c1a9c6d64f8ea02c0a3b35272cbe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "0a8ea69380804347b38b95054f9a1687": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "dca6ee8c28a0441aba2fb7bdcb806246": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4d8f3cd8f0ef4c86b987532df2c14a9b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1d4052c66e414ee89cb7454e3faac18c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e092b15159864c2eb45b15ff8dbcf659": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d55e6ebfa3fb44d1b2e79c4848e83227", + "IPY_MODEL_78baf58aa7c9410e9ebc74c04948f99c", + "IPY_MODEL_cadca9302ab3450e92a1971c8a9528e7" + ], + "layout": "IPY_MODEL_ae7ddb3de6734906ac85729bf01709e7" + } + }, + "d55e6ebfa3fb44d1b2e79c4848e83227": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_d9b7ac1ff506461eaa9da424a8430c63", + "placeholder": "​", + "style": "IPY_MODEL_d0d9352121134f518ca4d9f1ae1d08a8", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "78baf58aa7c9410e9ebc74c04948f99c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_a0a01b6854194da0af7d2ddc96856945", + "max": 116531415, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a732bbffcaf34403869a6d86c1dd4871", + "value": 116531415 + } + }, + "cadca9302ab3450e92a1971c8a9528e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_10abfe1311914dbaa8f697a82fc567a3", + "placeholder": "​", + "style": "IPY_MODEL_7fbaf07e1b0e4fa0acea9a5d4b92559f", + "value": " 117M/117M [00:01<00:00, 582MB/s]" + } + }, + "ae7ddb3de6734906ac85729bf01709e7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d9b7ac1ff506461eaa9da424a8430c63": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d0d9352121134f518ca4d9f1ae1d08a8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "a0a01b6854194da0af7d2ddc96856945": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a732bbffcaf34403869a6d86c1dd4871": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "10abfe1311914dbaa8f697a82fc567a3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7fbaf07e1b0e4fa0acea9a5d4b92559f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1503befd068143e992db7bcdca36557f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_2fb84661a76e49f0912e36917adea52e", + "IPY_MODEL_13d21d9087824744a6056f867dc4ff11", + "IPY_MODEL_418e3b94a5a34882a6794e7092a89067" + ], + "layout": "IPY_MODEL_1d8d427198a946e8a2f364662da03b9e" + } + }, + "2fb84661a76e49f0912e36917adea52e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_76ee2c7cf99e44d7b403a328c5c85357", + "placeholder": "​", + "style": "IPY_MODEL_92ffae8e6c1447f8aea99ffae371f053", + "value": "Generating train split: 100%" + } + }, + "13d21d9087824744a6056f867dc4ff11": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_496535fa240f4cdebac514965d928b23", + "max": 100000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_631c80e16bd24dd4861b5446e4fa3741", + "value": 100000 + } + }, + "418e3b94a5a34882a6794e7092a89067": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4856020cb14e471bab5619270d0d2dac", + "placeholder": "​", + "style": "IPY_MODEL_d2a6f7596d4343878a22f791613a3a34", + "value": " 100000/100000 [00:02<00:00, 45853.04 examples/s]" + } + }, + "1d8d427198a946e8a2f364662da03b9e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "76ee2c7cf99e44d7b403a328c5c85357": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "92ffae8e6c1447f8aea99ffae371f053": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "496535fa240f4cdebac514965d928b23": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "631c80e16bd24dd4861b5446e4fa3741": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4856020cb14e471bab5619270d0d2dac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d2a6f7596d4343878a22f791613a3a34": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f36a1f82456f457dbad01cb6b9d017fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_e77faea50b004da7bdc6023d39d651e7", + "IPY_MODEL_5f79747fb52b4fbabe01594958a0b2dd", + "IPY_MODEL_85a88eee278242438c435778fdec141b" + ], + "layout": "IPY_MODEL_1a5b89f465d547a8a7d2549fbdbdeb1b" + } + }, + "e77faea50b004da7bdc6023d39d651e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_af99ca2c778b41259998a8ac3f6026bb", + "placeholder": "​", + "style": "IPY_MODEL_79ab23a7e9dd4735aa91f862895191bd", + "value": "Unsloth: Standardizing formats (num_proc=6): 100%" + } + }, + "5f79747fb52b4fbabe01594958a0b2dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_ef5d97eb07744384a11a9b4b1ad85cca", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_524e543a3a79455885fd299bfaf789ac", + "value": 3000 + } + }, + "85a88eee278242438c435778fdec141b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b6180f25519d4334b257ea2801e8e071", + "placeholder": "​", + "style": "IPY_MODEL_9054b9d557404a5893f0cecd2d3c0f44", + "value": " 3000/3000 [00:01<00:00, 403.17 examples/s]" + } + }, + "1a5b89f465d547a8a7d2549fbdbdeb1b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "af99ca2c778b41259998a8ac3f6026bb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "79ab23a7e9dd4735aa91f862895191bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ef5d97eb07744384a11a9b4b1ad85cca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "524e543a3a79455885fd299bfaf789ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b6180f25519d4334b257ea2801e8e071": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "9054b9d557404a5893f0cecd2d3c0f44": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "fa62d625aa06430caf57fbe8ff872b43": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_34cb4d22bf9d41329551a1135ebfca63", + "IPY_MODEL_9258980fb6954200823889434a3e0a9a", + "IPY_MODEL_8f8f53d0aff74f288b505717d7e2d625" + ], + "layout": "IPY_MODEL_922fe3cc3d88403dbec0c94fae364f93" + } + }, + "34cb4d22bf9d41329551a1135ebfca63": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_de17d7225f1741aaa9a87e5689c2ada8", + "placeholder": "​", + "style": "IPY_MODEL_485e804c2a2b45b3a442219a9e73626c", + "value": "Map: 100%" + } + }, + "9258980fb6954200823889434a3e0a9a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_dd0dc8a4da3f4c5897f18bde720a91bc", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_49151c4db95340608bf237e85563fa2f", + "value": 3000 + } + }, + "8f8f53d0aff74f288b505717d7e2d625": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b5c0dae215dc437fba607f57f6720632", + "placeholder": "​", + "style": "IPY_MODEL_0ca6a8f22d404f5b808769600655e54d", + "value": " 3000/3000 [00:00<00:00, 10098.84 examples/s]" + } + }, + "922fe3cc3d88403dbec0c94fae364f93": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "de17d7225f1741aaa9a87e5689c2ada8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "485e804c2a2b45b3a442219a9e73626c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "dd0dc8a4da3f4c5897f18bde720a91bc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "49151c4db95340608bf237e85563fa2f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b5c0dae215dc437fba607f57f6720632": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0ca6a8f22d404f5b808769600655e54d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4f5e0be98f7b48b68f9e4d0b9bce31ee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_89193bbcf50742e3a40c98f6332a51ce", + "IPY_MODEL_6b1b3000713746a8a1e1309f3b319f3a", + "IPY_MODEL_3f108d33c1d14c1ea82c1cf4c5aba5a3" + ], + "layout": "IPY_MODEL_e89d6c56927640ddbbf956a3b6f7c951" + } + }, + "89193bbcf50742e3a40c98f6332a51ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_77c380ae4aa24032b80ecefced482997", + "placeholder": "​", + "style": "IPY_MODEL_3b4ebd09fa584e7a8a7f64841e4a3a22", + "value": "Unsloth: Tokenizing ["text"] (num_proc=6): 100%" + } + }, + "6b1b3000713746a8a1e1309f3b319f3a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_bc6abe2b4d0b435c9ffa066c41641971", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cd6e34ffab074155b6f6c84fad95b017", + "value": 3000 + } + }, + "3f108d33c1d14c1ea82c1cf4c5aba5a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_9372cb8b55424f679ed0a06820788cb5", + "placeholder": "​", + "style": "IPY_MODEL_573ce421fde44bb6b93677da04991e26", + "value": " 3000/3000 [00:44<00:00, 74.50 examples/s]" + } + }, + "e89d6c56927640ddbbf956a3b6f7c951": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "77c380ae4aa24032b80ecefced482997": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "3b4ebd09fa584e7a8a7f64841e4a3a22": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "bc6abe2b4d0b435c9ffa066c41641971": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cd6e34ffab074155b6f6c84fad95b017": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9372cb8b55424f679ed0a06820788cb5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "573ce421fde44bb6b93677da04991e26": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "89eb46be58fb46d4aca8d4677fea2153": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_5a1d006bc4d2400ca95af83ebb1b91a4", + "IPY_MODEL_bc044e548e744a5eb8f91a0dda213319", + "IPY_MODEL_ebcff7a00369403c82946a1f202d7309" + ], + "layout": "IPY_MODEL_9197f25e359946ec865c2caac52f44d2" + } + }, + "5a1d006bc4d2400ca95af83ebb1b91a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4cf29dfc85e84f8688c3f7b4b79c4a93", + "placeholder": "​", + "style": "IPY_MODEL_1654f87a636749118813f1bb4bdb9f66", + "value": "Map (num_proc=6): 100%" + } + }, + "bc044e548e744a5eb8f91a0dda213319": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_e3e2640addfd43718e3726f1aff5e44d", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_631772c3210f494a8eb39af885b7f9d6", + "value": 3000 + } + }, + "ebcff7a00369403c82946a1f202d7309": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_813aa6ed1133462ba9f69532341767db", + "placeholder": "​", + "style": "IPY_MODEL_6cd4a68cddfc43f9a2d7462198647468", + "value": " 3000/3000 [00:02<00:00, 2030.22 examples/s]" + } + }, + "9197f25e359946ec865c2caac52f44d2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4cf29dfc85e84f8688c3f7b4b79c4a93": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1654f87a636749118813f1bb4bdb9f66": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e3e2640addfd43718e3726f1aff5e44d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "631772c3210f494a8eb39af885b7f9d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "813aa6ed1133462ba9f69532341767db": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6cd4a68cddfc43f9a2d7462198647468": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3e5451c464e24d4d807ad3beefe977e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a44c8d07c6ab424e9a6fc02389f79d2c", + "IPY_MODEL_b3f1dfcd5af54cea900d4e441770dc1d", + "IPY_MODEL_328d934117dd45d99ba137ec7a85b320" + ], + "layout": "IPY_MODEL_28971c9285db4b86a478d96f98df6391" + } + }, + "a44c8d07c6ab424e9a6fc02389f79d2c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_338bccf244944b548ad33c657982d07f", + "placeholder": "​", + "style": "IPY_MODEL_d1b226a034d745b1a6e8bd5478aa558d", + "value": "Filter (num_proc=6): 100%" + } + }, + "b3f1dfcd5af54cea900d4e441770dc1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_64e3e0aa4153493fb99329f5533bbe56", + "max": 3000, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_badc246c049d40f79271d3a45a98e2e1", + "value": 3000 + } + }, + "328d934117dd45d99ba137ec7a85b320": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4630936a67fe483eb6f2d5cadac8f7d8", + "placeholder": "​", + "style": "IPY_MODEL_b4a031e444ad48ddae94b76986595995", + "value": " 3000/3000 [00:04<00:00, 602.46 examples/s]" + } + }, + "28971c9285db4b86a478d96f98df6391": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "338bccf244944b548ad33c657982d07f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d1b226a034d745b1a6e8bd5478aa558d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "64e3e0aa4153493fb99329f5533bbe56": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "badc246c049d40f79271d3a45a98e2e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4630936a67fe483eb6f2d5cadac8f7d8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b4a031e444ad48ddae94b76986595995": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Vision.ipynb b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Vision.ipynb new file mode 100644 index 0000000..b4ff3b6 --- /dev/null +++ b/tooling/fine-tuning/unsloth/notebooks/Gemma4_(E4B)-Vision.ipynb @@ -0,0 +1,5679 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "2vQXvnUUsTzI" + }, + "source": [ + "To run this, press \"*Runtime*\" and press \"*Run all*\" on a Google Colab L4 instance!\n", + "
\n", + "\n", + "\n", + " Join Discord if you need help + ⭐ Star us on Github ⭐\n", + "
\n", + "\n", + "To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme).\n", + "\n", + "You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7j01DfVgsTzJ" + }, + "source": [ + "### News" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6dT42nHksTzJ" + }, + "source": [ + "Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb)\n", + "\n", + "\n", + "\n", + "\n", + "
\"Unsloth
Train models — no code needed
\"Unsloth
Run GGUF models on Mac, Windows & Linux
\n", + "\n", + "Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe)\n", + "\n", + "Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context)\n", + "\n", + "New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning)\n", + "\n", + "Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K7fgQkATsTzK" + }, + "source": [ + "### Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "vA7IKFdUsTzK" + }, + "outputs": [], + "source": "%%capture\nimport os, re\nif \"COLAB_\" not in \"\".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r'[\\d]{1,}\\.[\\d]{1,}', str(torch.__version__)).group(0)\n xformers = 'xformers==' + {'2.10':'0.0.34','2.9':'0.0.33.post1','2.8':'0.0.32.post2'}.get(v, \"0.0.34\")\n !pip install sentencepiece protobuf \"datasets==4.3.0\" \"huggingface_hub>=0.34.0\" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "Mp4i13PHsTzK" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GFOEZbP7ONMs" + }, + "source": [ + "### Unsloth" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "QmUBVEnvCDJv", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 380, + "referenced_widgets": [ + "99bff77887c742b188878c8375844c00", + "69e590ac68fc4967b08d7b03f8d1029c", + "4a9ba035d1384ebe9c80163ac262e4e8", + "b24ef9781b824950bec1ec219867eee7", + "3a6e1f1e42cc4ef199c7d2f727f1077f", + "56bb57f481f3478cb724c8ba1f2b6cbe", + "cc4c86caf7c0411887432e63c5f7390e", + "123af53e4ce64b43ac0039ca8fd8c093", + "cc4c9812b7f74cde97abf1e2296913ad", + "b1a460f7070744e38f66bef5c8113442", + "e827a7825283426f80d9a1e1f86019a9", + "e9caa0bb6c3f4e69b32d74144283097d", + "b2dc300bcb304343a6e719211bfa16b5", + "bbc1086d0d8d44a68e8896bba354f67a", + "a8259ae181f94a7dbe728e4fbea13b50", + "56e6d46ada2748f79cddbb862e547475", + "247d66307c12403aa152e6afaa3fb772", + "2e205311dd6f46b78d6c7f0fac475d27", + "260ff38c4cd848b2948ecaea9abb2de3", + "d22d7e4650e443fe9ce1b84520c3894e", + "16373d8ce24c4be095e520fc2f063a81", + "51ec6a2c40dd46d385befe3e4cb32dce", + "7f0f2a4a7eda4176b544a876ca46aa0c", + "ca6772730e004e2ea6941ddd5e8965be", + "2798c261bb4a449da37c73d428aa750d", + "45927d38b34747a8969ff764a170a379", + "cb22f737eb1b4d429c9c9518f570fc93", + "738c3ace1bf64104ae3befe93d700da7", + "b75576ddcc674375b650e80d32f9fa41", + "4c714057645546e5820d31b2526952ea", + "6b474dc0a25b4b13ab021bf2410444aa", + "1f6feb3ff4bf41bfa77798588dd1a047", + "27dbf6293941491f883256f5b4459d8f", + "4a974128152b4403b5b7e56dcef91cf1", + "d77aa9e72d2d4597982e3ce7c8a12747", + "6f591057c35645288199e5be61eef098", + "d177d754f6184f5181725a174bfa6f59", + "bfaaf16915b24273b45e96e6ca41d3ed", + "0c3660a4769a4962b6f73a8d7012678b", + "812dec41c5bc40f2998564edefc32f48", + "9ab59d54123049eaac41b2ca3f69e8dd", + "3a1d8ef8f52647c1a050fd1e0d67e274", + "4c79283275d142c5af38f80004cd92cf", + "69138bb51f074fac972a2a9a1b13492f", + "13540698510845829fd4792cce58ae6e", + "a4d69faae483435e8221c908875ecb24", + "7b3f7e7018794b49859332e2ddb7b2d9", + "80b79b9be9e6449c90e0128e87a08c7f", + "6e2a733507bf40c78f2e1af4793bc7ae", + "aa16b740ad28497f8096e7e12237674e", + "0cb1d77cf7fe4f14ae87abf2fbd5e60f", + "f047301402d945fe81700ec820533cac", + "d889d44b9db54983b4b3c401a44a71f0", + "7645f6c36b524741a6f6e0958bb0ef00", + "b48f0117b8574fdeb20b215a949eb975", + "ee5cfb4e1026483e8af39bce3177d2bb", + "20d8eb28f98a4c819a18f4babe0ecd62", + "1b1406ea56b34090b49af6d0704553c8", + "0dc0d388e53e4b59ae99b5bf4b9ace5b", + "c817149cda9d4f089e073bcbe5eca9fb", + "ec0cd0c6725d4ceeaeb9c20be5e3e7cd", + "db5f4fdbf18345ebb272a6dfadcf7d61", + "2f8c6139246e44c5a2699ef58403d450", + "0a943edc0c0d4910b9c222ec26b4040f", + "7ae7c6205f4c4717bd2678ce309d4406", + "1ca73957b7ab4f08a4fa7a7144b0adc2", + "c8e3c78a0a5a4ecdb68edfd34bf5ba57", + "6be09e28388f41c684674d4e7ade2177", + "853884f9eb58491db1f6605a940a12b8", + "1801a1c03c3448da87284353ac0e3cc2", + "89fdbc7a3ff54f618cd73e3e687050f4", + "7521c7d02e4c4dc1b21fe062055f6e81", + "cc7710b22b1a4e16a4cfb1e588bc7f58", + "58c01f28e9c94c59aa9636f33de6ecac", + "4eb1db5ea16d4c7bbd9feadad505c5f4", + "57dd8104c01c43259d3b7b7998ef3393", + "022cc22ac0d6416e87d32a400656882f" + ] + }, + "outputId": "dbb6527a-1f29-4b7d-b338-7568d7a7ae00" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.4: Fast Gemma4 patching. Transformers: 5.5.0.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.34. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/16.0G [00:00\n", + "### Data Prep\n", + "We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions.\n", + "\n", + "You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "LjY75GoYUCB8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 177, + "referenced_widgets": [ + "5951a9e9c2e947c68add360a7dc5ce92", + "50b86bc5bc844b8eaad80cedd9fde48b", + "75f39de184674a5c9a1e5e91230d7c1b", + "473ad0b6598f4b7bb9a482fb43e5df9d", + "089308801ffd44d4a4910133252ac4ac", + "a699c8aa0ba1493f8acda292a7ed5baf", + "d97dc62af95d4724927c811b5d7e29ec", + "9fec8f47396045dd8db0098630bca7f9", + "decf15485d6b43b9bd9a8e2c0b716e05", + "ee418cb7012d410e9ac926454c0c07be", + "abd9f5c7c77646248fc205f392432130", + "4be36a52100f4428bdde5c677f97da30", + "9e7726767acd484ebae1afdd654a05a4", + "a31415c76913402189bc790b97a26c96", + "91d72c119af74d01ba75649e6a5373c0", + "ccae1e6a6d734ba8a10877f0e6f7ab62", + "45fba48641cf445fadc58d19b3f6c23e", + "50aef54f7eb74226a77cb441dfbe325c", + "c55cdf1c16094a1daf8d88c607fadde4", + "19a2453531bc4f6aaa93924719db78e6", + "caf7196689c34109b3533a1bb1848c8f", + "7ddcfb8760d54e9384cea9b194b54ff9", + "1a5cfa89e65b4d5eb4bad5b8384941d9", + "922e910c39484edab8e136d8cba096d6", + "a73435e48a8a455db79e8b0af1da8e30", + "d377ba70a4a34971b38dc3da00e14d8c", + "993adffff4014e6092d1ab58b7eb3785", + "76197bb01a7345398b587cac018af3c0", + "95014c93ccf84efb9920b90fab3280a4", + "6fd42b94fd344004874b5b30af23f735", + "0fedfdce9a5548e08523cd804bc52a89", + "791da49c566843a0931ff1fbf527ea15", + "ee6d087135cd45aeaecce5ead580e125", + "3507926c364e4d2492f44547e8be6026", + "5b63be53fc584f12bcf3f059c259fdda", + "9b3cc60d100c47a5bb6a5329ff154bdd", + "876479a04ab345f099c2302802fed738", + "93409d01a3de414baa8dfbacfd6fdb55", + "0fc1b9b7ebea4f2caf949042b361295d", + "5fb3a854d76f463bb11b56217da39fa5", + "3ca40ab02d8943bdb688392f971d2368", + "d83a9351bb084b6aa9f029163ef1347d", + "664e56863796493b8fb8978ac323ed58", + "74f0a74dc1474cd0b0ea13705665f903", + "49bae6aaa3fd4c2f9ae513c34a6224c4", + "1e420f9238664bfa8671c532c2a3cbc7", + "246458d1864d4bcebd0fd9ee8dffc9e9", + "3d93daa0c6e446e59b6fcd78a03c057e", + "72e9d3ea09714d1b868d70a85cc1732d", + "1ece85a4c59d4f52b737399c1f2751c7", + "a2e6128a027049a88094639640518b73", + "c9eab4588c46468f8a476936c7c69fa3", + "dedda5c9231042ba929049b41fbf1810", + "736b7e9afc8841ef81341d03934cb646", + "eefb235872ed4a858432d2abbc78e228" + ] + }, + "outputId": "ef8a166a-89f8-4d96-c179-f11766183203" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0%| | 0.00/519 [00:00" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUAAAAAyCAIAAACib5WDAAAYrUlEQVR4Ae3cebSuUx0HcCSFEBHKlNZCQi2zureMyTwrY2UeQlSaXNdQxjSSMltFSJF5bjCzDMuilUUUIjSKotLtc+83+z73eYd7znve877n3vXuP56zn/389m/av2FP75l10qRJswzKQAMDDcyYGphtxmS7P1wPgl1/9N4nqoZ77I/4TOvA3dU+bP/5z39mnXXWPtnSgGwfNGC4lf/+9799oD1kkjOnA1N6tD9kPUwHELbZZ5/9hRde+Oc//zkd0Ol9FgteffXVsR/apyfHTP6dCT3zzDP/+Mc/ZpttTPvImGauYxuh9BdffPHvf//7v/71r46RpCNPM5Zc7uijj37729/+ne98J9m4Y7Riwete9zpPKb1jJIOOo6qBjPinP/3pt7zlLddcc82///1vBjCqFDtHzhxnpsIraP/nP//5IossMvfcc3/5y18mHTfuWMZky0022YSKf/rTnwrJSHSMTd8//vGP55133qabbvr888/Dg9uOsQ06jpIG4sCvvPLKxhtvbNzFboS48SiRGwnamTADS25i5+abbz7PPPMYg85j2yyz8F7J/IYbbrjyyiu/8pWvwPmGN7xB/uwAp0HSy7xggw02uO2222688cbXv/71HeAZdOmBBpiQYoAuv/zy973vfccee+xf//pXa6gMYg8YGAaJkXj/WOub3HjVVVfxsb/85S+m0JasI2EyqVs4gNACmD8rI0Go+9/+9jcYllpqKalYZZCBR6LPUe2blHv77bdzp2OOOQatkUzlRonV2Yfh62MelDNImBxYsJxzzjlly66wbCrO8cRjyA3DSHCK6/POO6/JM+NQHwmqbvUl0RjhpFsSTRdPBnG6UovaIFdffXWQpk7TRdsXgJlnCk3XfEyMPPPMMw8++OA55pgj8XLkahUXIMmojxwbPCxj5Hi6hWG6dtwtQmMHD5GHKDWwTOLG1JBVNdmJAzNoCaSKZezUX375ZRqXMKeM0VDHqZf8D9F0esOSaCK3ZBrfG4pjgQojUYYYkU278DxE4N5L14kDE6mLGzBU0xXtWABT33e/+13PDTfc0DOq771O21MkbFJ6F91migqHp8Z0sTez8sorW94LK1qqnAeg2tL3urgc1TXlxCcATT+Vxixrv/SlL33xi18kcmymfJ0RK00cmFTkVFQoRUmLp0kpIR3STJw4EYB6bdSHpQJ94ZycJae971IolvEoLWGpFRUILS/NdtZbbz0w7R0YqqqNtsfciuJw2yPs/PPPb33umdfhIqnBFx3W1FgDa3wFjw1jqlLdrqdtwIW3kQxxI9HGFvxPMbfJ9la+ptEzzGhnDEa2OqbVrwB8AlBspqAqFYKAIReYPAvyAjPDVZo4sB0gCVZRIbCSFk8LSzJffPHFRx11VFXdnYlNiXBKAgoqBUmhWBYepSUsFchSMTYYlknOPvtswwNh+dSqAlWxUTCtMLfq3lk7S3388cfPPffcxx57zFM9cbAzbHoRHOe23J9++umXXnqpqsamOA2f2SN31fGCCy5Ya621jOl73vOeww47jDYwEyvXF8I//elPKto1NsWWRthEgTb2oHsbDPifYm6T7a1QSaNnJIr3/vjHP77++uvBBFv5Gj/0CUBTHw6HCRNO4J3nX3311Ysttli2poItmgHTJgQU9sZOZarKwpOROO200/785z+TiiRbb7219lxGIZvbEXvsscc555zzqU99yjavFqrvQBjIFR0///nP/+hHP1I/5ZRTHJozAght3N9///2sxwbghz70IWBarrvuOpaEpQ9/+MNrrrmmLo3G6uDXIY30izfjAb4Vb4z41FNP/dnPfrbffvtB+PGPf3y++ebbZpttxo8fr2MJHK26d9wOuSNl04TDDz/8d7/7nfqee+7ZMTYdyXjkkUf+5Cc/eec73/mLX/zC0Gy22Wa01CjCZI1PmvTkk0/+8pe/3GWXXfR985vfTN7vf//7H/vYx3JjIZzcddddAjTH/tWvfrXoooti8o1vfGNoBaA8jRcvEol23nnnueaaq7TXKm0Ggr1973vf+/3vf6+7Kclee+1lUsDfTj75ZPEI/o022shwE8ftl69//euXXnopKfQycG9605vKkGl817veteWWW7LJj370o0UDNQ7dw1lppZWeeuopA7HPPvuwE6xO1su0mqnxP6Zfw32epCI55wnHZ511ltDOJahVi+QmYwhd6txJF9qpdh96HRXAa6+9ttj/3HPPPfLIIwxF1MCAAeC6biyiwm4SSjzTgiVf0QVZJRdOEp4du/tkjKsApa6jXS5fP/GJTyDhvqtPv/nNb9T333//Wscg4WyChbH3tUa3oO19JSJLJjjHP1ZlVG7geBmTjXym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\n", + "image/jpeg": "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\n" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "source": [ + "dataset[2][\"image\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "lXjfJr4W6z8P", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "8cf867a2-2e4b-4d4c-9d4d-a790b17603df" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'H ^ { \\\\prime } = \\\\beta N \\\\int d \\\\lambda \\\\biggl \\\\{ \\\\frac { 1 } { 2 \\\\beta ^ { 2 } N ^ { 2 } } \\\\partial _ { \\\\lambda } \\\\zeta ^ { \\\\dagger } \\\\partial _ { \\\\lambda } \\\\zeta + V ( \\\\lambda ) \\\\zeta ^ { \\\\dagger } \\\\zeta \\\\biggr \\\\} \\\\ .'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "dataset[2][\"text\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rKHxfZua1CrS" + }, + "source": [ + "We can also render LaTeX directly in the browser!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "nPopsxAC1CrS", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "outputId": "6a4ef07a-7a3f-4c40-8f94-f7c892a6c0fe" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/latex": "$\\displaystyle \\sigma ^ { \\mu } \\frac { \\lambda ^ { a } } { 2 } A _ { \\mu } ^ { a } .$" + }, + "metadata": {} + } + ], + "source": [ + "from IPython.display import display, Math, Latex\n", + "\n", + "latex = dataset[3][\"text\"]\n", + "display(Math(latex))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K9CBpiISFa6C" + }, + "source": [ + "To format the dataset, all vision fine-tuning tasks should follow this format:\n", + "\n", + "```python\n", + "[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "oPXzJZzHEgXe" + }, + "outputs": [], + "source": [ + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "def convert_to_conversation(sample):\n", + " conversation = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": instruction},\n", + " {\"type\": \"image\", \"image\": sample[\"image\"]},\n", + " ],\n", + " },\n", + " {\"role\": \"assistant\", \"content\": [{\"type\": \"text\", \"text\": sample[\"text\"]}]},\n", + " ]\n", + " return {\"messages\": conversation}\n", + "pass" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FY-9u-OD6_gE" + }, + "source": [ + "Let's convert the dataset into the \"correct\" format for finetuning:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "gFW2qXIr7Ezy" + }, + "outputs": [], + "source": [ + "converted_dataset = [convert_to_conversation(sample) for sample in dataset]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ndDUB23CGAC5" + }, + "source": [ + "The first example is now structured like below:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "gGFzmplrEy9I", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0033ce5a-b6a2-4031-e333-febdc8ee37ff" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'messages': [{'role': 'user',\n", + " 'content': [{'type': 'text',\n", + " 'text': 'Write the LaTeX representation for this image.'},\n", + " {'type': 'image',\n", + " 'image': }]},\n", + " {'role': 'assistant',\n", + " 'content': [{'type': 'text',\n", + " 'text': '{ \\\\frac { N } { M } } \\\\in { \\\\bf Z } , { \\\\frac { M } { P } } \\\\in { \\\\bf Z } , { \\\\frac { P } { Q } } \\\\in { \\\\bf Z }'}]}]}" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ], + "source": [ + "converted_dataset[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MsRPBIb0JJ6c" + }, + "source": [ + "Lets take the Gemma 4 instruction chat template and use it in our base model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "exoDVEvmJN-6" + }, + "outputs": [], + "source": [ + "from unsloth import get_chat_template\n", + "\n", + "processor = get_chat_template(\n", + " processor,\n", + " \"gemma-4\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FecKS-dA82f5" + }, + "source": [ + "Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "vcat4UxA81vr", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1184ad38-de99-49bd-d623-48b0892e8daf" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "```latex\n", + "H' = \\beta N \\int d\\lambda \\left\\{ \\frac{1}{2\\beta^2 N^2} \\partial_\\lambda \\zeta^\\dagger \\partial_\\lambda \\zeta + V(\\lambda) \\zeta^\\dagger \\zeta \\right\\}\n", + "```\n" + ] + } + ], + "source": [ + "image = dataset[2][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FeAiMlQ71CrS" + }, + "source": [ + "You can see it's absolutely terrible! It doesn't follow instructions at all" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "idAEIeSQ3xdS" + }, + "source": [ + "\n", + "### Train the model\n", + "Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning!\n", + "\n", + "We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "95_Nn-89DhsL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ecdc9c7a-7177-45a5-cdee-77f06ec9842f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Model does not have a default image size - using 512\n" + ] + } + ], + "source": [ + "from unsloth.trainer import UnslothVisionDataCollator\n", + "from trl import SFTTrainer, SFTConfig\n", + "\n", + "trainer = SFTTrainer(\n", + " model = model,\n", + " train_dataset = converted_dataset,\n", + " processing_class = processor.tokenizer,\n", + " data_collator = UnslothVisionDataCollator(model, processor),\n", + " args = SFTConfig(\n", + " per_device_train_batch_size = 1,\n", + " gradient_accumulation_steps = 4,\n", + " max_grad_norm = 0.3,\n", + " warmup_ratio = 0.03,\n", + " max_steps = 60,\n", + " # num_train_epochs = 2, # Set this instead of max_steps for full training runs\n", + " learning_rate = 2e-4,\n", + " logging_steps = 1,\n", + " save_strategy = \"steps\",\n", + " optim = \"adamw_8bit\",\n", + " weight_decay = 0.001,\n", + " lr_scheduler_type = \"cosine\",\n", + " seed = 3407,\n", + " output_dir = \"outputs\",\n", + " report_to = \"none\", # For Weights and Biases or others\n", + "\n", + " # You MUST put the below items for vision finetuning:\n", + " remove_unused_columns = False,\n", + " dataset_text_field = \"\",\n", + " dataset_kwargs = {\"skip_prepare_dataset\": True},\n", + " max_length = 2048,\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "cellView": "form", + "id": "2ejIt2xSNKKp", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1e46dd33-1258-4978-abce-4a0cd70c28ab" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU = Tesla T4. Max memory = 14.563 GB.\n", + "10.182 GB of memory reserved.\n" + ] + } + ], + "source": [ + "# @title Show current memory stats\n", + "gpu_stats = torch.cuda.get_device_properties(0)\n", + "start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)\n", + "print(f\"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.\")\n", + "print(f\"{start_gpu_memory} GB of memory reserved.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "yqxqAZ7KJ4oL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "1611d77d-130b-4509-f49d-da4422a7a0e9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'bos_token_id': 2}.\n", + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 68,686 | Num Epochs = 1 | Total steps = 60\n", + "O^O/ \\_/ \\ Batch size per device = 1 | Gradient accumulation steps = 4\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (1 x 4 x 1) = 4\n", + " \"-____-\" Trainable parameters = 82,444,288 of 8,078,600,736 (1.02% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Unsloth: Will smartly offload gradients to save VRAM!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [60/60 05:25, Epoch 0/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
114.862482
215.983265
315.897610
416.153982
516.364323
612.335323
76.774734
85.239524
94.966103
103.271874
113.070101
122.938359
132.469718
142.040107
151.912474
162.391622
172.170793
181.760992
191.899228
201.493368
211.680966
221.567590
231.590823
241.522763
251.543306
261.648688
271.278674
281.528238
291.577930
301.366876
311.197964
321.834775
331.473532
341.572434
351.176874
361.155894
371.070827
381.249489
391.477776
401.618961
411.207805
420.868922
431.415766
441.279130
451.078420
461.076866
471.207423
481.021715
491.184945
501.114685
511.116125
521.270778
530.977663
541.013628
551.137954
561.791641
570.879617
581.045508
591.497848
601.182628

" + ] + }, + "metadata": {} + } + ], + "source": [ + "trainer_stats = trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellView": "form", + "id": "pCqnaKmlO1U9", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "308b4484-426c-4d82-b8b2-4f40918425d9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "353.8392 seconds used for training.\n", + "5.9 minutes used for training.\n", + "Peak reserved memory = 10.777 GB.\n", + "Peak reserved memory for training = 0.595 GB.\n", + "Peak reserved memory % of max memory = 74.003 %.\n", + "Peak reserved memory for training % of max memory = 4.086 %.\n" + ] + } + ], + "source": [ + "# @title Show final memory and time stats\n", + "used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)\n", + "used_memory_for_lora = round(used_memory - start_gpu_memory, 3)\n", + "used_percentage = round(used_memory / max_memory * 100, 3)\n", + "lora_percentage = round(used_memory_for_lora / max_memory * 100, 3)\n", + "print(f\"{trainer_stats.metrics['train_runtime']} seconds used for training.\")\n", + "print(\n", + " f\"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training.\"\n", + ")\n", + "print(f\"Peak reserved memory = {used_memory} GB.\")\n", + "print(f\"Peak reserved memory for training = {used_memory_for_lora} GB.\")\n", + "print(f\"Peak reserved memory % of max memory = {used_percentage} %.\")\n", + "print(f\"Peak reserved memory for training % of max memory = {lora_percentage} %.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ekOmTR1hSNcr" + }, + "source": [ + "\n", + "### Inference\n", + "Let's run the model! You can modify the instruction and input—just leave the output blank.\n", + "\n", + "We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "id": "kR3gIAX-SM2q", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "79616e26-3a56-41d0-8306-06889f63b9fc" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\\[\\left[[B_n^{\\pm}, b_2^{\\mp}], b_2^{\\pm}\\right] = nB_n^{\\pm}, \\quad \\left[[B_n^{\\mp}, b_2^{\\pm}], b_2^{\\mp}\\right] = nB_n^{\\mp}.\\]\n" + ] + } + ], + "source": [ + "image = dataset[10][\"image\"]\n", + "instruction = \"Write the LaTeX representation for this image.\"\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": instruction}],\n", + " }\n", + "]\n", + "\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor, skip_prompt = True)\n", + "result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uMuVrWbjAzhc" + }, + "source": [ + "\n", + "### Saving, loading finetuned models\n", + "To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage.\n", + "\n", + "**[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "id": "upcOlWe7A1vc", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "808a9a7d-0e26-4635-c918-41f0525310eb" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['gemma_4_lora/processor_config.json']" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ], + "source": [ + "model.save_pretrained(\"gemma_4_lora\") # Local saving\n", + "processor.save_pretrained(\"gemma_4_lora\")\n", + "# model.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving\n", + "# processor.push_to_hub(\"your_name/gemma_4_lora\", token = \"YOUR_HF_TOKEN\") # Online saving" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AEEcJ4qfC7Lp" + }, + "source": [ + "Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "id": "MKX_XKs_BNZR", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "5b7d5dfd-34b8-45e0-ef9e-1378d260fd7a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "This equation appears to be from a field of physics, likely **theoretical physics**, specifically **electrodynamics**, **gauge theories**, or **relativistic field theory**, given the use of Greek letters ($\\mu, \\alpha, \\beta$), tensor notation ($D^\\alpha_\\mu \\tilde{A}^\\alpha_\\mu$), and the structure of the equation.\n", + "\n", + "Here is a breakdown of the components and the likely physical meaning:\n", + "\n", + "### Breakdown of the Equation\n", + "\n", + "$$D^\\alpha_\\mu \\tilde{A}^\\alpha_\\mu = 0$$\n", + "\n", + "1. **$D^\\alpha_\\mu$ (Covariant Derivative or Differential\n" + ] + } + ], + "source": [ + "if False:\n", + " from unsloth import FastVisionModel\n", + "\n", + " model, processor = FastVisionModel.from_pretrained(\n", + " model_name = \"gemma_4_lora\", # YOUR MODEL YOU USED FOR TRAINING\n", + " load_in_4bit = True, # Set to False for 16bit LoRA\n", + " )\n", + "\n", + "sample = dataset[1]\n", + "image = sample[\"image\"].convert(\"RGB\")\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": sample[\"text\"],\n", + " },\n", + " {\n", + " \"type\": \"image\",\n", + " },\n", + " ],\n", + " },\n", + "]\n", + "input_text = processor.apply_chat_template(messages, add_generation_prompt = True)\n", + "inputs = processor(\n", + " image,\n", + " input_text,\n", + " add_special_tokens = False,\n", + " return_tensors = \"pt\",\n", + ").to(\"cuda\")\n", + "\n", + "from transformers import TextStreamer\n", + "\n", + "text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True)\n", + "_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,\n", + " use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f422JgM9sdVT" + }, + "source": [ + "### Saving to float16 for VLLM\n", + "\n", + "We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "id": "iHjt_SMYsd3P" + }, + "outputs": [], + "source": [ + "# Select ONLY 1 to save! (Both not needed!)\n", + "\n", + "# Save locally to 16bit\n", + "if False: model.save_pretrained_merged(\"unsloth_finetune\", processor,)\n", + "\n", + "# To export and save to your Hugging Face account\n", + "if False: model.push_to_hub_merged(\"YOUR_USERNAME/unsloth_finetune\", processor, token = \"YOUR_HF_TOKEN\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TSjNVDCYv-yr" + }, + "source": [ + "And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord!\n", + "\n", + "Some other resources:\n", + "1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb)\n", + "2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb)\n", + "3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb)\n", + "4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)!\n", + "\n", + "

\n", + " \n", + " \n", + " \n", + "\n", + " Join Discord if you need help + ⭐️ Star us on Github ⭐️\n", + "
\n", + "\n", + " This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme)." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.13.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "99bff77887c742b188878c8375844c00": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_69e590ac68fc4967b08d7b03f8d1029c", + "IPY_MODEL_4a9ba035d1384ebe9c80163ac262e4e8", + "IPY_MODEL_b24ef9781b824950bec1ec219867eee7" + ], + "layout": "IPY_MODEL_3a6e1f1e42cc4ef199c7d2f727f1077f" + } + }, + "69e590ac68fc4967b08d7b03f8d1029c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_56bb57f481f3478cb724c8ba1f2b6cbe", + "placeholder": "​", + "style": "IPY_MODEL_cc4c86caf7c0411887432e63c5f7390e", + "value": "model.safetensors: 100%" + } + }, + "4a9ba035d1384ebe9c80163ac262e4e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_123af53e4ce64b43ac0039ca8fd8c093", + "max": 15992595884, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cc4c9812b7f74cde97abf1e2296913ad", + "value": 15992595884 + } + }, + "b24ef9781b824950bec1ec219867eee7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_b1a460f7070744e38f66bef5c8113442", + "placeholder": "​", + "style": "IPY_MODEL_e827a7825283426f80d9a1e1f86019a9", + "value": " 16.0G/16.0G [06:05<00:00, 102MB/s]" + } + }, + "3a6e1f1e42cc4ef199c7d2f727f1077f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "56bb57f481f3478cb724c8ba1f2b6cbe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cc4c86caf7c0411887432e63c5f7390e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "123af53e4ce64b43ac0039ca8fd8c093": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cc4c9812b7f74cde97abf1e2296913ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "b1a460f7070744e38f66bef5c8113442": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "e827a7825283426f80d9a1e1f86019a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "e9caa0bb6c3f4e69b32d74144283097d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_b2dc300bcb304343a6e719211bfa16b5", + "IPY_MODEL_bbc1086d0d8d44a68e8896bba354f67a", + "IPY_MODEL_a8259ae181f94a7dbe728e4fbea13b50" + ], + "layout": "IPY_MODEL_56e6d46ada2748f79cddbb862e547475" + } + }, + "b2dc300bcb304343a6e719211bfa16b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_247d66307c12403aa152e6afaa3fb772", + "placeholder": "​", + "style": "IPY_MODEL_2e205311dd6f46b78d6c7f0fac475d27", + "value": "Loading weights: 100%" + } + }, + "bbc1086d0d8d44a68e8896bba354f67a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_260ff38c4cd848b2948ecaea9abb2de3", + "max": 2130, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d22d7e4650e443fe9ce1b84520c3894e", + "value": 2130 + } + }, + "a8259ae181f94a7dbe728e4fbea13b50": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_16373d8ce24c4be095e520fc2f063a81", + "placeholder": "​", + "style": "IPY_MODEL_51ec6a2c40dd46d385befe3e4cb32dce", + "value": " 2130/2130 [01:08<00:00, 488.54it/s]" + } + }, + "56e6d46ada2748f79cddbb862e547475": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "247d66307c12403aa152e6afaa3fb772": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "2e205311dd6f46b78d6c7f0fac475d27": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "260ff38c4cd848b2948ecaea9abb2de3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d22d7e4650e443fe9ce1b84520c3894e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "16373d8ce24c4be095e520fc2f063a81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "51ec6a2c40dd46d385befe3e4cb32dce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7f0f2a4a7eda4176b544a876ca46aa0c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_ca6772730e004e2ea6941ddd5e8965be", + "IPY_MODEL_2798c261bb4a449da37c73d428aa750d", + "IPY_MODEL_45927d38b34747a8969ff764a170a379" + ], + "layout": "IPY_MODEL_cb22f737eb1b4d429c9c9518f570fc93" + } + }, + "ca6772730e004e2ea6941ddd5e8965be": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_738c3ace1bf64104ae3befe93d700da7", + "placeholder": "​", + "style": "IPY_MODEL_b75576ddcc674375b650e80d32f9fa41", + "value": "generation_config.json: 100%" + } + }, + "2798c261bb4a449da37c73d428aa750d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_4c714057645546e5820d31b2526952ea", + "max": 208, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6b474dc0a25b4b13ab021bf2410444aa", + "value": 208 + } + }, + "45927d38b34747a8969ff764a170a379": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1f6feb3ff4bf41bfa77798588dd1a047", + "placeholder": "​", + "style": "IPY_MODEL_27dbf6293941491f883256f5b4459d8f", + "value": " 208/208 [00:00<00:00, 21.3kB/s]" + } + }, + "cb22f737eb1b4d429c9c9518f570fc93": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "738c3ace1bf64104ae3befe93d700da7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b75576ddcc674375b650e80d32f9fa41": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4c714057645546e5820d31b2526952ea": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "6b474dc0a25b4b13ab021bf2410444aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1f6feb3ff4bf41bfa77798588dd1a047": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "27dbf6293941491f883256f5b4459d8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4a974128152b4403b5b7e56dcef91cf1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_d77aa9e72d2d4597982e3ce7c8a12747", + "IPY_MODEL_6f591057c35645288199e5be61eef098", + "IPY_MODEL_d177d754f6184f5181725a174bfa6f59" + ], + "layout": "IPY_MODEL_bfaaf16915b24273b45e96e6ca41d3ed" + } + }, + "d77aa9e72d2d4597982e3ce7c8a12747": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0c3660a4769a4962b6f73a8d7012678b", + "placeholder": "​", + "style": "IPY_MODEL_812dec41c5bc40f2998564edefc32f48", + "value": "processor_config.json: " + } + }, + "6f591057c35645288199e5be61eef098": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_9ab59d54123049eaac41b2ca3f69e8dd", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_3a1d8ef8f52647c1a050fd1e0d67e274", + "value": 1 + } + }, + "d177d754f6184f5181725a174bfa6f59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_4c79283275d142c5af38f80004cd92cf", + "placeholder": "​", + "style": "IPY_MODEL_69138bb51f074fac972a2a9a1b13492f", + "value": " 1.69k/? [00:00<00:00, 79.5kB/s]" + } + }, + "bfaaf16915b24273b45e96e6ca41d3ed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0c3660a4769a4962b6f73a8d7012678b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "812dec41c5bc40f2998564edefc32f48": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9ab59d54123049eaac41b2ca3f69e8dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "3a1d8ef8f52647c1a050fd1e0d67e274": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4c79283275d142c5af38f80004cd92cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "69138bb51f074fac972a2a9a1b13492f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "13540698510845829fd4792cce58ae6e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_a4d69faae483435e8221c908875ecb24", + "IPY_MODEL_7b3f7e7018794b49859332e2ddb7b2d9", + "IPY_MODEL_80b79b9be9e6449c90e0128e87a08c7f" + ], + "layout": "IPY_MODEL_6e2a733507bf40c78f2e1af4793bc7ae" + } + }, + "a4d69faae483435e8221c908875ecb24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_aa16b740ad28497f8096e7e12237674e", + "placeholder": "​", + "style": "IPY_MODEL_0cb1d77cf7fe4f14ae87abf2fbd5e60f", + "value": "chat_template.jinja: " + } + }, + "7b3f7e7018794b49859332e2ddb7b2d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_f047301402d945fe81700ec820533cac", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d889d44b9db54983b4b3c401a44a71f0", + "value": 1 + } + }, + "80b79b9be9e6449c90e0128e87a08c7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7645f6c36b524741a6f6e0958bb0ef00", + "placeholder": "​", + "style": "IPY_MODEL_b48f0117b8574fdeb20b215a949eb975", + "value": " 11.9k/? [00:00<00:00, 705kB/s]" + } + }, + "6e2a733507bf40c78f2e1af4793bc7ae": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "aa16b740ad28497f8096e7e12237674e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0cb1d77cf7fe4f14ae87abf2fbd5e60f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "f047301402d945fe81700ec820533cac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "d889d44b9db54983b4b3c401a44a71f0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7645f6c36b524741a6f6e0958bb0ef00": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "b48f0117b8574fdeb20b215a949eb975": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ee5cfb4e1026483e8af39bce3177d2bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_20d8eb28f98a4c819a18f4babe0ecd62", + "IPY_MODEL_1b1406ea56b34090b49af6d0704553c8", + "IPY_MODEL_0dc0d388e53e4b59ae99b5bf4b9ace5b" + ], + "layout": "IPY_MODEL_c817149cda9d4f089e073bcbe5eca9fb" + } + }, + "20d8eb28f98a4c819a18f4babe0ecd62": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ec0cd0c6725d4ceeaeb9c20be5e3e7cd", + "placeholder": "​", + "style": "IPY_MODEL_db5f4fdbf18345ebb272a6dfadcf7d61", + "value": "tokenizer_config.json: " + } + }, + "1b1406ea56b34090b49af6d0704553c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_2f8c6139246e44c5a2699ef58403d450", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0a943edc0c0d4910b9c222ec26b4040f", + "value": 1 + } + }, + "0dc0d388e53e4b59ae99b5bf4b9ace5b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7ae7c6205f4c4717bd2678ce309d4406", + "placeholder": "​", + "style": "IPY_MODEL_1ca73957b7ab4f08a4fa7a7144b0adc2", + "value": " 14.9k/? [00:00<00:00, 1.15MB/s]" + } + }, + "c817149cda9d4f089e073bcbe5eca9fb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ec0cd0c6725d4ceeaeb9c20be5e3e7cd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "db5f4fdbf18345ebb272a6dfadcf7d61": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "2f8c6139246e44c5a2699ef58403d450": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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": "20px" + } + }, + "0a943edc0c0d4910b9c222ec26b4040f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "7ae7c6205f4c4717bd2678ce309d4406": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1ca73957b7ab4f08a4fa7a7144b0adc2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c8e3c78a0a5a4ecdb68edfd34bf5ba57": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_6be09e28388f41c684674d4e7ade2177", + "IPY_MODEL_853884f9eb58491db1f6605a940a12b8", + "IPY_MODEL_1801a1c03c3448da87284353ac0e3cc2" + ], + "layout": "IPY_MODEL_89fdbc7a3ff54f618cd73e3e687050f4" + } + }, + "6be09e28388f41c684674d4e7ade2177": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_7521c7d02e4c4dc1b21fe062055f6e81", + "placeholder": "​", + "style": "IPY_MODEL_cc7710b22b1a4e16a4cfb1e588bc7f58", + "value": "tokenizer.json: 100%" + } + }, + "853884f9eb58491db1f6605a940a12b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_58c01f28e9c94c59aa9636f33de6ecac", + "max": 32169626, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4eb1db5ea16d4c7bbd9feadad505c5f4", + "value": 32169626 + } + }, + "1801a1c03c3448da87284353ac0e3cc2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_57dd8104c01c43259d3b7b7998ef3393", + "placeholder": "​", + "style": "IPY_MODEL_022cc22ac0d6416e87d32a400656882f", + "value": " 32.2M/32.2M [00:00<00:00, 161MB/s]" + } + }, + "89fdbc7a3ff54f618cd73e3e687050f4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7521c7d02e4c4dc1b21fe062055f6e81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "cc7710b22b1a4e16a4cfb1e588bc7f58": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "58c01f28e9c94c59aa9636f33de6ecac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "4eb1db5ea16d4c7bbd9feadad505c5f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "57dd8104c01c43259d3b7b7998ef3393": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "022cc22ac0d6416e87d32a400656882f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "5951a9e9c2e947c68add360a7dc5ce92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_50b86bc5bc844b8eaad80cedd9fde48b", + "IPY_MODEL_75f39de184674a5c9a1e5e91230d7c1b", + "IPY_MODEL_473ad0b6598f4b7bb9a482fb43e5df9d" + ], + "layout": "IPY_MODEL_089308801ffd44d4a4910133252ac4ac" + } + }, + "50b86bc5bc844b8eaad80cedd9fde48b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_a699c8aa0ba1493f8acda292a7ed5baf", + "placeholder": "​", + "style": "IPY_MODEL_d97dc62af95d4724927c811b5d7e29ec", + "value": "README.md: 100%" + } + }, + "75f39de184674a5c9a1e5e91230d7c1b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_9fec8f47396045dd8db0098630bca7f9", + "max": 519, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_decf15485d6b43b9bd9a8e2c0b716e05", + "value": 519 + } + }, + "473ad0b6598f4b7bb9a482fb43e5df9d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_ee418cb7012d410e9ac926454c0c07be", + "placeholder": "​", + "style": "IPY_MODEL_abd9f5c7c77646248fc205f392432130", + "value": " 519/519 [00:00<00:00, 44.5kB/s]" + } + }, + "089308801ffd44d4a4910133252ac4ac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a699c8aa0ba1493f8acda292a7ed5baf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d97dc62af95d4724927c811b5d7e29ec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "9fec8f47396045dd8db0098630bca7f9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "decf15485d6b43b9bd9a8e2c0b716e05": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "ee418cb7012d410e9ac926454c0c07be": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "abd9f5c7c77646248fc205f392432130": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "4be36a52100f4428bdde5c677f97da30": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_9e7726767acd484ebae1afdd654a05a4", + "IPY_MODEL_a31415c76913402189bc790b97a26c96", + "IPY_MODEL_91d72c119af74d01ba75649e6a5373c0" + ], + "layout": "IPY_MODEL_ccae1e6a6d734ba8a10877f0e6f7ab62" + } + }, + "9e7726767acd484ebae1afdd654a05a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_45fba48641cf445fadc58d19b3f6c23e", + "placeholder": "​", + "style": "IPY_MODEL_50aef54f7eb74226a77cb441dfbe325c", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "a31415c76913402189bc790b97a26c96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c55cdf1c16094a1daf8d88c607fadde4", + "max": 343805431, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_19a2453531bc4f6aaa93924719db78e6", + "value": 343805431 + } + }, + "91d72c119af74d01ba75649e6a5373c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_caf7196689c34109b3533a1bb1848c8f", + "placeholder": "​", + "style": "IPY_MODEL_7ddcfb8760d54e9384cea9b194b54ff9", + "value": " 344M/344M [00:04<00:00, 95.2MB/s]" + } + }, + "ccae1e6a6d734ba8a10877f0e6f7ab62": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "45fba48641cf445fadc58d19b3f6c23e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "50aef54f7eb74226a77cb441dfbe325c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c55cdf1c16094a1daf8d88c607fadde4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "19a2453531bc4f6aaa93924719db78e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "caf7196689c34109b3533a1bb1848c8f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "7ddcfb8760d54e9384cea9b194b54ff9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "1a5cfa89e65b4d5eb4bad5b8384941d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_922e910c39484edab8e136d8cba096d6", + "IPY_MODEL_a73435e48a8a455db79e8b0af1da8e30", + "IPY_MODEL_d377ba70a4a34971b38dc3da00e14d8c" + ], + "layout": "IPY_MODEL_993adffff4014e6092d1ab58b7eb3785" + } + }, + "922e910c39484edab8e136d8cba096d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_76197bb01a7345398b587cac018af3c0", + "placeholder": "​", + "style": "IPY_MODEL_95014c93ccf84efb9920b90fab3280a4", + "value": "data/test-00000-of-00001.parquet: 100%" + } + }, + "a73435e48a8a455db79e8b0af1da8e30": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_6fd42b94fd344004874b5b30af23f735", + "max": 38205016, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0fedfdce9a5548e08523cd804bc52a89", + "value": 38205016 + } + }, + "d377ba70a4a34971b38dc3da00e14d8c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_791da49c566843a0931ff1fbf527ea15", + "placeholder": "​", + "style": "IPY_MODEL_ee6d087135cd45aeaecce5ead580e125", + "value": " 38.2M/38.2M [00:00<00:00, 191MB/s]" + } + }, + "993adffff4014e6092d1ab58b7eb3785": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "76197bb01a7345398b587cac018af3c0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "95014c93ccf84efb9920b90fab3280a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "6fd42b94fd344004874b5b30af23f735": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0fedfdce9a5548e08523cd804bc52a89": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "791da49c566843a0931ff1fbf527ea15": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "ee6d087135cd45aeaecce5ead580e125": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3507926c364e4d2492f44547e8be6026": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_5b63be53fc584f12bcf3f059c259fdda", + "IPY_MODEL_9b3cc60d100c47a5bb6a5329ff154bdd", + "IPY_MODEL_876479a04ab345f099c2302802fed738" + ], + "layout": "IPY_MODEL_93409d01a3de414baa8dfbacfd6fdb55" + } + }, + "5b63be53fc584f12bcf3f059c259fdda": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_0fc1b9b7ebea4f2caf949042b361295d", + "placeholder": "​", + "style": "IPY_MODEL_5fb3a854d76f463bb11b56217da39fa5", + "value": "Generating train split: 100%" + } + }, + "9b3cc60d100c47a5bb6a5329ff154bdd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_3ca40ab02d8943bdb688392f971d2368", + "max": 68686, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d83a9351bb084b6aa9f029163ef1347d", + "value": 68686 + } + }, + "876479a04ab345f099c2302802fed738": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_664e56863796493b8fb8978ac323ed58", + "placeholder": "​", + "style": "IPY_MODEL_74f0a74dc1474cd0b0ea13705665f903", + "value": " 68686/68686 [00:01<00:00, 41332.68 examples/s]" + } + }, + "93409d01a3de414baa8dfbacfd6fdb55": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "0fc1b9b7ebea4f2caf949042b361295d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "5fb3a854d76f463bb11b56217da39fa5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "3ca40ab02d8943bdb688392f971d2368": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "d83a9351bb084b6aa9f029163ef1347d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "664e56863796493b8fb8978ac323ed58": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "74f0a74dc1474cd0b0ea13705665f903": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "49bae6aaa3fd4c2f9ae513c34a6224c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "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_1e420f9238664bfa8671c532c2a3cbc7", + "IPY_MODEL_246458d1864d4bcebd0fd9ee8dffc9e9", + "IPY_MODEL_3d93daa0c6e446e59b6fcd78a03c057e" + ], + "layout": "IPY_MODEL_72e9d3ea09714d1b868d70a85cc1732d" + } + }, + "1e420f9238664bfa8671c532c2a3cbc7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_1ece85a4c59d4f52b737399c1f2751c7", + "placeholder": "​", + "style": "IPY_MODEL_a2e6128a027049a88094639640518b73", + "value": "Generating test split: 100%" + } + }, + "246458d1864d4bcebd0fd9ee8dffc9e9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "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_c9eab4588c46468f8a476936c7c69fa3", + "max": 7632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dedda5c9231042ba929049b41fbf1810", + "value": 7632 + } + }, + "3d93daa0c6e446e59b6fcd78a03c057e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "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_736b7e9afc8841ef81341d03934cb646", + "placeholder": "​", + "style": "IPY_MODEL_eefb235872ed4a858432d2abbc78e228", + "value": " 7632/7632 [00:01<00:00, 5407.71 examples/s]" + } + }, + "72e9d3ea09714d1b868d70a85cc1732d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "1ece85a4c59d4f52b737399c1f2751c7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "a2e6128a027049a88094639640518b73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "c9eab4588c46468f8a476936c7c69fa3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "dedda5c9231042ba929049b41fbf1810": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "736b7e9afc8841ef81341d03934cb646": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "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 + } + }, + "eefb235872ed4a858432d2abbc78e228": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "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": "" + } + }, + "state": {} + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Text.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Text.py new file mode 100644 index 0000000..9a25fe5 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Text.py @@ -0,0 +1,512 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab A100 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-26B-A4B-it", + dtype = None, # None for auto detection + max_seq_length = 8192, # Choose any for long context! + load_in_4bit = True, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + use_cache = True, + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), + ) + + +# # Gemma 4 can see images! +# +# Alt text + +# In[5]: + + +sloth_link = "https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg" + +messages = [{ + "role" : "user", + "content": [ + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "Which films does this animal feature in?" } + ] +}] +# You might have to wait 1 minute for Unsloth's auto compiler +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# Let's make a poem about sloths! + +# In[6]: + + +messages = [{ + "role": "user", + "content": [{ "type" : "text", + "text" : "Write a poem about sloths." }] +}] +do_gemma_4_inference(messages) + + +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well! + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[7]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # Turn off for just text! + finetune_language_layers = True, # Should leave on! + finetune_attention_modules = True, # Attention good for GRPO + finetune_mlp_modules = True, # Should leave on always! + + r = 8, # Larger = higher accuracy, but might overfit + lora_alpha = 8, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, +) + + +# +# ### Data Prep +# We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below: +# +# ``` +# <|turn>user +# Hello +# <|turn>model +# Hey there! +# ``` +# We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more. + +# In[8]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4-thinking", +) + + +# We get the first 3000 rows of the dataset + +# In[9]: + + +from datasets import load_dataset +dataset = load_dataset("mlabonne/FineTome-100k", split = "train[:3000]") + + +# We now use `standardize_data_formats` to try converting datasets to the correct format for finetuning purposes! + +# In[10]: + + +from unsloth.chat_templates import standardize_data_formats +dataset = standardize_data_formats(dataset) + + +# Let's see how row 100 looks like! + +# In[11]: + + +dataset[100] + + +# We now have to apply the chat template for `Gemma-3` onto the conversations, and save it to `text`. We remove the `` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one. + +# In[12]: + + +def formatting_prompts_func(examples): + convos = examples["conversations"] + texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False).removeprefix('') for convo in convos] + return { "text" : texts, } + +dataset = dataset.map(formatting_prompts_func, batched = True) + + +# Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one. + +# In[13]: + + +dataset[100]["text"] + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[14]: + + +from trl import SFTTrainer, SFTConfig +trainer = SFTTrainer( + model = model, + tokenizer = tokenizer, + train_dataset = dataset, + eval_dataset = None, # Can set up evaluation! + args = SFTConfig( + dataset_text_field = "text", + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, # Use GA to mimic batch size! + warmup_steps = 5, + # num_train_epochs = 1, # Set this for 1 full training run. + max_steps = 60, + learning_rate = 2e-4, # Reduce to 2e-5 for long training runs + logging_steps = 1, + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "linear", + seed = 3407, + report_to = "none", # Use TrackIO/WandB etc + ), +) + + +# We also use Unsloth's `train_on_completions` method to only train on the assistant outputs and ignore the loss on the user's inputs. This helps increase accuracy of finetunes! + +# In[15]: + + +from unsloth.chat_templates import train_on_responses_only +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) + + +# Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected! + +# In[16]: + + +tokenizer.decode(trainer.train_dataset[100]["input_ids"]) + + +# Now let's print the masked out example - you should see only the answer is present: + +# In[17]: + + +tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100]["labels"]]).replace(tokenizer.pad_token, " ") + + +# In[18]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[19]: + + +trainer_stats = trainer.train() + + +# In[20]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-3` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[21]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4-thinking", +) +messages = [{ + "role": "user", + "content": [{ + "type" : "text", + "text" : "Continue the sequence: 1, 1, 2, 3, 5, 8,", + }] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") +outputs = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + use_cache = True, + # Recommended Gemma-3 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, +) +tokenizer.batch_decode(outputs) + + +# You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time! + +# In[22]: + + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "Why is the sky blue?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + use_cache = True, + # Recommended Gemma-3 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[23]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# tokenizer.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[24]: + + +if False: + from unsloth import FastModel + model, tokenizer = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + # Recommended Gemma-3 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[25]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4-finetune", tokenizer) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[26]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", tokenizer, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[27]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[28]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Vision.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Vision.py new file mode 100644 index 0000000..f843358 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(26B_A4B)-Vision.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab A100 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth + +# In[3]: + + +from unsloth import FastVisionModel # FastLanguageModel for LLMs +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastVisionModel.from_pretrained( + "unsloth/gemma-4-26B-A4B-it", + load_in_4bit = True, # Use 4bit to reduce memory use. False for 16bit LoRA. + use_gradient_checkpointing = "unsloth", # True or "unsloth" for long context +) + + +# We now add LoRA adapters for parameter efficient fine-tuning, allowing us to train only 1% of all model parameters efficiently. +# +# **[NEW]** We also support fine-tuning only the vision component, only the language component, or both. Additionally, you can choose to fine-tune the attention modules, the MLP layers, or both! + +# In[4]: + + +model = FastVisionModel.get_peft_model( + model, + finetune_vision_layers = True, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 32, # The larger, the higher the accuracy, but might overfit + lora_alpha = 32, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = "all-linear", # Optional now! Can specify a list if needed +) + + +# +# ### Data Prep +# We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions. +# +# You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR). + +# In[5]: + + +from datasets import load_dataset +dataset = load_dataset("unsloth/LaTeX_OCR", split = "train") + + +# Let's take an overview of the dataset. We'll examine the second image and its corresponding caption. + +# In[6]: + + +dataset + + +# In[7]: + + +dataset[2]["image"] + + +# In[8]: + + +dataset[2]["text"] + + +# We can also render LaTeX directly in the browser! + +# In[9]: + + +from IPython.display import display, Math, Latex + +latex = dataset[3]["text"] +display(Math(latex)) + + +# To format the dataset, all vision fine-tuning tasks should follow this format: +# +# ```python +# [ +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# ] +# ``` + +# In[10]: + + +instruction = "Write the LaTeX representation for this image." + +def convert_to_conversation(sample): + conversation = [ + { + "role": "user", + "content": [ + {"type": "text", "text": instruction}, + {"type": "image", "image": sample["image"]}, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": sample["text"]}]}, + ] + return {"messages": conversation} +pass + + +# Let's convert the dataset into the "correct" format for finetuning: + +# In[11]: + + +converted_dataset = [convert_to_conversation(sample) for sample in dataset] + + +# The first example is now structured like below: + +# In[12]: + + +converted_dataset[0] + + +# Lets take the Gemma 4 instruction chat template and use it in our base model + +# In[13]: + + +from unsloth import get_chat_template + +processor = get_chat_template( + processor, + "gemma-4-thinking" +) + + +# Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before. + +# In[14]: + + +image = dataset[2]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# You can see it's absolutely terrible! It doesn't follow instructions at all + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning! +# +# We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup. + +# In[15]: + + +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = converted_dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, + max_grad_norm = 0.3, + warmup_ratio = 0.03, + max_steps = 60, + # num_train_epochs = 2, # Set this instead of max_steps for full training runs + learning_rate = 2e-4, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", # For Weights and Biases or others + + # You MUST put the below items for vision finetuning: + remove_unused_columns = False, + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 2048, + ) +) + + +# In[16]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# In[17]: + + +trainer_stats = trainer.train() + + +# In[18]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model! You can modify the instruction and input—just leave the output blank. +# +# We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`. + +# In[19]: + + +image = dataset[10]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] + +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) + +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[20]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[21]: + + +if False: + from unsloth import FastVisionModel + + model, processor = FastVisionModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + load_in_4bit = True, # Set to False for 16bit LoRA + ) + +sample = dataset[1] +image = sample["image"].convert("RGB") +messages = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": sample["text"], + }, + { + "type": "image", + }, + ], + }, +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True) +_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[22]: + + +# Select ONLY 1 to save! (Both not needed!) + +# Save locally to 16bit +if False: model.save_pretrained_merged("unsloth_finetune", processor,) + +# To export and save to your Hugging Face account +if False: model.push_to_hub_merged("YOUR_USERNAME/unsloth_finetune", processor, token = "YOUR_HF_TOKEN") + + +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Text.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Text.py new file mode 100644 index 0000000..def34c6 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Text.py @@ -0,0 +1,513 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab A100 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-31B-it", + dtype = None, # None for auto detection + max_seq_length = 8192, # Choose any for long context! + load_in_4bit = True, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + use_cache = True, + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), + ) + + +# # Gemma 4 can see images! +# +# Alt text + +# In[5]: + + +sloth_link = "https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg" + +messages = [{ + "role" : "user", + "content": [ + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "Which films does this animal feature in?" } + ] +}] +# You might have to wait 1 minute for Unsloth's auto compiler +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# Let's make a poem about sloths! + +# In[6]: + + +messages = [{ + "role": "user", + "content": [{ "type" : "text", + "text" : "Write a poem about sloths." }] +}] +do_gemma_4_inference(messages) + + +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well! + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[7]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # Turn off for just text! + finetune_language_layers = True, # Should leave on! + finetune_attention_modules = True, # Attention good for GRPO + finetune_mlp_modules = True, # Should leave on always! + + r = 8, # Larger = higher accuracy, but might overfit + lora_alpha = 8, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, +) + + +# +# ### Data Prep +# We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below: +# +# ``` +# <|turn>user +# Hello +# <|turn>model +# Hey there! +# ``` +# We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more. + +# In[8]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4-thinking", +) + + +# We get the first 3000 rows of the dataset + +# In[9]: + + +from datasets import load_dataset +dataset = load_dataset("mlabonne/FineTome-100k", split = "train[:3000]") + + +# We now use `standardize_data_formats` to try converting datasets to the correct format for finetuning purposes! + +# In[10]: + + +from unsloth.chat_templates import standardize_data_formats +dataset = standardize_data_formats(dataset) + + +# Let's see how row 100 looks like! + +# In[11]: + + +dataset[100] + + +# We now have to apply the chat template for `Gemma-4` onto the conversations, and save it to `text`. We remove the `` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one. + +# In[12]: + + +def formatting_prompts_func(examples): + convos = examples["conversations"] + texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False).removeprefix('') for convo in convos] + return { "text" : texts, } + +dataset = dataset.map(formatting_prompts_func, batched = True) + + +# Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one. + +# In[13]: + + +dataset[100]["text"] + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[14]: + + +from trl import SFTTrainer, SFTConfig +trainer = SFTTrainer( + model = model, + tokenizer = tokenizer, + train_dataset = dataset, + eval_dataset = None, # Can set up evaluation! + args = SFTConfig( + dataset_text_field = "text", + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, # Use GA to mimic batch size! + warmup_steps = 5, + # num_train_epochs = 1, # Set this for 1 full training run. + max_steps = 60, + learning_rate = 2e-4, # Reduce to 2e-5 for long training runs + logging_steps = 1, + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "linear", + seed = 3407, + report_to = "none", # Use TrackIO/WandB etc + ), +) + + +# We also use Unsloth's `train_on_completions` method to only train on the assistant outputs and ignore the loss on the user's inputs. This helps increase accuracy of finetunes! + +# In[15]: + + +from unsloth.chat_templates import train_on_responses_only +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) + + +# Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected! + +# In[16]: + + +tokenizer.decode(trainer.train_dataset[100]["input_ids"]) + + +# Now let's print the masked out example - you should see only the answer is present: + +# In[17]: + + +tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100]["labels"]]).replace(tokenizer.pad_token, " ") + + +# In[18]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[19]: + + +trainer_stats = trainer.train() + + +# In[20]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[21]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4-thinking", +) +messages = [{ + "role": "user", + "content": [{ + "type" : "text", + "text" : "Continue the sequence: 1, 1, 2, 3, 5, 8,", + }] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") +outputs = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + use_cache = True, + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, +) +tokenizer.batch_decode(outputs) + + +# You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time! + +# In[22]: + + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "Why is the sky blue?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + use_cache = True, + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[23]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# tokenizer.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[24]: + + +if False: + from unsloth import FastModel + model, tokenizer = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + use_cache = True, + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[25]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4-finetune", tokenizer) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[26]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", tokenizer, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[27]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[28]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Vision.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Vision.py new file mode 100644 index 0000000..6f46b05 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(31B)-Vision.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab A100 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth + +# In[3]: + + +from unsloth import FastVisionModel # FastLanguageModel for LLMs +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastVisionModel.from_pretrained( + "unsloth/gemma-4-31B-it", + load_in_4bit = True, # Use 4bit to reduce memory use. False for 16bit LoRA. + use_gradient_checkpointing = "unsloth", # True or "unsloth" for long context +) + + +# We now add LoRA adapters for parameter efficient fine-tuning, allowing us to train only 1% of all model parameters efficiently. +# +# **[NEW]** We also support fine-tuning only the vision component, only the language component, or both. Additionally, you can choose to fine-tune the attention modules, the MLP layers, or both! + +# In[4]: + + +model = FastVisionModel.get_peft_model( + model, + finetune_vision_layers = True, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 32, # The larger, the higher the accuracy, but might overfit + lora_alpha = 32, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = "all-linear", # Optional now! Can specify a list if needed +) + + +# +# ### Data Prep +# We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions. +# +# You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR). + +# In[5]: + + +from datasets import load_dataset +dataset = load_dataset("unsloth/LaTeX_OCR", split = "train") + + +# Let's take an overview of the dataset. We'll examine the second image and its corresponding caption. + +# In[6]: + + +dataset + + +# In[7]: + + +dataset[2]["image"] + + +# In[8]: + + +dataset[2]["text"] + + +# We can also render LaTeX directly in the browser! + +# In[9]: + + +from IPython.display import display, Math, Latex + +latex = dataset[3]["text"] +display(Math(latex)) + + +# To format the dataset, all vision fine-tuning tasks should follow this format: +# +# ```python +# [ +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# ] +# ``` + +# In[10]: + + +instruction = "Write the LaTeX representation for this image." + +def convert_to_conversation(sample): + conversation = [ + { + "role": "user", + "content": [ + {"type": "text", "text": instruction}, + {"type": "image", "image": sample["image"]}, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": sample["text"]}]}, + ] + return {"messages": conversation} +pass + + +# Let's convert the dataset into the "correct" format for finetuning: + +# In[11]: + + +converted_dataset = [convert_to_conversation(sample) for sample in dataset] + + +# The first example is now structured like below: + +# In[12]: + + +converted_dataset[0] + + +# Lets take the Gemma 4 instruction chat template and use it in our base model + +# In[13]: + + +from unsloth import get_chat_template + +processor = get_chat_template( + processor, + "gemma-4-thinking" +) + + +# Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before. + +# In[14]: + + +image = dataset[2]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# You can see it's absolutely terrible! It doesn't follow instructions at all + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning! +# +# We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup. + +# In[15]: + + +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = converted_dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, + max_grad_norm = 0.3, + warmup_ratio = 0.03, + max_steps = 60, + # num_train_epochs = 2, # Set this instead of max_steps for full training runs + learning_rate = 2e-4, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", # For Weights and Biases or others + + # You MUST put the below items for vision finetuning: + remove_unused_columns = False, + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 2048, + ) +) + + +# In[16]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# In[17]: + + +trainer_stats = trainer.train() + + +# In[18]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model! You can modify the instruction and input—just leave the output blank. +# +# We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`. + +# In[19]: + + +image = dataset[10]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] + +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) + +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[20]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[21]: + + +if False: + from unsloth import FastVisionModel + + model, processor = FastVisionModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + load_in_4bit = True, # Set to False for 16bit LoRA + ) + +sample = dataset[1] +image = sample["image"].convert("RGB") +messages = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": sample["text"], + }, + { + "type": "image", + }, + ], + }, +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True) +_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[22]: + + +# Select ONLY 1 to save! (Both not needed!) + +# Save locally to 16bit +if False: model.save_pretrained_merged("unsloth_finetune", processor,) + +# To export and save to your Hugging Face account +if False: model.push_to_hub_merged("YOUR_USERNAME/unsloth_finetune", processor, token = "YOUR_HF_TOKEN") + + +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Audio.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Audio.py new file mode 100644 index 0000000..a1bf768 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Audio.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch +from huggingface_hub import snapshot_download + +fourbit_models = [ + # Gemma 4 models + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B-it", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-E2B-it", + dtype = None, # None for auto detection + max_seq_length = 8192, # Choose any for long context! + load_in_4bit = False, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR. + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **processor.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + do_sample = False, + streamer = TextStreamer(processor, skip_prompt = True), + ) + + +#

Let's Evaluate Gemma 4 Baseline Performance on German Transcription

+ +# In[5]: + + +from datasets import load_dataset,Audio,concatenate_datasets + +dataset = load_dataset("kadirnar/Emilia-DE-B000000", split = "train") + +# Select a single audio sample to reserve for testing. +# This index is chosen from the full dataset before we create the smaller training split. +test_audio = dataset[7546] + +dataset = dataset.select(range(3000)) + +dataset = dataset.cast_column("audio", Audio(sampling_rate = 16000)) + + +# In[6]: + + +from IPython.display import Audio, display +print(test_audio['text']) +Audio(test_audio['audio']['array'],rate = test_audio['audio']['sampling_rate']) + + +# And the translation of the audio from German to English is: +# +# > I—I hold myself directly accountable. That much is, of course, clear: namely, that there are political interests involved in trade—in the exchange of goods—and that political influences are at play. The question is: that should not be the alternative. + +# In[7]: + + +messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": test_audio['audio']['array']}, + {"type": "text", "text": "Please transcribe this audio."} + ] + } +] + +do_gemma_4_inference(messages, max_new_tokens = 256) + + +#

Baseline Model Performance: 32.43% Word Error Rate (WER) for this sample !

+ +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text and audio parts + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[8]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 8, # The larger, the higher the accuracy, but might overfit + lora_alpha = 16, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = [ + "q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj", + + # Audio layers + "post", "linear_start", "linear_end", + "embedding_projection", + "ffw_layer_1", "ffw_layer_2", + "output_proj", + ] +) + + +# +# ### Data Prep +# We adapt the `kadirnar/Emilia-DE-B000000` dataset for our German ASR task using Gemma 4 multi-modal chat format. Each audio-text pair is structured into a conversation with `system`, `user`, and `assistant` roles. The processor then converts this into the final training format: +# +# ``` +# <|turn>system +# You are an assistant that transcribes speech accurately. +# <|turn>user +# <|audio|>Please transcribe this audio. +# <|turn>model +# Ich, ich rechne direkt mich an. + +# In[9]: + + +def format_intersection_data(samples: dict) -> dict[str, list]: + """Format intersection dataset to match expected message format""" + formatted_samples = {"messages": []} + for idx in range(len(samples["audio"])): + audio = samples["audio"][idx]["array"] + label = str(samples["text"][idx]) + + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": audio}, + {"type": "text", "text": "Please transcribe this audio."} + ] + }, + { + "role": "assistant", + "content":[{"type": "text", "text": label}] + } + ] + formatted_samples["messages"].append(message) + return formatted_samples + + +# In[10]: + + +dataset = dataset.map(format_intersection_data, batched = True, batch_size = 4, num_proc = 4) + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[11]: + + +# Use UnslothVisionDataCollator which handles audio token alignment correctly +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 8, + gradient_accumulation_steps = 1, + warmup_ratio = 0.03, + # num_train_epochs = 1, # Use for full training runs + max_steps = 60, + learning_rate = 5e-5, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", + remove_unused_columns = False, + + # The below are a must for audio finetuning: + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 8192, + ) +) + + +# In[12]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[13]: + + +trainer_stats = trainer.train() + + +# In[14]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR. + +# In[15]: + + +messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": test_audio['audio']['array']}, + {"type": "text", "text": "Please transcribe this audio."} + ] + } +] + +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[16]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[17]: + + +if False: + from unsloth import FastModel + model, processor = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = processor.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(processor, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[18]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4", processor) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[19]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", processor, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[20]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + processor, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[21]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + processor, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Text.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Text.py new file mode 100644 index 0000000..8042ab5 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Text.py @@ -0,0 +1,556 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-E2B-it", + dtype = None, # None for auto detection + max_seq_length = 1024, # Choose any for long context! + load_in_4bit = False, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True) + ) + + +# # Gemma 4 can see images! +# +# Alt text + +# In[5]: + + +sloth_link = "https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg" + +messages = [{ + "role" : "user", + "content": [ + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "Which films does this animal feature in?" } + ] +}] +# You might have to wait 1 minute for Unsloth's auto compiler +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# Let's make a poem about sloths! + +# In[6]: + + +messages = [{ + "role": "user", + "content": [{ "type" : "text", + "text" : "Write a poem about sloths." }] +}] +do_gemma_4_inference(messages) + + +# # Gemma 4 can also hear! + +# In[7]: + + +from IPython.display import Audio, display +Audio("https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3") + + +# In[8]: + + +get_ipython().system('wget -qqq https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3 -O audio.mp3') + + +# In[9]: + + +audio_file = "audio.mp3" + +messages = [{ + "role" : "user", + "content": [ + { "type": "audio", "audio" : audio_file }, + { "type": "text", "text" : "What is this audio about?" } + ] +}] +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# # Let's combine all 3 modalities together! + +# In[10]: + + +messages = [{ + "role" : "user", + "content": [ + { "type": "audio", "audio" : audio_file }, + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "What is this audio and image about? "\ + "How are they related?" } + ] +}] +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well! + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[11]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # Turn off for just text! + finetune_language_layers = True, # Should leave on! + finetune_attention_modules = True, # Attention good for GRPO + finetune_mlp_modules = True, # Should leave on always! + + r = 8, # Larger = higher accuracy, but might overfit + lora_alpha = 8, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, +) + + +# +# ### Data Prep +# We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below: +# +# ``` +# <|turn>user +# Hello +# <|turn>model +# Hey there! +# ``` +# We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more. + +# In[12]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4", +) + + +# We get the first 3000 rows of the dataset + +# In[13]: + + +from datasets import load_dataset +dataset = load_dataset("mlabonne/FineTome-100k", split = "train[:3000]") + + +# We now use `standardize_data_formats` to try converting datasets to the correct format for finetuning purposes! + +# In[14]: + + +from unsloth.chat_templates import standardize_data_formats +dataset = standardize_data_formats(dataset) + + +# Let's see how row 100 looks like! + +# In[15]: + + +dataset[100] + + +# We now have to apply the chat template for `Gemma-4` onto the conversations, and save it to `text`. We remove the `` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one. + +# In[16]: + + +def formatting_prompts_func(examples): + convos = examples["conversations"] + texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False).removeprefix('') for convo in convos] + return { "text" : texts, } + +dataset = dataset.map(formatting_prompts_func, batched = True) + + +# Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one. + +# In[17]: + + +dataset[100]["text"] + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[18]: + + +from trl import SFTTrainer, SFTConfig +trainer = SFTTrainer( + model = model, + tokenizer = tokenizer, + train_dataset = dataset, + eval_dataset = None, # Can set up evaluation! + args = SFTConfig( + dataset_text_field = "text", + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, # Use GA to mimic batch size! + warmup_steps = 5, + # num_train_epochs = 1, # Set this for 1 full training run. + max_steps = 60, + learning_rate = 2e-4, # Reduce to 2e-5 for long training runs + logging_steps = 1, + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "linear", + seed = 3407, + report_to = "none", # Use TrackIO/WandB etc + ), +) + + +# We also use Unsloth's `train_on_completions` method to only train on the assistant outputs and ignore the loss on the user's inputs. This helps increase accuracy of finetunes! + +# In[19]: + + +from unsloth.chat_templates import train_on_responses_only +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) + + +# Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected! + +# In[20]: + + +tokenizer.decode(trainer.train_dataset[100]["input_ids"]) + + +# Now let's print the masked out example - you should see only the answer is present: + +# In[21]: + + +tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100]["labels"]]).replace(tokenizer.pad_token, " ") + + +# In[22]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[23]: + + +trainer_stats = trainer.train() + + +# In[24]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[25]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4", +) +messages = [{ + "role": "user", + "content": [{ + "type" : "text", + "text" : "Continue the sequence: 1, 1, 2, 3, 5, 8,", + }] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") +outputs = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, +) +tokenizer.batch_decode(outputs) + + +# You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time! + +# In[26]: + + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "Why is the sky blue?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[27]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# tokenizer.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[28]: + + +if False: + from unsloth import FastModel + model, tokenizer = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[29]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4-finetune", tokenizer) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[30]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", tokenizer, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[31]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[32]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Vision.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Vision.py new file mode 100644 index 0000000..0139528 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)-Vision.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[ ]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[ ]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth + +# In[ ]: + + +from unsloth import FastVisionModel # FastLanguageModel for LLMs +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastVisionModel.from_pretrained( + "unsloth/gemma-4-E2B-it", + load_in_4bit = False, # Use 4bit to reduce memory use. False for 16bit LoRA. + use_gradient_checkpointing = "unsloth", # True or "unsloth" for long context +) + + +# We now add LoRA adapters for parameter efficient fine-tuning, allowing us to train only 1% of all model parameters efficiently. +# +# **[NEW]** We also support fine-tuning only the vision component, only the language component, or both. Additionally, you can choose to fine-tune the attention modules, the MLP layers, or both! + +# In[ ]: + + +model = FastVisionModel.get_peft_model( + model, + finetune_vision_layers = True, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 32, # The larger, the higher the accuracy, but might overfit + lora_alpha = 32, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = "all-linear", # Optional now! Can specify a list if needed +) + + +# +# ### Data Prep +# We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions. +# +# You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR). + +# In[ ]: + + +from datasets import load_dataset +dataset = load_dataset("unsloth/LaTeX_OCR", split = "train") + + +# Let's take an overview of the dataset. We'll examine the second image and its corresponding caption. + +# In[ ]: + + +dataset + + +# In[ ]: + + +dataset[2]["image"] + + +# In[ ]: + + +dataset[2]["text"] + + +# We can also render LaTeX directly in the browser! + +# In[ ]: + + +from IPython.display import display, Math, Latex + +latex = dataset[3]["text"] +display(Math(latex)) + + +# To format the dataset, all vision fine-tuning tasks should follow this format: +# +# ```python +# [ +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# ] +# ``` + +# In[ ]: + + +instruction = "Write the LaTeX representation for this image." + +def convert_to_conversation(sample): + conversation = [ + { + "role": "user", + "content": [ + {"type": "text", "text": instruction}, + {"type": "image", "image": sample["image"]}, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": sample["text"]}]}, + ] + return {"messages": conversation} +pass + + +# Let's convert the dataset into the "correct" format for finetuning: + +# In[ ]: + + +converted_dataset = [convert_to_conversation(sample) for sample in dataset] + + +# The first example is now structured like below: + +# In[ ]: + + +converted_dataset[0] + + +# Lets take the Gemma 4 instruction chat template and use it in our base model + +# In[ ]: + + +from unsloth import get_chat_template + +processor = get_chat_template( + processor, + "gemma-4" +) + + +# Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before. + +# In[ ]: + + +image = dataset[2]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# You can see it's absolutely terrible! It doesn't follow instructions at all + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning! +# +# We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup. + +# In[ ]: + + +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = converted_dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, + max_grad_norm = 0.3, + warmup_ratio = 0.03, + max_steps = 60, + # num_train_epochs = 2, # Set this instead of max_steps for full training runs + learning_rate = 2e-4, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", # For Weights and Biases or others + + # You MUST put the below items for vision finetuning: + remove_unused_columns = False, + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 2048, + ) +) + + +# In[ ]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# In[ ]: + + +trainer_stats = trainer.train() + + +# In[ ]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model! You can modify the instruction and input—just leave the output blank. +# +# We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`. + +# In[ ]: + + +image = dataset[10]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] + +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) + +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[ ]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[ ]: + + +if False: + from unsloth import FastVisionModel + + model, processor = FastVisionModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + load_in_4bit = True, # Set to False for 16bit LoRA + ) + +sample = dataset[1] +image = sample["image"].convert("RGB") +messages = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": sample["text"], + }, + { + "type": "image", + }, + ], + }, +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True) +_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[ ]: + + +# Select ONLY 1 to save! (Both not needed!) + +# Save locally to 16bit +if False: model.save_pretrained_merged("unsloth_finetune", processor,) + +# To export and save to your Hugging Face account +if False: model.push_to_hub_merged("YOUR_USERNAME/unsloth_finetune", processor, token = "YOUR_HF_TOKEN") + + +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_GRPO.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_GRPO.py new file mode 100644 index 0000000..d6f7171 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_GRPO.py @@ -0,0 +1,911 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# # ### Installation +# +# # In[ ]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[ ]: +# +# +# #@title Colab Extra Install { display-mode: "form" } +# get_ipython().run_line_magic('%capture', '') +# import os +# get_ipython().system('pip install --upgrade -qqq uv') +# if "COLAB_" not in "".join(os.environ.keys()): +# # If you're not in Colab, just use pip install! +# get_ipython().system('pip install unsloth vllm') +# else: +# try: import numpy, PIL; _numpy = f'numpy=={numpy.__version__}'; _pil = f'pillow=={PIL.__version__}' +# except: _numpy = "numpy"; _pil = "pillow" +# try: import subprocess; is_t4 = "Tesla T4" in str(subprocess.check_output(["nvidia-smi"])) +# except: is_t4 = False +# _vllm, _triton = ('vllm==0.9.2', 'triton==3.2.0') if is_t4 else ('vllm==0.15.1', 'triton') +# get_ipython().system('uv pip install -qqq --upgrade {_vllm} {_numpy} {_pil} torchvision bitsandbytes xformers unsloth') +# get_ipython().system('uv pip install -qqq {_triton}') +# get_ipython().system('uv pip install transformers==4.56.2') +# get_ipython().system('uv pip install --no-deps trl==0.22.2') +# +# +# # ### Unsloth + +# # Goal: Make faster kernels with Reinforcement Learning +# +# Our goal is to make a faster matrix multiplication kernel by doing RL on Gemma 4 with Unsloth. +# +# +# +# You will learn how to: +# 1. Counteract **reward hacking** like cheating, caching, laziness. +# 2. Timing and correctness of kernels and time limits. +# 3. Making good **reward functions** +# 4. How to seriously do RL to make optimized kernels + +# In[ ]: + + +from unsloth import FastVisionModel +import torch +max_seq_length = 4096 # Can increase for longer reasoning traces +lora_rank = 32 # Larger rank = smarter, but slower + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastVisionModel.from_pretrained( + model_name = "unsloth/gemma-4-E2B-it", + max_seq_length = max_seq_length, + load_in_4bit = False, # False for LoRA 16bit + fast_inference = False, # Enable vllm fast inference +) + + +# We now add some small amount of LoRA weights to Gemma 4 so we only need to train those, instead of training on the full model. + +# In[ ]: + + +model = FastVisionModel.get_peft_model( + model, + r = lora_rank, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128 + target_modules = [ + "q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj", + ], + lora_alpha = lora_rank*2, # *2 speeds up training + use_gradient_checkpointing = "unsloth", # Reduces memory usage + random_state = 3407, +) + + +# # Optimized matrix multiplication +# +# Numpy has optimized matrix multiplication kernels for CPUs via BLAS optimized operations. For GPUs, one can use CUDA accelerated cuBLAS kernels which PyTorch calls under the hood. +# +# To generate some random matrices to do matrix multiplication, we can do the below: + +# In[ ]: + + +import numpy as np +def generate_random_matrices(seed = 3407, n = 256): + random_state = np.random.RandomState(seed) + n, k, m = random_state.randint(1, n+1, size = 3) + A = np.random.uniform(-10, 10, size = (n, k)) + B = np.random.uniform(-10, 10, size = (k, m)) + return A, A.tolist(), B, B.tolist() + + +# We shall generate a small matrix, and see the matrix multiplied output + +# In[ ]: + + +A, A_list, B, B_list = generate_random_matrices(seed = 42, n = 5) +print(A) +print(B) +print(np.matmul(A, B)) + + +# We can call a LLM to generate a simple matrix multiply kernel in Python only, and we can calculate the differences between the actual result and the kernel's result + +# In[ ]: + + +def calculate_difference(pred, real): + if pred is None: return 5, 5 + assert real is not None + import numpy as np + try: + difference = pred - real + except: + return 5, 5 + amax_error = float(np.amax(difference)) + mse_error = float(np.mean(np.square(difference))) + return amax_error, mse_error + + +# In[ ]: + + +# Kernel generated by GPT-5 +def matmul(A, B): + z, s = zip, sum + Bt = list(z(*B)) + return [[s(a*b for a, b in z(row, col)) for col in Bt] for row in A] + + +# We see the error below is very small, so that's good! + +# In[ ]: + + +prediction = matmul(A_list, B_list) +calculate_difference(prediction, np.matmul(A, B)) + + +# # Countering Reward Hacking +# +# The ultimate goal of RL is to maximize some reward (say speed, revenue, some metric). +# +# But RL can **cheat** When the RL algorithm learns a trick or exploits something to increase the reward, without actually doing the task at end, this is called "Reward Hacking". +# +# Some good examples are in https://en.wikipedia.org/wiki/Reward_hacking +# +# For matrix multiplication kernels, we might see the following issues: +# +# * Laziness: RL learns to use Numpy, Torch, other libraries, which calls optimized kernels. +# * Caching: RL learns to cache the result of the output +# * Cheating: RL learns to find the actual output by inspecting Python global variables +# * RL learns to edit the timing function to make it output 0 time as passed. +# +# And possibly more. We shall try to address each! + +# # Countering Reward Hacking 1: Stop laziness +# We can stop the RL algorithm from calling optimized code by inspecting if the generated code imports other non standard Python libraries. We used GPT-5 to help generate this check `check_only_stdlib_imports`: + +# In[ ]: + + +#@title (Collapsible code) +import ast +import sys +import sysconfig +from pathlib import Path + +def _stdlib_names(): + """ + Build a set of canonical stdlib top-level module/package names. + Uses sys.stdlib_module_names when available (3.10+), with a + filesystem fallback for older versions/edge cases. + """ + names = {m.lower() for m in getattr(sys, "stdlib_module_names", set())} + names |= {m.lower() for m in sys.builtin_module_names} + names.add("__future__") # special-case + + # Fallback/augmentation: scan the stdlib directory + try: + stdlib_dir = Path(sysconfig.get_path("stdlib")) + if stdlib_dir.exists(): + for p in stdlib_dir.iterdir(): + if p.name == "site-packages": + continue + if p.suffix == ".py": + names.add(p.stem.lower()) + elif p.is_dir() and (p / "__init__.py").exists(): + names.add(p.name.lower()) + except Exception: + # conservative fallback; the names set above will still work well + pass + + return names + +_STDLIB_SET = _stdlib_names() + +def check_only_stdlib_imports(code: str): + """ + Return (ok: bool, details: dict) + + ok == True -> all absolute imports are from the stdlib. + ok == False -> details['non_stdlib'] lists offending top-level modules. + + details includes: + - stdlib: sorted list of stdlib imports found + - non_stdlib: sorted list of non-stdlib imports found + - relative_imports: count of relative imports (always allowed here) + """ + try: + tree = ast.parse(code) + except SyntaxError as e: + return False, { + "error": f"SyntaxError: {e}", + "stdlib": [], + "non_stdlib": [], + "relative_imports": 0, + } + + abs_imports = set() + relative_count = 0 + + class Visitor(ast.NodeVisitor): + def visit_Import(self, node: ast.Import): + for alias in node.names: + abs_imports.add(alias.name.split(".")[0]) + def visit_ImportFrom(self, node: ast.ImportFrom): + nonlocal relative_count + if (node.level or 0) > 0: + # relative import + relative_count += 1 + else: + if node.module: + abs_imports.add(node.module.split(".")[0]) + + Visitor().visit(tree) + + stdlib_found = sorted(m for m in abs_imports if m.lower() in _STDLIB_SET) + non_stdlib = sorted(m for m in abs_imports if m.lower() not in _STDLIB_SET) + + return len(non_stdlib) == 0, { + "stdlib": stdlib_found, + "non_stdlib": non_stdlib, + "relative_imports": relative_count, + } + + +# For example, let's call `check_only_stdlib_imports` on a random piece of matrix multiplication code generated by GPT-5: + +# In[ ]: + + +sample = """ +def matmul(A, B): + import numpy as np + from torch import matmul + z, s = zip, sum + Bt = list(z(*B)) + return [[s(a*b for a, b in z(row, col)) for col in Bt] for row in A] +""" +ok, info = check_only_stdlib_imports(sample) +print("Only stdlib imports?", ok) +print(info) + + +# # Countering Reward Hacking 2: Stop cheating +# We can stop the RL algorithm from using global or cached variables by restricting it's `locals` and `globals`. +# +# We are also going to use `exec` to create the function, so we have to save the output to an empty dict. +# +# We also disallow global variable access. + +# In[ ]: + + +output_function = {} +exec(sample, {}, output_function) +output_function["matmul"] + + +# We also disallow global variable access via `types.FunctionType(f.__code__, {})` + +# In[ ]: + + +import types +output_function["matmul"] = types.FunctionType(output_function["matmul"].__code__, {}) + +def import_numpy(): + np.matmul + print("Success") + +import_numpy() +import_numpy = types.FunctionType(import_numpy.__code__, {}) +try: + import_numpy() +except Exception as e: + print(str(e)) + + +# In[ ]: + + +def create_locked_down_function(function): + output_function = {} + exec(function, {}, output_function) + new_matmul = output_function["matmul"] + new_matmul = types.FunctionType(new_matmul.__code__, {}) + return new_matmul + + +# # Countering Reward Hacking 3: Stop caching +# We can stop the RL algorithm from using cached data by wiping the cache with a large fake matrix. We also have to benchmark carefully with multiple loops and turns. +# +# We also add a **timer** to not make the algorithm go in an endless loop. + +# In[ ]: + + +import os, gc, time, statistics +import signal +from contextlib import contextmanager +class TimeoutError(Exception): pass + +@contextmanager +def time_limit(seconds): + def _handler(signum, frame): + raise TimeoutError(f"Timed out after {seconds}s") + old = signal.signal(signal.SIGALRM, _handler) + signal.setitimer(signal.ITIMER_REAL, seconds) + try: + yield + finally: + signal.setitimer(signal.ITIMER_REAL, 0.0) + signal.signal(signal.SIGALRM, old) + +class Benchmarker: + def __init__(self, trials = 3, loops = 1, timeout = 30): + self.buffer = np.zeros(2 * 1024 * 1024 * 1024, dtype = np.uint8) + self.trials = trials + self.loops = loops + assert timeout > 0 # Cannot be 0 since it won't work! + self.timeout = timeout + def thrash(self): + # Edit the buffer to wipe cache lines + self.buffer ^= 1 + return int(self.buffer[::4096].sum()) + + def benchmark(self, function, arguments): + assert len(arguments) == self.loops + samples = [] + exceptions = [] + timed_out = 0 + for _ in range(self.trials): + gc.collect(); gc.disable(); self.thrash() + t_start = time.perf_counter_ns() + for i in range(self.loops): + try: + with time_limit(self.timeout): + function(*arguments[i]) + except TimeoutError as e: + timed_out += 1 + except Exception as e: + exceptions.append(str(e)) + t_end = time.perf_counter_ns() + gc.enable() + samples.append((t_end - t_start) // max(1, self.loops)) + return { + "median_ns": int(statistics.median(samples)), + "mean_ns": int(statistics.fmean(samples)), + "stdev_ns": int(statistics.pstdev(samples) if len(samples) > 1 else 0), + "exceptions" : exceptions, + "timeouts" : timed_out, + } + + +# For example we use our matmul kernel we had, and benchmark it with a 10 second delay: + +# In[ ]: + + +A, A_list, B, B_list = generate_random_matrices(seed = 0, n = 256) +Benchmarker(trials = 1, timeout = 10).benchmark(output_function["matmul"], [(A_list, B_list)]) + + +# # Data & RL task setup +# +# We now have to create a prompt to the model for which it will do some task. For our matrix multiply example, we use the below: + +# In[ ]: + + +prompt = """ +Create a new fast matrix multiplication function using only native Python code. +You are given a list of list of numbers. +Output your new function in backticks using the format below: +```python +def matmul(A, B): + return ... +``` +""".strip() +print(prompt) + + +# First, let's prompt Gemma 4 without RL and see how it goes: + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer +print("=" * 50) +print("BASE MODEL OUTPUT (before RL training):") +print("=" * 50) + +inputs = tokenizer( + text = text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +text_streamer = TextStreamer(tokenizer, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 512, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# # Reward functions +# +# We now design the `extract_function` function which simply extracts the function wrapped in 3 backticks. +# +# And 4 reward functions: +# +# 1. `function_works` which rewards the model if the strategy is a valid Python function. +# 2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it. +# 3. `correctness_check` which checks if the kernel was correct or wrong - it shouldn't generate gibberish! +# 4. `speed_check` checks the performance relative to Numpy matmul directly. + +# In[ ]: + + +def extract_function(text): + if text.count("```") >= 2: + first = text.find("```") + 3 + second = text.find("```", first) + fx = text[first : second].strip() + fx = fx.removeprefix("python\n") + fx = fx[fx.find("def"):] + if fx.startswith("def matmul(A, B):"): return fx + return None +print(extract_function(prompt)) + + +# Below is our `function_works` reward function which uses Python's `exec` but guarded by not allowing leakage of local and global variables. We can also use `check_only_stdlib_imports` first to check if there are errors before even executing the function: + +# In[ ]: + + +ok, info = check_only_stdlib_imports("def a") +ok, info + + +# In[ ]: + + +def function_works(completions, **kwargs): + scores = [] + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + print(function) + if function is not None: + ok, info = check_only_stdlib_imports(function) + if function is None or "error" in info: + score = -2.0 + else: + try: + new_matmul = create_locked_down_function(function) + score = 1.0 + except: + score = -0.5 + scores.append(score) + return scores + + +# `no_cheating` checks if the function cheated since it might have imported Numpy or Torch optimized code. + +# In[ ]: + + +def no_cheating(completions, **kwargs): + scores = [] + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if function is not None: + ok, info = check_only_stdlib_imports(function) + else: + ok = False + scores.append(1.0 if ok else -20.0) # Penalize heavily! + return scores + + +# Next `correctness_check` checks if the kernel was correct. We want to penalize if the absolute error is larger than 1, and if the mean squared error is somewhat bigger then machine epsilon. +# +# We have to execute the code now! + +# In[ ]: + + +np.finfo(np.float64).eps + + +# In[ ]: + + +def correctness_check(completions, **kwargs): + scores = [] + # Generate some random matrices of size less than 128 + A, A_list, B, B_list = generate_random_matrices(seed = np.random.randint(10000), n = 128) + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if function is not None: + ok, info = check_only_stdlib_imports(function) + if function is None or "error" in info: + scores.append(0) + continue + try: + new_matmul = create_locked_down_function(function) + except: + scores.append(0) + continue + try: + pred = new_matmul(A_list.copy(), B_list.copy()) + except: + # Failed! + scores.append(-2.0) + continue + true = np.matmul(A, B) + amax_error, mse_error = calculate_difference(pred, true) + + # Check correctness and score! + machine_epsilon = 100*np.finfo(np.float64).eps + if amax_error >= 3: score = -3.0 + elif amax_error >= 2: score = -2.5 + elif amax_error >= 1: score = -2.0 + elif amax_error >= 0.5: score = -1.0 + elif amax_error >= 100*machine_epsilon: score = 0.0 + elif amax_error >= machine_epsilon: score = 1.0 + else: score = 3.0 + + if mse_error >= 3: score += -3.0 + elif mse_error >= 2: score += -2.5 + elif mse_error >= 1: score += -2.0 + elif mse_error >= 0.5: score += -1.0 + elif mse_error >= 100*machine_epsilon: score += 0.0 + elif mse_error >= machine_epsilon: score += 1.0 + else: score += 3.0 + scores.append(score) + return scores + + +# Finally our benchmarking function for `speed_check`! We shall limit the timer to 10 seconds and do 3 trials. + +# In[ ]: + + +A, A_list, B, B_list = generate_random_matrices(seed = 0, n = 256) +benchmarker = Benchmarker(trials = 3, timeout = 10) +numpy_results = benchmarker.benchmark(np.matmul, [(A, B)]) +numpy_results + + +# In[ ]: + + +new_matmul = create_locked_down_function(extract_function(prompt)) +new_results = benchmarker.benchmark(new_matmul, [(A_list, B_list)]) +new_results + + +# We can take the difference and do a negative sign for slower ones. If the ratio is less than 1 (ie faster, we shall invert it!) + +# In[ ]: + + +negative = -(new_results["median_ns"] / numpy_results["median_ns"]) / 100 +positive = +(numpy_results["median_ns"] / new_results["median_ns"]) / 100 +reward = negative if new_results["median_ns"] >= numpy_results["median_ns"] else positive +reward + + +# In[ ]: + + +new_results["median_ns"] = 3 +numpy_results["median_ns"] = 1000 +negative = -(new_results["median_ns"] / numpy_results["median_ns"]) / 100 +positive = +(numpy_results["median_ns"] / new_results["median_ns"]) / 100 +reward = negative if new_results["median_ns"] >= numpy_results["median_ns"] else positive +reward + + +# In[ ]: + + +import gc +def speed_check(completions, **kwargs): + scores = [] + # Generate some random matrices of size less than 256 + A, A_list, B, B_list = generate_random_matrices(seed = np.random.randint(10000), n = 256) + numpy_results = benchmarker.benchmark(np.matmul, [(A, B)]) + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if function is not None: + ok, info = check_only_stdlib_imports(function) + if function is None or "error" in info: + scores.append(0) + continue + try: + new_matmul = create_locked_down_function(function) + except: + scores.append(0) + continue + new_results = benchmarker.benchmark(new_matmul, [(A_list.copy(), B_list.copy())]) + + # Get score and clip to -10, 10 + negative = -(new_results["median_ns"] / numpy_results["median_ns"]) / 100 + positive = +(numpy_results["median_ns"] / new_results["median_ns"]) / 100 + score = negative if new_results["median_ns"] >= numpy_results["median_ns"] else positive + if score >= 10: score = 10 + if score <= -10: score = -10 + scores.append(score) + # Free memory to counteract OOMs + gc.collect() + torch.cuda.empty_cache() + return scores + + +# We create the dataset which includes a replica of our prompt. + +# In[ ]: + + +from datasets import Dataset +dataset = Dataset.from_list([{"prompt" : [{"role": "user", "content": prompt.strip()}], "answer" : 0}]*1000) +maximum_length = len(tokenizer.apply_chat_template([{"role":"user", "content":prompt.strip()}], add_generation_prompt = True, tokenize = True)) +print(maximum_length) +dataset[0] + + +# +# ### Train the model +# +# Now set up GRPO Trainer and all configurations! We also support GSDP, GAPO, Dr GRPO and more! Go to our docs https://unsloth.ai/docs/ for more info! + +# In[ ]: + + +# Leave room for the prompt (plus 1 token safety margin) +max_completion_length = max_seq_length - (maximum_length + 1) + +from trl import GRPOConfig, GRPOTrainer +training_args = GRPOConfig( + temperature = 1.0, + top_p = 0.95, + top_k = 64, + learning_rate = 5e-5, + weight_decay = 0.001, + warmup_ratio = 0.1, + lr_scheduler_type = "linear", + optim = "adamw_8bit", + logging_steps = 1, + per_device_train_batch_size = 1, + gradient_accumulation_steps = 2, # Increase to 4 for smoother training + num_generations = 2, # Decrease if out of memory + max_completion_length = max_completion_length, + # num_train_epochs = 1, # Set to 1 for a full training run + max_steps = 100, + save_steps = 100, + report_to = "none", # Can use Weights & Biases, TrackIO + output_dir = "outputs", + epsilon = 0.2, + epsilon_high = 0.28, # one sided + delta = 1.5, # two sided + loss_type = 'bnpo', + mask_truncated_completions = True + # For optional training + evaluation + # fp16_full_eval = True, + # per_device_eval_batch_size = 4, + # eval_accumulation_steps = 1, + # eval_strategy = "steps", + # eval_steps = 1, +) + + +# And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase! +# +# You might have to wait 150 to 200 steps for any action. You'll probably get 0 reward for the first 100 steps. Please be patient! +# +# | Step | Training Loss | reward | reward_std | completion_length | kl | +# |------|---------------|-----------|------------|-------------------|----------| +# | 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 | +# | 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 | +# | 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 | + +# In[ ]: + + +# For optional training + evaluation +# new_dataset = dataset.train_test_split(test_size = 0.01) + +trainer = GRPOTrainer( + model = model, + processing_class = tokenizer, + reward_funcs = [ + function_works, + no_cheating, + correctness_check, + speed_check, + ], + args = training_args, + train_dataset = dataset, + + # For optional training + evaluation + # train_dataset = new_dataset["train"], + # eval_dataset = new_dataset["test"], +) + + +# And let's train the model! +# +# **NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster! + +# In[ ]: + + +trainer.train() + + +# And now with the LoRA we just trained with GRPO - we first save the LoRA first! + +# In[ ]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") + + +# Verify LoRA is actually trained! + +# In[ ]: + + +from safetensors import safe_open + +tensors = {} +with safe_open("grpo_saved_lora/adapter_model.safetensors", framework = "pt") as f: + # Verify both A and B are non zero + for key in f.keys(): + tensor = f.get_tensor(key) + n_zeros = (tensor == 0).sum() / tensor.numel() + assert(n_zeros.item() != tensor.numel()) + + +# +# # Inference +# Now let's try the model we just trained! + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer + +_ = model.generate( + **tokenizer(images = None, text = text, return_tensors = "pt").to("cuda"), + temperature = 1.0, top_p = 0.95, top_k = 64, + max_new_tokens = 1024, + streamer = TextStreamer(tokenizer, skip_prompt = False), +) + + +# +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[ ]: + + +# Merge to 16bit +if False: model.save_pretrained_merged("gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit", token = "YOUR_HF_TOKEN") + +# Merge to 4bit +if False: model.save_pretrained_merged("gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit", token = "YOUR_HF_TOKEN") + +# Just LoRA adapters +if False: + model.save_pretrained("gemma_4_lora") + tokenizer.save_pretrained("gemma_4_lora") +if False: + model.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + tokenizer.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF. +# +# Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)): +# * `q8_0` - Fast conversion. High resource use, but generally acceptable. +# * `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K. +# * `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K. +# +# [**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) + +# In[ ]: + + +# Save to 8bit Q8_0 +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer,) +# Remember to go to https://huggingface.co/settings/tokens for a token! +# And change hf to your username! +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, token = "YOUR_HF_TOKEN") + +# Save to 16bit GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "f16") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "f16", token = "YOUR_HF_TOKEN") + +# Save to q4_k_m GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "q4_k_m") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "q4_k_m", token = "YOUR_HF_TOKEN") + +# Save to multiple GGUF options - much faster if you want multiple! +if False: + model.push_to_hub_gguf( + "HF_USERNAME/gemma_4_finetune", # Change hf to your username! + tokenizer, + quantization_method = ["q4_k_m", "q8_0", "q5_k_m",], + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.py new file mode 100644 index 0000000..da4b133 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_2048_Game.py @@ -0,0 +1,913 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# # Goal: Make Gemma 4 play games with Reinforcement Learning +# +# Our goal is to make Gemma 4 play the 2048 game with reinforcement learning, or a variant of it called [GRPO](https://arxiv.org/abs/2501.12948). +# +# We want the model to devise a strategy to play 2048, and we will run this strategy until we win or lose. We then reward the model if it created a good strategy (winning the game), and we'll penalize it (negative reward) if the strategy was a bad one. +# +# + +# # Installation +# We'll be using [Unsloth](https://github.com/unslothai/unsloth) to do RL on Gemma 4. Unsloth saves 70% VRAM usage and makes reinforcement learning 2 to 6x faster! + +# In[ ]: + + +get_ipython().run_cell_magic('capture', '', 'import os, importlib.util\n!pip install --upgrade -qqq uv\nif importlib.util.find_spec("torch") is None or "COLAB_" in "".join(os.environ.keys()):\n try: import numpy, PIL; _numpy = f"numpy=={numpy.__version__}"; _pil = f"pillow=={PIL.__version__}"\n except: _numpy = "numpy"; _pil = "pillow"\n # Gemma 4 requires transformers >= 5.5.0 — do NOT pin to 4.x here\n !uv pip install -qqq \\\n "torch>=2.8.0" "triton>=3.4.0" {_numpy} {_pil} torchvision bitsandbytes \\\n "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \\\n "unsloth[base] @ git+https://github.com/unslothai/unsloth" \\\n git+https://github.com/triton-lang/triton.git@0add68262ab0a2e33b84524346cb27cbb2787356#subdirectory=python/triton_kernels\nelif importlib.util.find_spec("unsloth") is None:\n !uv pip install -qqq unsloth\n# Gemma 4 requires transformers >= 5.5.0\n!uv pip install --upgrade --no-deps "transformers>=5.5.0" tokenizers "trl>=0.28.0" unsloth unsloth_zoo\n') + + +# In[ ]: + + +get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') + + +# ### Unsloth + +# In[ ]: + + +from unsloth import FastVisionModel +import torch +max_seq_length = 4096 # Can increase for longer reasoning traces +lora_rank = 32 # Larger rank = smarter, but slower + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastVisionModel.from_pretrained( + model_name = "unsloth/gemma-4-E2B-it", + max_seq_length = max_seq_length, + load_in_4bit = False, # False for LoRA 16bit + fast_inference = False, # Enable vllm fast inference +) + + +# To do efficient RL, we will use [LoRA](https://arxiv.org/abs/2106.09685), which allows us to only add 1 to 5% of extra weights to the model for finetuning purposes. This allows us to save memory usage by over 60%, and yet it retains good accuracy. + +# In[ ]: + + +model = FastVisionModel.get_peft_model( + model, + r = lora_rank, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128 + target_modules = [ + "q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj", + ], + lora_alpha = lora_rank*2, # *2 speeds up training + use_gradient_checkpointing = "unsloth", # Reduces memory usage + random_state = 3407, +) + + +# # 2048 game +# +# We used GPT-5 to create a variant of the 2048 game. It should output the current game board state, and allow us to advance the game board state with 1 action (up, down, left, right). + +# In[ ]: + + +#@title (Collapsible) 2048 Game Implementation +from dataclasses import dataclass, field +from typing import List, Tuple, Optional +import random +import copy + +def _compress_and_merge_row_left(row: List[int]) -> Tuple[List[int], int, bool]: + n = len(row) + tiles = [x for x in row if x != 0] + gained = 0 + i = 0 + merged = [] + while i < len(tiles): + if i + 1 < len(tiles) and tiles[i] == tiles[i + 1]: + v = tiles[i] * 2 + gained += v + merged.append(v) + i += 2 + else: + merged.append(tiles[i]) + i += 1 + merged += [0] * (n - len(merged)) + changed = merged != row + return merged, gained, changed + +def _move_left(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]: + changed_any = False + total_gain = 0 + new_board = [] + for row in board: + new_row, gained, changed = _compress_and_merge_row_left(row) + new_board.append(new_row) + total_gain += gained + changed_any = changed_any or changed + return new_board, total_gain, changed_any + +def _move_right(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]: + changed_any = False + total_gain = 0 + new_board = [] + for row in board: + rev = list(reversed(row)) + new_rev, gained, changed = _compress_and_merge_row_left(rev) + new_row = list(reversed(new_rev)) + new_board.append(new_row) + total_gain += gained + changed_any = changed_any or changed + return new_board, total_gain, changed_any + +def _transpose(board: List[List[int]]) -> List[List[int]]: + return [list(row) for row in zip(*board)] + +def _move_up(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]: + t = _transpose(board) + moved, gain, changed = _move_left(t) + return _transpose(moved), gain, changed + +def _move_down(board: List[List[int]]) -> Tuple[List[List[int]], int, bool]: + t = _transpose(board) + moved, gain, changed = _move_right(t) + return _transpose(moved), gain, changed + +def _empty_cells(board: List[List[int]]) -> List[Tuple[int, int]]: + size = len(board) + return [(r, c) for r in range(size) for c in range(size) if board[r][c] == 0] + +def _can_move(board: List[List[int]]) -> bool: + if _empty_cells(board): + return True + size = len(board) + for r in range(size): + for c in range(size - 1): + if board[r][c] == board[r][c + 1]: + return True + for r in range(size - 1): + for c in range(size): + if board[r][c] == board[r + 1][c]: + return True + return False + +@dataclass +class GameBoard: + size: int + seed: Optional[int] = None + target: int = 2048 + probability_fours: float = 0.10 # originally spawns (4) 10% of the time! + _rng: random.Random = field(init = False, repr = False) + _board: List[List[int]] = field(init = False, repr = False) + _score: int = field(default = 0, init = False, repr = False) + _state: str = field(default = "ongoing", init = False, repr = False) + + def __post_init__(self): + if self.size < 2: + raise ValueError("Board size must be at least 2.") + self._rng = random.Random(self.seed) + self._board = [[0 for _ in range(self.size)] for _ in range(self.size)] + self._add_random_tile() + self._add_random_tile() + self._update_state_after_change() + + class _BoardView: + def __init__(self, game: "GameBoard"): + self._game = game + def __iter__(self): + return iter(self._game._board) + def __len__(self): + return len(self._game._board) + def __getitem__(self, idx): + return self._game._board[idx] + def __repr__(self) -> str: + return repr(self._game._board) + __str__ = __repr__ + def do_action(self, key: str) -> None: + self._game.do_action(key) + def state(self) -> str: + return self._game.state() + def pretty(self, colors: bool = True, border: bool = True, dot_for_zero: bool = True) -> str: + return self._game._render_pretty(colors = colors, border = border, dot_for_zero = dot_for_zero) + + def board(self) -> "_BoardView": + return GameBoard._BoardView(self) + def state(self) -> str: + return self._state + def score(self) -> int: + return self._score + def do_action(self, key: str) -> None: + if self._state != "ongoing": + return + if not isinstance(key, str) or len(key) == 0: + self._state = "failed" + return + k = key.strip().lower() + if k == "q": + self._state = "failed" + return + move_map = {"a": _move_left, "d": _move_right, "w": _move_up, "s": _move_down} + if k not in move_map: + self._state = "failed" + return + mover = move_map[k] + new_board, gain, changed = mover(self._board) + if changed: + self._board = new_board + self._score += gain + self._add_random_tile() + self._update_state_after_change() + def _add_random_tile(self) -> bool: + empties = _empty_cells(self._board) + if not empties: + return False + r, c = self._rng.choice(empties) + self._board[r][c] = 4 if self._rng.random() < self.probability_fours else 2 + return True + def _update_state_after_change(self) -> None: + if any(self.target in row for row in self._board): + self._state = "success" + return + if not _can_move(self._board): + self._state = "failed" + return + self._state = "ongoing" + def _render_pretty(self, colors: bool = True, border: bool = True, dot_for_zero: bool = True) -> str: + """ + Pretty-print the board with colors that scale from 0 up to self.target. + Uses ANSI 256-color codes (works in most terminals). Set colors = False to disable. + """ + import math + + b = self._board + mx = max((max(row) for row in b), default = 0) + cell_w = max(3, len(str(mx))) + + RESET = "\x1b[0m" + + # A smooth-ish gradient from cool → warm + # (blue/cyan/green → yellow/orange/red). Tweak or expand as you like. + GRAD = [33, 39, 45, 51, 50, 49, 48, 47, 46, 82, 118, 154, 190, 226, 220, 214, 208, 202, 196] + ZERO_FG = 239 # dim gray + + def color_code(v: int) -> str: + if not colors: + return "" + if v == 0: + return f"\x1b[38;5;{ZERO_FG}m" + # Normalize by exponent relative to target: r in [0,1] + t = max(2, self.target) # safety; avoid log2(1) + # Guard: if v is not a power of two or is <1, handle gracefully + try: + r = max(0.0, min(1.0, math.log2(v) / math.log2(t))) + except ValueError: + r = 0.0 + idx = int(round(r * (len(GRAD) - 1))) + return f"\x1b[38;5;{GRAD[idx]}m" + + def fmt(v: int) -> str: + s = "." if (v == 0 and dot_for_zero) else str(v) + s = s.rjust(cell_w) + return color_code(v) + s + (RESET if colors else "") + + def hline(left: str, mid: str, right: str) -> str: + return left + mid.join("─" * cell_w for _ in range(self.size)) + right + + rows = [] + if border: + rows.append(hline("┌", "┬", "┐")) + for r in range(self.size): + content = "│".join(fmt(v) for v in b[r]) + rows.append(("│" + content + "│") if border else content) + if border: + rows.append(hline("└" if r == self.size - 1 else "├", + "┴" if r == self.size - 1 else "┼", + "┘" if r == self.size - 1 else "┤")) + return "\n".join(rows) + + +# For example let's create a board of size 5 X 5 and set the target to 8 instead of 2048. +# +# **[NOTE]** 2048 originally spawns a (4) 10% of the time! We can disable this for harder games. See [Wikipedia page](https://en.wikipedia.org/wiki/2048_(video_game)) for more details. + +# In[ ]: + + +game = GameBoard(size = 5, seed = 42, target = 8, probability_fours = 0.10) +print(game.board().pretty(), game.state()) + + +# In[ ]: + + +game + + +# We'll use WASD for the action space: +# +# ``` +# W +# A S D +# ``` +# Also `game.state()` will say `success` if we succeeded in getting the target! + +# In[ ]: + + +game.do_action("A") +print(game.board().pretty(), game.state()) + + +# In[ ]: + + +game.do_action("W") +print(game.board().pretty(), game.state()) + + +# In[ ]: + + +game.do_action("D") +print(game.board().pretty(), game.state()) + + +# In[ ]: + + +game.do_action("W") +print(game.board().pretty(), game.state()) + + +# In[ ]: + + +game.do_action("D") +print(game.board().pretty(), game.state()) + + +# If we do some other action that's not part of the action space, we will get an error, and the game will not accept anymore actions. + +# In[ ]: + + +game = GameBoard(size = 3, seed = 42, target = 8, probability_fours = 0.10) +game.do_action("AA") # Not in WASD +game.do_action("W") # Doesn't do anything +game.do_action("A") # Doesn't do anything +print(game.board().pretty(), game.state()) + + +# # RL Environment Setup +# +# We'll set up a function to accept some strategy that'll emit an action within `WASD` and check the game state. +# +# We'll also add a timer to only execute the strategy for 2 seconds maximum, otherwise it might never terminate! + +# In[ ]: + + +from typing import Callable +from unsloth import execute_with_time_limit + +def _execute_strategy(strategy : Callable, game : GameBoard): + assert callable(strategy) + + steps = 0 + while game.state() == "ongoing": + action = strategy(list(game.board())) + steps += 1 + if type(action) is not str: + return steps, "failed" + game.do_action(action) + return steps, game.state() + +@execute_with_time_limit(2) +def execute_strategy(strategy : Callable, game : GameBoard): + return _execute_strategy(strategy, game) + + +# Let's make a generic strategy to just hit `W`. We should expect this generic strategy to fail: + +# In[ ]: + + +def always_move_left(board): + return "W" + +game = GameBoard(size = 8, seed = 42, target = 2048, probability_fours = 0.10) +try: + execute_strategy(always_move_left, game) +except TimeoutError as e: + print(f"Timed out with error = {str(e)}") + + +# To allow longer strategies for Gemma 4 Reinforcement Learning, we shall allow a 5 second timer. + +# In[ ]: + + +@execute_with_time_limit(5) +def execute_strategy(strategy : Callable, game : GameBoard): + return _execute_strategy(strategy, game) + + +# # Code Execution +# +# To execute and create a new Python function, we first have to check if the function does not call other global variables or cheat. This is called `countering reward hacking` since we don't want the function to cheat. +# +# For example the below piece of code is fine, since it only imports Python level functions. We use `check_python_modules`: + +# In[ ]: + + +from unsloth import check_python_modules + +sample = """ +def strategy(board): + import math + from typing import Callable + return "W" +""" +ok, info = check_python_modules(sample) +print("Only Python imports?", ok) +print(info) + + +# For the below piece of code, since we import `numpy`, we should not allow the execution: + +# In[ ]: + + +sample = """ +def strategy(board): + from numpy import matmul + return "W" +""" +ok, info = check_python_modules(sample) +print("Only Python imports?", ok) +print(info) + + +# We also disallow global variable access. We'll use Unsloth's `create_locked_down_function` function + +# In[ ]: + + +from unsloth import create_locked_down_function +function = """ +def import_numpy(): + np.matmul + print("Success") +""" +f = create_locked_down_function(function) +try: + f() +except Exception as e: + print(str(e)) + + +# In[ ]: + + +from unsloth import create_locked_down_function +function = """ +def add(a, b): + def adder(a): + return a + b + return adder(b) + b +""" +f = create_locked_down_function(function) +try: + print(f(10, 20)) +except Exception as e: + print(str(e)) + + +# # Data & RL task setup +# +# We now have to create a prompt to tell the model to create a strategy for the 2048 game. You can customize this to some other task for another RL task. + +# In[ ]: + + +prompt = """ +Create a new short 2048 strategy using only native Python code. +You are given a list of list of numbers for the current board state. +Output one action for "W", "A", "S", "D" on what is the optimal next step. +Output your new short function in backticks using the format below: +```python +def strategy(board): + return "W" # Example +``` +All helper functions should be inside def strategy. Only output the short function `strategy`. +""".strip() +print(prompt) + + +# First, let's prompt Gemma 4 without RL and see how it goes: + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer +print("=" * 50) +print("BASE MODEL OUTPUT (before RL training):") +print("=" * 50) + +inputs = tokenizer( + text = text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +text_streamer = TextStreamer(tokenizer, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 512, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# # Reward functions +# +# We now design a `extract_function` function which simply extracts the function wrapped in 3 back ticks. +# +# And 3 reward functions: +# +# 1. `function_works` which rewards the model if the strategy is a valid Python function. +# 2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it. +# 3. `strategy_succeeds` which checks if the game strategy actually succeeds in attaining 2048 after running the auto-generated strategy. + +# In[ ]: + + +def extract_function(text): + if text.count("```") >= 2: + first = text.find("```") + 3 + second = text.find("```", first) + fx = text[first : second].strip() + fx = fx.removeprefix("python\n") + fx = fx[fx.find("def"):] + if fx.startswith("def strategy(board):"): return fx + return None +print(extract_function(prompt)) + + +# Below is our `function_works` reward function which uses Python's `exec` but guarded by not allowing leakage of local and global variables. We can also use `check_python_modules` first to check if there are errors before even executing the function: + +# In[ ]: + + +ok, info = check_python_modules("def a") +ok, info + + +# In[ ]: + + +def function_works(completions, **kwargs): + scores = [] + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if function is not None: + ok, info = check_python_modules(function) + if function is None or "error" in info: + score = -2.0 + else: + try: + new_strategy = create_locked_down_function(function) + score = 1.0 + except: + score = -0.5 + scores.append(score) + return scores + + +# `no_cheating` checks if the function cheated since it might have imported Numpy or other functions: + +# In[ ]: + + +def no_cheating(completions, **kwargs): + scores = [] + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if function is not None: + ok, info = check_python_modules(function) + scores.append(1.0 if ok else -20.0) # Penalize heavily! + else: + scores.append(-1.0) # Failed creating function + return scores + + +# Next `strategy_succeeds` checks if the strategy actually allows the game to terminate. Imagine if the strategy simply returned "W" which would fail after a time limit of 10 seconds. +# +# We also add a global `PRINTER` to print out the strategy and board state. + +# In[ ]: + + +import numpy as np +global PRINTER +PRINTER = 0 +def strategy_succeeds(completions, **kwargs): + global PRINTER + scores = [] + # Generate a random game board with seed + seed = np.random.randint(10000) + for completion in completions: + printed = False + score = 0 + response = completion[0]["content"] + function = extract_function(response) + if PRINTER % 5 == 0: + printed = True + print(function) + PRINTER += 1 + if function is not None: + ok, info = check_python_modules(function) + if function is None or "error" in info: + scores.append(0) + continue + try: + new_strategy = create_locked_down_function(function) + except: + scores.append(0) + continue + try: + game = GameBoard(size = 6, seed = seed, target = 2048, probability_fours = 0.10) + steps, game_state = execute_strategy(new_strategy, game) + print(f"Steps = {steps} State = {game_state}") + if printed is False: + print(function) + print(game.board().pretty()) + if game_state == "success": + scores.append(20.0) # Success - massively reward! + else: + scores.append(2.0) # Failed but function works! + except TimeoutError as e: + print("Timeout") + scores.append(-1.0) # Failed with timeout + except Exception as e: + print(f"Exception = {str(e)}") + scores.append(-3.0) # Failed + return scores + + +# We'll now create the dataset which includes a replica of our prompt. + +# In[ ]: + + +from datasets import Dataset +dataset = Dataset.from_list([{"prompt" : [{"role": "user", "content": prompt.strip()}], "answer" : 0}]*1000) +maximum_length = len(tokenizer.apply_chat_template([{"role":"user", "content":prompt.strip()}], add_generation_prompt = True, tokenize = True)) +print(maximum_length) +dataset[0] + + +# +# ### Train the model +# +# Now set up GRPO Trainer and all configurations! We also support GSPO, GAPO, Dr GRPO and more! Go the Unsloth [Reinforcement Learning Docs](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) for more options. + +# In[ ]: + + +# Leave room for the prompt (plus 1 token safety margin) +max_completion_length = max_seq_length - (maximum_length + 1) + +from trl import GRPOConfig, GRPOTrainer +training_args = GRPOConfig( + temperature = 1.0, + top_p = 0.95, + top_k = 64, + learning_rate = 5e-5, + weight_decay = 0.001, + warmup_ratio = 0.1, + lr_scheduler_type = "linear", + optim = "adamw_8bit", + logging_steps = 1, + per_device_train_batch_size = 1, + gradient_accumulation_steps = 2, # Increase to 4 for smoother training + num_generations = 2, # Decrease if out of memory + max_completion_length = max_completion_length, + # num_train_epochs = 1, # Set to 1 for a full training run + max_steps = 60, + save_steps = 100, + report_to = "none", # Can use Weights & Biases, TrackIO + output_dir = "outputs", + epsilon = 0.2, + epsilon_high = 0.28, # one sided + delta = 1.5, # two sided + loss_type = 'bnpo', + mask_truncated_completions = True + # For optional training + evaluation + # fp16_full_eval = True, + # per_device_eval_batch_size = 4, + # eval_accumulation_steps = 1, + # eval_strategy = "steps", + # eval_steps = 1, +) + + +# And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase! +# +# You might have to wait 150 to 200 steps for any action. You'll probably get 0 reward for the first 100 steps. Please be patient! +# +# | Step | Training Loss | reward | reward_std | completion_length | kl | +# |------|---------------|-----------|------------|-------------------|----------| +# | 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 | +# | 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 | +# | 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 | + +# In[ ]: + + +# For optional training + evaluation +# new_dataset = dataset.train_test_split(test_size = 0.01) + +trainer = GRPOTrainer( + model = model, + processing_class = tokenizer, + reward_funcs = [ + function_works, + no_cheating, + strategy_succeeds, + ], + args = training_args, + train_dataset = dataset, + + # For optional training + evaluation + # train_dataset = new_dataset["train"], + # eval_dataset = new_dataset["test"], +) + + +# And let's train the model! +# +# **NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster! + +# In[ ]: + + +trainer.train() + + +# And now with the LoRA we just trained with GRPO - we first save the LoRA first! + +# In[ ]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") + + +# Verify LoRA is actually trained! + +# In[ ]: + + +from safetensors import safe_open + +tensors = {} +with safe_open("grpo_saved_lora/adapter_model.safetensors", framework = "pt") as f: + # Verify both A and B are non zero + for key in f.keys(): + tensor = f.get_tensor(key) + n_zeros = (tensor == 0).sum() / tensor.numel() + assert(n_zeros.item() != tensor.numel()) + + +# +# # Inference +# Now let's try the model we just trained! + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer + +_ = model.generate( + **tokenizer(images = None, text = text, return_tensors = "pt").to("cuda"), + temperature = 1.0, top_p = 0.95, top_k = 64, + max_new_tokens = 1024, + streamer = TextStreamer(tokenizer, skip_prompt = False), +) + + +# +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[ ]: + + +# Merge to 16bit +if False: model.save_pretrained_merged("gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit", token = "YOUR_HF_TOKEN") + +# Merge to 4bit +if False: model.save_pretrained_merged("gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit", token = "YOUR_HF_TOKEN") + +# Just LoRA adapters +if False: + model.save_pretrained("gemma_4_lora") + tokenizer.save_pretrained("gemma_4_lora") +if False: + model.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + tokenizer.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF. +# +# Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)): +# * `q8_0` - Fast conversion. High resource use, but generally acceptable. +# * `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K. +# * `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K. +# +# [**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) + +# In[ ]: + + +# Save to 8bit Q8_0 +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer,) +# Remember to go to https://huggingface.co/settings/tokens for a token! +# And change hf to your username! +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, token = "YOUR_HF_TOKEN") + +# Save to 16bit GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "f16") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "f16", token = "YOUR_HF_TOKEN") + +# Save to q4_k_m GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "q4_k_m") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "q4_k_m", token = "YOUR_HF_TOKEN") + +# Save to multiple GGUF options - much faster if you want multiple! +if False: + model.push_to_hub_gguf( + "HF_USERNAME/gemma_4_finetune", # Change hf to your username! + tokenizer, + quantization_method = ["q4_k_m", "q8_0", "q5_k_m",], + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.py new file mode 100644 index 0000000..2acce9f --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E2B)_Reinforcement_Learning_Sudoku_Game.py @@ -0,0 +1,897 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# # Goal: Make Gemma 4 solve Sudoku puzzles with Reinforcement Learning +# +# Our goal is to make Gemma 4 learn to solve Sudoku puzzles using reinforcement learning (GRPO). +# The model will devise a strategy to fill in empty cells, and we'll reward it for correct placements +# and completing valid puzzles. +# +# + +# # Installation +# We'll be using [Unsloth](https://github.com/unslothai/unsloth) to do RL on Gemma 4. Unsloth saves 70% VRAM usage and makes reinforcement learning 2 to 6x faster. + +# In[ ]: + + +get_ipython().run_cell_magic('capture', '', 'import os, importlib.util\n!pip install --upgrade -qqq uv\nif importlib.util.find_spec("torch") is None or "COLAB_" in "".join(os.environ.keys()):\n try: import numpy, PIL; _numpy = f"numpy=={numpy.__version__}"; _pil = f"pillow=={PIL.__version__}"\n except: _numpy = "numpy"; _pil = "pillow"\n # Gemma 4 requires transformers >= 5.5.0 — do NOT pin to 4.x here\n !uv pip install -qqq \\\n "torch>=2.8.0" "triton>=3.4.0" {_numpy} {_pil} torchvision bitsandbytes \\\n "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \\\n "unsloth[base] @ git+https://github.com/unslothai/unsloth" \\\n git+https://github.com/triton-lang/triton.git@0add68262ab0a2e33b84524346cb27cbb2787356#subdirectory=python/triton_kernels\nelif importlib.util.find_spec("unsloth") is None:\n !uv pip install -qqq unsloth\n# Gemma 4 requires transformers >= 5.5.0\n!uv pip install --upgrade --no-deps "transformers>=5.5.0" tokenizers "trl>=0.28.0" unsloth unsloth_zoo\n') + + +# In[ ]: + + +get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') + + +# ### Unsloth + +# In[ ]: + + +from unsloth import FastVisionModel +import torch +max_seq_length = 4096 # Can increase for longer reasoning traces +lora_rank = 32 # Larger rank = smarter, but slower + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastVisionModel.from_pretrained( + model_name = "unsloth/gemma-4-E2B-it", + max_seq_length = max_seq_length, + load_in_4bit = False, # False for LoRA 16bit + fast_inference = False, # Enable vllm fast inference +) + + +# To do efficient RL, we will use [LoRA](https://arxiv.org/abs/2106.09685), which allows us to only add 1 to 5% of extra weights to the model for finetuning purposes. This allows us to save memory usage by over 60%, and yet it retains good accuracy. + +# In[ ]: + + +model = FastVisionModel.get_peft_model( + model, + r = lora_rank, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128 + target_modules = [ + "q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj", + ], + lora_alpha = lora_rank*2, # *2 speeds up training + use_gradient_checkpointing = "unsloth", # Reduces memory usage + random_state = 3407, +) + + +# # Sudoku Game Implementation +# +# We use GPT-5 to create a clean Sudoku solver environment. The strategy outputs "row,col,value" to fill cells. + +# In[ ]: + + +#@title Sudoku Game Implementation +from dataclasses import dataclass, field +from typing import List, Tuple, Optional +import random +import copy + +def _is_valid_placement(board: List[List[int]], row: int, col: int, num: int) -> bool: + """Check if placing num at (row, col) is valid.""" + # Check row + if num in board[row]: + return False + + # Check column + if num in [board[r][col] for r in range(9)]: + return False + + # Check 3x3 box + box_row, box_col = 3 * (row // 3), 3 * (col // 3) + for r in range(box_row, box_row + 3): + for c in range(box_col, box_col + 3): + if board[r][c] == num: + return False + + return True + +def _solve_sudoku(board: List[List[int]]) -> bool: + """Solve sudoku using backtracking (for puzzle generation).""" + for row in range(9): + for col in range(9): + if board[row][col] == 0: + for num in range(1, 10): + if _is_valid_placement(board, row, col, num): + board[row][col] = num + if _solve_sudoku(board): + return True + board[row][col] = 0 + return False + return True + +def _generate_complete_board(rng: random.Random) -> List[List[int]]: + """Generate a complete valid Sudoku board.""" + board = [[0 for _ in range(9)] for _ in range(9)] + + # Fill diagonal 3x3 boxes first (they don't affect each other) + for box in range(3): + nums = list(range(1, 10)) + rng.shuffle(nums) + for i in range(3): + for j in range(3): + board[box * 3 + i][box * 3 + j] = nums[i * 3 + j] + + # Solve the rest + _solve_sudoku(board) + return board + +@dataclass +class SudokuGame: + difficulty: int = 40 # Number of cells to remove (20 = easy, 40 = medium, 50 = hard) + seed: Optional[int] = None + _rng: random.Random = field(init = False, repr = False) + _board: List[List[int]] = field(init = False, repr = False) + _solution: List[List[int]] = field(init = False, repr = False) + _initial_board: List[List[int]] = field(init = False, repr = False) + _moves: int = field(default = 0, init = False, repr = False) + _state: str = field(default = "ongoing", init = False, repr = False) + + def __post_init__(self): + self._rng = random.Random(self.seed) + + # Generate complete board + complete_board = _generate_complete_board(self._rng) + self._solution = copy.deepcopy(complete_board) + + # Remove cells to create puzzle + self._board = copy.deepcopy(complete_board) + cells = [(r, c) for r in range(9) for c in range(9)] + self._rng.shuffle(cells) + + for r, c in cells[:self.difficulty]: + self._board[r][c] = 0 + + self._initial_board = copy.deepcopy(self._board) + self._update_state() + + def board(self) -> List[List[int]]: + """Return current board state.""" + return [row[:] for row in self._board] + + def initial_board(self) -> List[List[int]]: + """Return initial puzzle state.""" + return [row[:] for row in self._initial_board] + + def state(self) -> str: + """Return game state: 'ongoing', 'success', or 'failed'.""" + return self._state + + def moves(self) -> int: + """Return number of moves made.""" + return self._moves + + def place_number(self, row: int, col: int, num: int) -> bool: + """Place a number on the board. Returns True if valid move.""" + # Validate input + if not (0 <= row < 9 and 0 <= col < 9): + self._state = "failed" + return False + + if not (1 <= num <= 9): + self._state = "failed" + return False + + # Can't modify initial cells + if self._initial_board[row][col] != 0: + self._state = "failed" + return False + if self._board[row][col] != 0: + self._state = "failed" + return False + # Check if placement is valid + if not _is_valid_placement(self._board, row, col, num): + self._state = "failed" + return False + + # Place number + self._board[row][col] = num + self._moves += 1 + self._update_state() + return True + + def _update_state(self) -> None: + """Update game state based on current board.""" + # Check if puzzle is complete + if all(self._board[r][c] != 0 for r in range(9) for c in range(9)): + # Verify solution is correct + if self._board == self._solution: + self._state = "success" + else: + self._state = "failed" + else: + self._state = "ongoing" + + def pretty(self, colors: bool = True) -> str: + """Pretty print the Sudoku board.""" + RESET = "\x1b[0m" + INITIAL = "\x1b[38;5;45m" # Cyan for initial numbers + PLACED = "\x1b[38;5;226m" # Yellow for placed numbers + EMPTY = "\x1b[38;5;239m" # Gray for empty cells + + lines = [] + lines.append("┌───────┬───────┬───────┐") + + for row in range(9): + row_str = "│ " + for col in range(9): + num = self._board[row][col] + + if colors: + if num == 0: + row_str += f"{EMPTY}.{RESET}" + elif self._initial_board[row][col] != 0: + row_str += f"{INITIAL}{num}{RESET}" + else: + row_str += f"{PLACED}{num}{RESET}" + else: + row_str += str(num) if num != 0 else "." + + if col % 3 == 2: + row_str += " │ " + else: + row_str += " " + + lines.append(row_str.rstrip()) + + if row == 8: + lines.append("└───────┴───────┴───────┘") + elif row % 3 == 2: + lines.append("├───────┼───────┼───────┤") + + return "\n".join(lines) + + +# Test the Sudoku environment: + +# In[ ]: + + +# Create an easy puzzle +game = SudokuGame(difficulty = 30, seed = 42) +print("Initial puzzle:") +print(game.pretty()) +print(f"\nState: {game.state()}, Moves: {game.moves()}") + + +# In[ ]: + + +game + + +# Try making some moves: + +# In[ ]: + + +# Make a valid move +game.place_number(0, 1, 7) +print("\nAfter placing 7 at (1,0):") +print(game.pretty()) +print(f"State: {game.state()}, Moves: {game.moves()}") + + +# If we do some other action that's not part of the action space, we will get an error, and the game will not accept anymore actions. + +# # RL Environment Setup +# +# Execute strategies with time limits to prevent infinite loops. + +# In[ ]: + + +from typing import Callable +from unsloth import execute_with_time_limit + +def _execute_strategy(strategy: Callable, game: SudokuGame): + """Execute a strategy function on a Sudoku game.""" + assert callable(strategy) + + max_moves = 100 + valid_moves = 0 # Track successful moves + + while game.state() == "ongoing" and valid_moves < max_moves: + try: + board = game.board() + initial = game.initial_board() + result = strategy(board, initial) + + # Validate result format + if not isinstance(result, (tuple, list)) or len(result) != 3: + # Invalid format = immediate fail, but return valid moves made + return valid_moves, "failed" + + row, col, num = result + + # Validate types + if not all(isinstance(x, int) for x in [row, col, num]): + return valid_moves, "failed" + + # Try to place number + success = game.place_number(row, col, num) + + if success: + valid_moves += 1 # Count this valid move + else: + # Invalid move = game fails, but return valid_moves made so far + return valid_moves, "failed" + + except Exception: + return valid_moves, "failed" + + if valid_moves >= max_moves and game.state() == "ongoing": + return valid_moves, "failed" + + return valid_moves, game.state() + + +# To allow longer strategies for Reinforcement Learning, we shall allow a 10 second timer. + +# In[ ]: + + +@execute_with_time_limit(10) +def execute_strategy(strategy: Callable, game: SudokuGame): + """Execute strategy with 10 second time limit.""" + return _execute_strategy(strategy, game) + + +# Test with a simple strategy: + +# In[ ]: + + +def simple_strategy(board, initial): + """Simple strategy: fill first empty cell with 1.""" + for r in range(9): + for c in range(9): + if board[r][c] == 0 and initial[r][c] == 0: + return (r, c, 7) + return (0, 0, 7) + +game = SudokuGame(difficulty = 30, seed = 42) +try: + moves, state = execute_strategy(simple_strategy, game) + print(f"Moves: {moves}, State: {state}") +except TimeoutError as e: + print(f"Timed out: {e}") + + +# In[ ]: + + +print(game.pretty()) + + +# # Code Execution +# +# To execute and create a new Python function, we first have to check if the function does not call other global variables or cheat. This is called `countering reward hacking` since we don't want the function to cheat. +# +# For example the below piece of code is fine, since it only imports Python level functions. We use `check_python_modules`: + +# In[ ]: + + +from unsloth import check_python_modules, create_locked_down_function + +# Test safe code +sample = """ +def strategy(board, initial): + for r in range(9): + for c in range(9): + if board[r][c] == 0: + return (r, c, 1) + return (0, 0, 1) +""" + +ok, info = check_python_modules(sample) +print("Safe Python code?", ok) +print(info) + + +# For the below piece of code, since we import `numpy`, we should not allow the execution: + +# In[ ]: + + +sample = """ +def strategy(board, initial): + import numpy as np + return (0, 0, 1) +""" + +ok, info = check_python_modules(sample) +print("Safe Python code?", ok) +print(info) + + +# # Data & RL task setup +# +# Create the prompt that instructs the model to generate a Sudoku solving strategy. You can customize this to some other task for another RL task. + +# In[ ]: + + +prompt = """ +Create a Sudoku solving strategy using only native Python built-in functions without any import statements. +You are given two lists of lists (9x9 grids): +- board: current state (0 means empty) +- initial: starting puzzle (0 means was empty, numbers are fixed) + +Return a tuple (row, col, number) for the next move. +- row: 0-8 (row index) +- col: 0-8 (column index) +- number: 1-9 (digit to place) + +Only place numbers in cells that are BOTH empty in initial AND empty in board (initial[row][col] == 0 AND board[row][col] == 0) +Use Sudoku rules: no duplicates in rows, columns, or 3x3 boxes. +Output your function in backticks: +```python +def strategy(board, initial): + # Your logic here + return (row, col, number) +``` +All helper functions must be inside def strategy. Output only the function. +""".strip() + +print(prompt) + + +# First, let's prompt the model without RL and see how it goes: + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer +print("=" * 50) +print("BASE MODEL OUTPUT (before RL training):") +print("=" * 50) + +inputs = tokenizer( + text = text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +text_streamer = TextStreamer(tokenizer, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# # Reward functions +# +# We now design a `extract_function` function which simply extracts the function wrapped in 3 back ticks. +# +# And 3 reward functions: +# +# 1. `function_works` which rewards the model if the strategy is a valid Python function. +# 2. `no_cheating` which checks if the function imported other modules, and if it did, we penalize it. +# 3. `strategy_succeeds` which checks if the game strategy actually succeeds in attaining Sudoku after running the auto-generated strategy. + +# In[ ]: + + +def extract_function(text): + """Extract Python function from markdown code blocks.""" + if text.count("```") >= 2: + first = text.find("```") + 3 + second = text.find("```", first) + fx = text[first:second].strip() + fx = fx.removeprefix("python\n") + fx = fx[fx.find("def"):] + if fx.startswith("def strategy(board, initial):"): + return fx + return None + + +# **Reward 1: Function Works** +# +# Checks if the generated code is valid Python and can be executed. + +# In[ ]: + + +def function_works(completions, **kwargs): + """Reward for generating valid executable Python code.""" + scores = [] + for completion in completions: + score = 0 + response = completion[0]["content"] + function = extract_function(response) + + if function is not None: + ok, info = check_python_modules(function) + + if function is None or "error" in info: + score = -2.0 # Invalid function + else: + try: + new_strategy = create_locked_down_function(function) + score = 1.0 # Valid function + except: + score = -1.0 # Function has errors + + scores.append(score) + return scores + + +# **Reward 2: No Cheating** +# +# Penalizes functions that import external libraries. + +# In[ ]: + + +def no_cheating(completions, **kwargs): + """Penalize use of external imports.""" + scores = [] + for completion in completions: + response = completion[0]["content"] + function = extract_function(response) + + if function is not None: + ok, info = check_python_modules(function) + scores.append(1.0 if ok else -20.0) # Heavy penalty for cheating + else: + scores.append(-1.0) # Failed to create function + + return scores + + +# **Reward 3: Strategy Succeeds** +# +# Rewards strategies that successfully solve Sudoku puzzles. + +# In[ ]: + + +import numpy as np + +global PRINTER +PRINTER = 0 + +def strategy_succeeds(completions, **kwargs): + """Reward valid moves even if strategy eventually fails.""" + global PRINTER + scores = [] + + seed = np.random.randint(10000) + difficulty = 40 + for completion in completions: + printed = False + response = completion[0]["content"] + function = extract_function(response) + + if PRINTER % 5 == 0: + printed = True + print("\n" + "=" * 60) + print(function) + print("=" * 60) + PRINTER += 1 + + if function is not None: + ok, info = check_python_modules(function) + + if function is None or "error" in info: + scores.append(0) + continue + + try: + new_strategy = create_locked_down_function(function) + except: + scores.append(0) + continue + + try: + game = SudokuGame(difficulty = difficulty, seed = seed) + valid_moves, game_state = execute_strategy(new_strategy, game) + if valid_moves == difficulty: + game_state = "success" + + print(f"\n Valid moves: {valid_moves}, Final state: {game_state}") + + if not printed: + print("Strategy:") + print(function[:200] + "..." if len(function) > 200 else function) + + print("\nFinal board:") + print(game.pretty()) + + if game_state == "success": + scores.append(30.0) # Solved the puzzle! + elif valid_moves > 0: + # Reward based on valid moves made before failure + # Each valid move is worth 0.2 points + reward = valid_moves * 0.2 + scores.append(reward) + else: + scores.append(-2.0) # Failed immediately with no valid moves + + except TimeoutError: + print("Timeout") + scores.append(-1.0) + except Exception as e: + print(f"Exception: {str(e)[:100]}") + scores.append(-3.0) + + return scores + + +# # Dataset Preparation +# +# Create the training dataset. + +# In[ ]: + + +from datasets import Dataset + +dataset = Dataset.from_list([ + { + "prompt": [{"role": "user", "content": prompt.strip()}], + "answer": 0, + } +] * 1000) + +maximum_length = len(tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + add_generation_prompt = True +)) + +print(f"Maximum prompt length: {maximum_length}") +print("\nDataset sample:") +print(dataset[0]) + + +# +# ### Train the model +# +# Now set up GRPO Trainer and all configurations! We also support GSPO, GAPO, Dr GRPO and more! Go the Unsloth [Reinforcement Learning Docs](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) for more options. + +# In[ ]: + + +# Leave room for the prompt (plus 1 token safety margin) +max_completion_length = max_seq_length - (maximum_length + 1) + +from trl import GRPOConfig, GRPOTrainer +training_args = GRPOConfig( + temperature = 1.0, + learning_rate = 5e-5, + weight_decay = 0.001, + warmup_ratio = 0.1, + lr_scheduler_type = "linear", + optim = "adamw_8bit", + logging_steps = 1, + per_device_train_batch_size = 1, + gradient_accumulation_steps = 2, # Increase to 4 for smoother training + num_generations = 2, # Decrease if out of memory + max_completion_length = max_completion_length, + # num_train_epochs = 1, # Set to 1 for a full training run + max_steps = 60, + save_steps = 100, + report_to = "none", # Can use Weights & Biases, TrackIO + output_dir = "outputs", + epsilon = 0.2, + epsilon_high = 0.28, # one sided + delta = 1.5, # two sided + loss_type = 'bnpo', + mask_truncated_completions = True + # For optional training + evaluation + # fp16_full_eval = True, + # per_device_eval_batch_size = 4, + # eval_accumulation_steps = 1, + # eval_strategy = "steps", + # eval_steps = 1, +) + + +# And let's run the trainer! If you scroll up, you'll see a table of rewards. The goal is to see the `reward` column increase! +# +# You might have to wait 150 to 200 steps for any action. You'll probably get low reward for the first 100 steps. Please be patient! +# +# | Step | Training Loss | reward | reward_std | completion_length | kl | +# |------|---------------|-----------|------------|-------------------|----------| +# | 1 | 0.000000 | 0.125000 | 0.000000 | 200.000000 | 0.000000 | +# | 2 | 0.000000 | 0.072375 | 0.248112 | 200.000000 | 0.000000 | +# | 3 | 0.000000 | -0.079000 | 0.163776 | 182.500000 | 0.000005 | + +# In[ ]: + + +# For optional training + evaluation +# new_dataset = dataset.train_test_split(test_size = 0.01) + +trainer = GRPOTrainer( + model = model, + processing_class = tokenizer, + reward_funcs = [ + function_works, + no_cheating, + strategy_succeeds, + ], + args = training_args, + train_dataset = dataset, + + # For optional training + evaluation + # train_dataset = new_dataset["train"], + # eval_dataset = new_dataset["test"], +) + + +# And let's train the model! +# +# **NOTE** A T4 free GPU might take 5 minutes for one generation sadly since it's an old GPU - A100 or H100 will be much faster! + +# In[ ]: + + +trainer.train() + + +# And now with the LoRA we just trained with GRPO - we first save the LoRA first! + +# In[ ]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") + + +# Verify LoRA is actually trained! + +# In[ ]: + + +from safetensors import safe_open + +tensors = {} +with safe_open("grpo_saved_lora/adapter_model.safetensors", framework = "pt") as f: + # Verify both A and B are non zero + for key in f.keys(): + tensor = f.get_tensor(key) + n_zeros = (tensor == 0).sum() / tensor.numel() + assert(n_zeros.item() != tensor.numel()) + + +# +# # Inference +# Now let's try the model we just trained! + +# In[ ]: + + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": prompt.strip()}], + tokenize = False, + add_generation_prompt = True, +) + +from transformers import TextStreamer + +_ = model.generate( + **tokenizer(images = None,text = text, return_tensors = "pt").to("cuda"), + temperature = 1.0, + max_new_tokens = 512, + streamer = TextStreamer(tokenizer, skip_prompt = False), +) + + +# +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16 or `merged_4bit` for int4. We also allow `lora` adapters as a fallback. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[ ]: + + +# Merge to 16bit +if False: model.save_pretrained_merged("gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_16bit", tokenizer, save_method = "merged_16bit", token = "YOUR_HF_TOKEN") + +# Merge to 4bit +if False: model.save_pretrained_merged("gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit",) +if False: model.push_to_hub_merged("HF_USERNAME/gemma_4_finetune_4bit", tokenizer, save_method = "merged_4bit", token = "YOUR_HF_TOKEN") + +# Just LoRA adapters +if False: + model.save_pretrained("gemma_4_lora") + tokenizer.save_pretrained("gemma_4_lora") +if False: + model.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + tokenizer.push_to_hub("HF_USERNAME/gemma_4_lora", token = "YOUR_HF_TOKEN") + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now! We clone `llama.cpp` and we default save it to `q8_0`. We allow all methods like `q4_k_m`. Use `save_pretrained_gguf` for local saving and `push_to_hub_gguf` for uploading to HF. +# +# Some supported quant methods (full list on our [docs page](https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf)): +# * `q8_0` - Fast conversion. High resource use, but generally acceptable. +# * `q4_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K. +# * `q5_k_m` - Recommended. Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K. +# +# [**NEW**] To finetune and auto export to Ollama, try our [Ollama notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) + +# In[ ]: + + +# Save to 8bit Q8_0 +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer,) +# Remember to go to https://huggingface.co/settings/tokens for a token! +# And change hf to your username! +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, token = "YOUR_HF_TOKEN") + +# Save to 16bit GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "f16") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "f16", token = "YOUR_HF_TOKEN") + +# Save to q4_k_m GGUF +if False: model.save_pretrained_gguf("gemma_4_finetune", tokenizer, quantization_method = "q4_k_m") +if False: model.push_to_hub_gguf("HF_USERNAME/gemma_4_finetune", tokenizer, quantization_method = "q4_k_m", token = "YOUR_HF_TOKEN") + +# Save to multiple GGUF options - much faster if you want multiple! +if False: + model.push_to_hub_gguf( + "HF_USERNAME/gemma_4_finetune", # Change hf to your username! + tokenizer, + quantization_method = ["q4_k_m", "q8_0", "q5_k_m",], + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma_4_finetune.Q8_0.gguf` file or `gemma_4_finetune.Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Audio.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Audio.py new file mode 100644 index 0000000..8fe447a --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Audio.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a **free** Tesla T4 Google Colab instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch +from huggingface_hub import snapshot_download + +fourbit_models = [ + # Gemma 4 models + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B-it", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-E4B-it", + dtype = None, # None for auto detection + max_seq_length = 8192, # Choose any for long context! + load_in_4bit = True, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR. + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **processor.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + do_sample = False, + streamer = TextStreamer(processor, skip_prompt = True), + ) + + +#

Let's Evaluate Gemma 4 Baseline Performance on German Transcription

+ +# In[5]: + + +from datasets import load_dataset,Audio,concatenate_datasets + +dataset = load_dataset("kadirnar/Emilia-DE-B000000", split = "train") + +# Select a single audio sample to reserve for testing. +# This index is chosen from the full dataset before we create the smaller training split. +test_audio = dataset[7546] + +dataset = dataset.select(range(3000)) + +dataset = dataset.cast_column("audio", Audio(sampling_rate = 16000)) + + +# In[6]: + + +from IPython.display import Audio, display +print(test_audio['text']) +Audio(test_audio['audio']['array'],rate = test_audio['audio']['sampling_rate']) + + +# And the translation of the audio from German to English is: +# +# > I—I hold myself directly accountable. That much is, of course, clear: namely, that there are political interests involved in trade—in the exchange of goods—and that political influences are at play. The question is: that should not be the alternative. + +# In[7]: + + +messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": test_audio['audio']['array']}, + {"type": "text", "text": "Please transcribe this audio."} + ] + } +] + +do_gemma_4_inference(messages, max_new_tokens = 256) + + +#

Baseline Model Performance: 32.43% Word Error Rate (WER) for this sample !

+ +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text and audio parts + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[8]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 8, # The larger, the higher the accuracy, but might overfit + lora_alpha = 16, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = [ + "q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj", + + # Audio layers + "post", "linear_start", "linear_end", + "embedding_projection", + "ffw_layer_1", "ffw_layer_2", + "output_proj", + ] +) + + +# +# ### Data Prep +# We adapt the `kadirnar/Emilia-DE-B000000` dataset for our German ASR task using Gemma 4 multi-modal chat format. Each audio-text pair is structured into a conversation with `system`, `user`, and `assistant` roles. The processor then converts this into the final training format: +# +# ``` +# <|turn>system +# You are an assistant that transcribes speech accurately. +# <|turn>user +# <|audio|>Please transcribe this audio. +# <|turn>model +# Ich, ich rechne direkt mich an. + +# In[9]: + + +def format_intersection_data(samples: dict) -> dict[str, list]: + """Format intersection dataset to match expected message format""" + formatted_samples = {"messages": []} + for idx in range(len(samples["audio"])): + audio = samples["audio"][idx]["array"] + label = str(samples["text"][idx]) + + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": audio}, + {"type": "text", "text": "Please transcribe this audio."} + ] + }, + { + "role": "assistant", + "content":[{"type": "text", "text": label}] + } + ] + formatted_samples["messages"].append(message) + return formatted_samples + + +# In[10]: + + +dataset = dataset.map(format_intersection_data, batched = True, batch_size = 4, num_proc = 4) + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[11]: + + +# Use UnslothVisionDataCollator which handles audio token alignment correctly +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 8, + gradient_accumulation_steps = 1, + warmup_ratio = 0.03, + # num_train_epochs = 1, # Use for full training runs + max_steps = 60, + learning_rate = 5e-5, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", + remove_unused_columns = False, + + # The below are a must for audio finetuning: + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 8192, + ) +) + + +# In[12]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[13]: + + +trainer_stats = trainer.train() + + +# In[14]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` but for this example we use `do_sample=False` for ASR. + +# In[15]: + + +messages = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": test_audio['audio']['array']}, + {"type": "text", "text": "Please transcribe this audio."} + ] + } +] + +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[16]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[17]: + + +if False: + from unsloth import FastModel + model, processor = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = processor.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(processor, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[18]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4", processor) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[19]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", processor, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[20]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + processor, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[21]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + processor, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Text.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Text.py new file mode 100644 index 0000000..b68f835 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Text.py @@ -0,0 +1,557 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab L4 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth +# +# `FastModel` supports loading nearly any model now! This includes Vision and Text models! + +# In[3]: + + +from unsloth import FastModel +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, tokenizer = FastModel.from_pretrained( + model_name = "unsloth/gemma-4-E4B-it", + dtype = None, # None for auto detection + max_seq_length = 1024, # Choose any for long context! + load_in_4bit = True, # 4 bit quantization to reduce memory + full_finetuning = False, # [NEW!] We have full finetuning now! + # token = "YOUR_HF_TOKEN", # HF Token for gated models +) + + +# # Gemma 4 can process Text, Vision and Audio! +# +# Let's first experience how Gemma 4 can handle multimodal inputs. We use Gemma 4's recommended settings of `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[4]: + + +from transformers import TextStreamer +# Helper function for inference +def do_gemma_4_inference(messages, max_new_tokens = 128): + _ = model.generate( + **tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + tokenize = True, + return_dict = True, + return_tensors = "pt", + ).to("cuda"), + max_new_tokens = max_new_tokens, + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), + use_cache = True + ) + + +# # Gemma 4 can see images! +# +# Alt text + +# In[5]: + + +sloth_link = "https://files.worldwildlife.org/wwfcmsprod/images/Sloth_Sitting_iStock_3_12_2014/story_full_width/8l7pbjmj29_iStock_000011145477Large_mini__1_.jpg" + +messages = [{ + "role" : "user", + "content": [ + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "Which films does this animal feature in?" } + ] +}] +# You might have to wait 1 minute for Unsloth's auto compiler +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# Let's make a poem about sloths! + +# In[6]: + + +messages = [{ + "role": "user", + "content": [{ "type" : "text", + "text" : "Write a poem about sloths." }] +}] +do_gemma_4_inference(messages) + + +# # Gemma 4 can also hear! + +# In[7]: + + +from IPython.display import Audio, display +Audio("https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3") + + +# In[8]: + + +get_ipython().system('wget -qqq https://www.nasa.gov/wp-content/uploads/2015/01/591240main_JFKmoonspeech.mp3 -O audio.mp3') + + +# In[9]: + + +audio_file = "audio.mp3" + +messages = [{ + "role" : "user", + "content": [ + { "type": "audio", "audio" : audio_file }, + { "type": "text", "text" : "What is this audio about?" } + ] +}] +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# # Let's combine all 3 modalities together! + +# In[10]: + + +messages = [{ + "role" : "user", + "content": [ + { "type": "audio", "audio" : audio_file }, + { "type": "image", "image" : sloth_link }, + { "type": "text", "text" : "What is this audio and image about? "\ + "How are they related?" } + ] +}] +do_gemma_4_inference(messages, max_new_tokens = 256) + + +# # Let's finetune Gemma 4! +# +# You can finetune the vision and text parts for now through selection - the audio part can also be finetuned - we're working to make it selectable as well! + +# We now add LoRA adapters so we only need to update a small amount of parameters! + +# In[11]: + + +model = FastModel.get_peft_model( + model, + finetune_vision_layers = False, # Turn off for just text! + finetune_language_layers = True, # Should leave on! + finetune_attention_modules = True, # Attention good for GRPO + finetune_mlp_modules = True, # Should leave on always! + + r = 8, # Larger = higher accuracy, but might overfit + lora_alpha = 8, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, +) + + +# +# ### Data Prep +# We now use the `Gemma-4` format for conversation style finetunes. We use [Maxime Labonne's FineTome-100k](https://huggingface.co/datasets/mlabonne/FineTome-100k) dataset in ShareGPT style. Gemma-4 renders multi turn conversations like below: +# +# ``` +# <|turn>user +# Hello +# <|turn>model +# Hey there! +# ``` +# We use our `get_chat_template` function to get the correct chat template. We support `zephyr, chatml, mistral, llama, alpaca, vicuna, vicuna_old, phi3, llama3, phi4, qwen2.5, gemma3, gemma-4` and more. + +# In[12]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4", +) + + +# We get the first 3000 rows of the dataset + +# In[13]: + + +from datasets import load_dataset +dataset = load_dataset("mlabonne/FineTome-100k", split = "train[:3000]") + + +# We now use `standardize_data_formats` to try converting datasets to the correct format for finetuning purposes! + +# In[14]: + + +from unsloth.chat_templates import standardize_data_formats +dataset = standardize_data_formats(dataset) + + +# Let's see how row 100 looks like! + +# In[15]: + + +dataset[100] + + +# We now have to apply the chat template for `Gemma-4` onto the conversations, and save it to `text`. We remove the `` token using removeprefix(`''`) since we're finetuning. The Processor will add this token before training and the model expects only one. + +# In[16]: + + +def formatting_prompts_func(examples): + convos = examples["conversations"] + texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False).removeprefix('') for convo in convos] + return { "text" : texts, } + +dataset = dataset.map(formatting_prompts_func, batched = True) + + +# Let's see how the chat template did! Notice there is no `` token as the processor tokenizer will be adding one. + +# In[17]: + + +dataset[100]["text"] + + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. + +# In[18]: + + +from trl import SFTTrainer, SFTConfig +trainer = SFTTrainer( + model = model, + tokenizer = tokenizer, + train_dataset = dataset, + eval_dataset = None, # Can set up evaluation! + args = SFTConfig( + dataset_text_field = "text", + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, # Use GA to mimic batch size! + warmup_steps = 5, + # num_train_epochs = 1, # Set this for 1 full training run. + max_steps = 60, + learning_rate = 2e-4, # Reduce to 2e-5 for long training runs + logging_steps = 1, + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "linear", + seed = 3407, + report_to = "none", # Use TrackIO/WandB etc + ), +) + + +# We also use Unsloth's `train_on_completions` method to only train on the assistant outputs and ignore the loss on the user's inputs. This helps increase accuracy of finetunes! + +# In[19]: + + +from unsloth.chat_templates import train_on_responses_only +trainer = train_on_responses_only( + trainer, + instruction_part = "<|turn>user\n", + response_part = "<|turn>model\n", +) + + +# Let's verify masking the instruction part is done! Let's print the 100th row again. Notice how the sample only has a single `` as expected! + +# In[20]: + + +tokenizer.decode(trainer.train_dataset[100]["input_ids"]) + + +# Now let's print the masked out example - you should see only the answer is present: + +# In[21]: + + +tokenizer.decode([tokenizer.pad_token_id if x == -100 else x for x in trainer.train_dataset[100]["labels"]]).replace(tokenizer.pad_token, " ") + + +# In[22]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# # Let's train the model! +# +# To resume a training run, set `trainer.train(resume_from_checkpoint = True)` + +# In[23]: + + +trainer_stats = trainer.train() + + +# In[24]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model via Unsloth native inference! According to the `Gemma-4` team, the recommended settings for inference are `temperature = 1.0, top_p = 0.95, top_k = 64` + +# In[25]: + + +from unsloth.chat_templates import get_chat_template +tokenizer = get_chat_template( + tokenizer, + chat_template = "gemma-4", +) +messages = [{ + "role": "user", + "content": [{ + "type" : "text", + "text" : "Continue the sequence: 1, 1, 2, 3, 5, 8,", + }] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") +outputs = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, +) +tokenizer.batch_decode(outputs) + + +# You can also use a `TextStreamer` for continuous inference - so you can see the generation token by token, instead of waiting the whole time! + +# In[26]: + + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "Why is the sky blue?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 64, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, either use Hugging Face's `push_to_hub` for an online save or `save_pretrained` for a local save. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[27]: + + +model.save_pretrained("gemma_4_lora") # Local saving +tokenizer.save_pretrained("gemma_4_lora") +# model.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# tokenizer.push_to_hub("HF_ACCOUNT/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[28]: + + +if False: + from unsloth import FastModel + model, tokenizer = FastModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + max_seq_length = 2048, + load_in_4bit = True, + ) + +messages = [{ + "role": "user", + "content": [{"type" : "text", "text" : "What is Gemma-4?",}] +}] +inputs = tokenizer.apply_chat_template( + messages, + add_generation_prompt = True, # Must add for generation + return_tensors = "pt", + tokenize = True, + return_dict = True, +).to("cuda") + +from transformers import TextStreamer +_ = model.generate( + **inputs, + max_new_tokens = 128, # Increase for longer outputs! + # Recommended Gemma-4 settings! + temperature = 1.0, top_p = 0.95, top_k = 64, + streamer = TextStreamer(tokenizer, skip_prompt = True), +) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly for deployment! We save it in the folder `gemma-4-finetune`. Set `if False` to `if True` to let it run! + +# In[29]: + + +if False: # Change to True to save finetune! + model.save_pretrained_merged("gemma-4-finetune", tokenizer) + + +# If you want to upload / push to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[30]: + + +if False: # Change to True to upload finetune + model.push_to_hub_merged( + "HF_ACCOUNT/gemma-4-finetune", tokenizer, + token = "YOUR_HF_TOKEN" + ) + + +# ### GGUF / llama.cpp Conversion +# To save to `GGUF` / `llama.cpp`, we support it natively now for all models! For now, you can convert easily to `Q8_0, F16 or BF16` precision. `Q4_K_M` for 4bit will come later! + +# In[31]: + + +if False: # Change to True to save to GGUF + model.save_pretrained_gguf( + "gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # For now only Q8_0, BF16, F16 supported + ) + + +# Likewise, if you want to instead push to GGUF to your Hugging Face account, set `if False` to `if True` and add your Hugging Face token and upload location! + +# In[32]: + + +if False: # Change to True to upload GGUF + model.push_to_hub_gguf( + "HF_ACCOUNT/gemma_4_finetune", + tokenizer, + quantization_method = "Q8_0", # Only Q8_0, BF16, F16 supported + token = "YOUR_HF_TOKEN", + ) + + +# Now, use the `gemma-4-finetune.gguf` file or `gemma-4-finetune-Q4_K_M.gguf` file in llama.cpp. +# +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Vision.py b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Vision.py new file mode 100644 index 0000000..007a399 --- /dev/null +++ b/tooling/fine-tuning/unsloth/python_scripts/Gemma4_(E4B)-Vision.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python +# coding: utf-8 + +# To run this, press "*Runtime*" and press "*Run all*" on a Google Colab L4 instance! +#
+# +# +# Join Discord if you need help + ⭐ Star us on Github ⭐ +#
+# +# To install Unsloth on your local device, follow [our guide](https://unsloth.ai/docs/get-started/install). This notebook is licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). +# +# You will learn how to do [data prep](#Data), how to [train](#Train), how to [run the model](#Inference), & how to save it + +# ### News + +# Introducing **Unsloth Studio** - a new open source, no-code web UI to train and run LLMs. [Blog](https://unsloth.ai/docs/new/studio) • [Notebook](https://colab.research.google.com/github/unslothai/unsloth/blob/main/studio/Unsloth_Studio_Colab.ipynb) +# +# +# +# +#
Unsloth Studio Training UI
Train models — no code needed
Unsloth Studio Chat UI
Run GGUF models on Mac, Windows & Linux
+# +# Train MoEs - DeepSeek, GLM, Qwen and gpt-oss 12x faster with 35% less VRAM. [Blog](https://unsloth.ai/docs/new/faster-moe) +# +# Ultra Long-Context Reinforcement Learning is here with 7x more context windows! [Blog](https://unsloth.ai/docs/new/grpo-long-context) +# +# New in Reinforcement Learning: [FP8 RL](https://unsloth.ai/docs/new/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/new/vision-reinforcement-learning-vlm-rl) • [Standby](https://unsloth.ai/docs/basics/memory-efficient-rl) • [gpt-oss RL](https://unsloth.ai/docs/new/gpt-oss-reinforcement-learning) +# +# Visit our docs for all our [model uploads](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks). + +# # ### Installation +# +# # In[1]: +# +# +# get_ipython().run_cell_magic('capture', '', 'import os, re\nif "COLAB_" not in "".join(os.environ.keys()):\n !pip install unsloth # Do this in local & cloud setups\nelse:\n import torch; v = re.match(r\'[\\d]{1,}\\.[\\d]{1,}\', str(torch.__version__)).group(0)\n xformers = \'xformers==\' + {\'2.10\':\'0.0.34\',\'2.9\':\'0.0.33.post1\',\'2.8\':\'0.0.32.post2\'}.get(v, "0.0.34")\n !pip install sentencepiece protobuf "datasets==4.3.0" "huggingface_hub>=0.34.0" hf_transfer\n !pip install --no-deps unsloth_zoo bitsandbytes accelerate {xformers} peft trl triton unsloth\n!pip install --no-deps transformers==5.5.0\n!pip install torchcodec\nimport torch; torch._dynamo.config.recompile_limit = 64;\n') +# +# +# # In[2]: +# +# +# get_ipython().run_cell_magic('capture', '', '!pip install --no-deps --upgrade timm # For Gemma 4 vision/audio\n') +# +# +# # ### Unsloth + +# In[3]: + + +from unsloth import FastVisionModel # FastLanguageModel for LLMs +import torch + +gemma4_models = [ + # Gemma-4 instruct models: + "unsloth/gemma-4-E2B-it", + "unsloth/gemma-4-E4B-it", + "unsloth/gemma-4-31B-it", + "unsloth/gemma-4-26B-A4B-it", + # Gemma-4 base models: + "unsloth/gemma-4-E2B", + "unsloth/gemma-4-E4B", + "unsloth/gemma-4-31B", + "unsloth/gemma-4-26B-A4B", +] # More models at https://huggingface.co/unsloth + +model, processor = FastVisionModel.from_pretrained( + "unsloth/gemma-4-E4B-it", + load_in_4bit = True, # Use 4bit to reduce memory use. False for 16bit LoRA. + use_gradient_checkpointing = "unsloth", # True or "unsloth" for long context +) + + +# We now add LoRA adapters for parameter efficient fine-tuning, allowing us to train only 1% of all model parameters efficiently. +# +# **[NEW]** We also support fine-tuning only the vision component, only the language component, or both. Additionally, you can choose to fine-tune the attention modules, the MLP layers, or both! + +# In[4]: + + +model = FastVisionModel.get_peft_model( + model, + finetune_vision_layers = True, # False if not finetuning vision layers + finetune_language_layers = True, # False if not finetuning language layers + finetune_attention_modules = True, # False if not finetuning attention layers + finetune_mlp_modules = True, # False if not finetuning MLP layers + + r = 32, # The larger, the higher the accuracy, but might overfit + lora_alpha = 32, # Recommended alpha == r at least + lora_dropout = 0, + bias = "none", + random_state = 3407, + use_rslora = False, # We support rank stabilized LoRA + loftq_config = None, # And LoftQ + target_modules = "all-linear", # Optional now! Can specify a list if needed +) + + +# +# ### Data Prep +# We'll use a sampled dataset of handwritten math formulas. The objective is to convert these images into a computer-readable format—specifically LaTeX—so they can be rendered. This is particularly useful for complex expressions. +# +# You can access the dataset [here](https://huggingface.co/datasets/unsloth/LaTeX_OCR). The full dataset is [here](https://huggingface.co/datasets/linxy/LaTeX_OCR). + +# In[5]: + + +from datasets import load_dataset +dataset = load_dataset("unsloth/LaTeX_OCR", split = "train") + + +# Let's take an overview of the dataset. We'll examine the second image and its corresponding caption. + +# In[6]: + + +dataset + + +# In[7]: + + +dataset[2]["image"] + + +# In[8]: + + +dataset[2]["text"] + + +# We can also render LaTeX directly in the browser! + +# In[9]: + + +from IPython.display import display, Math, Latex + +latex = dataset[3]["text"] +display(Math(latex)) + + +# To format the dataset, all vision fine-tuning tasks should follow this format: +# +# ```python +# [ +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# { +# "role": "user", +# "content": [ +# {"type": "text", "text": instruction}, +# {"type": "image", "image": sample["image"]}, +# ], +# }, +# ] +# ``` + +# In[10]: + + +instruction = "Write the LaTeX representation for this image." + +def convert_to_conversation(sample): + conversation = [ + { + "role": "user", + "content": [ + {"type": "text", "text": instruction}, + {"type": "image", "image": sample["image"]}, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": sample["text"]}]}, + ] + return {"messages": conversation} +pass + + +# Let's convert the dataset into the "correct" format for finetuning: + +# In[11]: + + +converted_dataset = [convert_to_conversation(sample) for sample in dataset] + + +# The first example is now structured like below: + +# In[12]: + + +converted_dataset[0] + + +# Lets take the Gemma 4 instruction chat template and use it in our base model + +# In[13]: + + +from unsloth import get_chat_template + +processor = get_chat_template( + processor, + "gemma-4" +) + + +# Before fine-tuning, let us evaluate the base model's performance. We do not expect strong results, as it has not encountered this chat template before. + +# In[14]: + + +image = dataset[2]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# You can see it's absolutely terrible! It doesn't follow instructions at all + +# +# ### Train the model +# Now let's train our model. We do 60 steps to speed things up, but you can set `num_train_epochs=1` for a full run, and turn off `max_steps=None`. We also support `DPOTrainer` and `GRPOTrainer` for reinforcement learning! +# +# We use our new `UnslothVisionDataCollator` which will help in our vision finetuning setup. + +# In[15]: + + +from unsloth.trainer import UnslothVisionDataCollator +from trl import SFTTrainer, SFTConfig + +trainer = SFTTrainer( + model = model, + train_dataset = converted_dataset, + processing_class = processor.tokenizer, + data_collator = UnslothVisionDataCollator(model, processor), + args = SFTConfig( + per_device_train_batch_size = 1, + gradient_accumulation_steps = 4, + max_grad_norm = 0.3, + warmup_ratio = 0.03, + max_steps = 60, + # num_train_epochs = 2, # Set this instead of max_steps for full training runs + learning_rate = 2e-4, + logging_steps = 1, + save_strategy = "steps", + optim = "adamw_8bit", + weight_decay = 0.001, + lr_scheduler_type = "cosine", + seed = 3407, + output_dir = "outputs", + report_to = "none", # For Weights and Biases or others + + # You MUST put the below items for vision finetuning: + remove_unused_columns = False, + dataset_text_field = "", + dataset_kwargs = {"skip_prepare_dataset": True}, + max_length = 2048, + ) +) + + +# In[16]: + + +# @title Show current memory stats +gpu_stats = torch.cuda.get_device_properties(0) +start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3) +print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.") +print(f"{start_gpu_memory} GB of memory reserved.") + + +# In[17]: + + +trainer_stats = trainer.train() + + +# In[18]: + + +# @title Show final memory and time stats +used_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3) +used_memory_for_lora = round(used_memory - start_gpu_memory, 3) +used_percentage = round(used_memory / max_memory * 100, 3) +lora_percentage = round(used_memory_for_lora / max_memory * 100, 3) +print(f"{trainer_stats.metrics['train_runtime']} seconds used for training.") +print( + f"{round(trainer_stats.metrics['train_runtime']/60, 2)} minutes used for training." +) +print(f"Peak reserved memory = {used_memory} GB.") +print(f"Peak reserved memory for training = {used_memory_for_lora} GB.") +print(f"Peak reserved memory % of max memory = {used_percentage} %.") +print(f"Peak reserved memory for training % of max memory = {lora_percentage} %.") + + +# +# ### Inference +# Let's run the model! You can modify the instruction and input—just leave the output blank. +# +# We'll use the best hyperparameters for inference on Gemma: `top_p=0.95`, `top_k=64`, and `temperature=1.0`. + +# In[19]: + + +image = dataset[10]["image"] +instruction = "Write the LaTeX representation for this image." + +messages = [ + { + "role": "user", + "content": [{"type": "image"}, {"type": "text", "text": instruction}], + } +] + +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) + +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor, skip_prompt = True) +result = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# +# ### Saving, loading finetuned models +# To save the final model as LoRA adapters, use Hugging Face’s `push_to_hub` for online saving, or `save_pretrained` for local storage. +# +# **[NOTE]** This ONLY saves the LoRA adapters, and not the full model. To save to 16bit or GGUF, scroll down! + +# In[20]: + + +model.save_pretrained("gemma_4_lora") # Local saving +processor.save_pretrained("gemma_4_lora") +# model.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving +# processor.push_to_hub("your_name/gemma_4_lora", token = "YOUR_HF_TOKEN") # Online saving + + +# Now if you want to load the LoRA adapters we just saved for inference, set `False` to `True`: + +# In[21]: + + +if False: + from unsloth import FastVisionModel + + model, processor = FastVisionModel.from_pretrained( + model_name = "gemma_4_lora", # YOUR MODEL YOU USED FOR TRAINING + load_in_4bit = True, # Set to False for 16bit LoRA + ) + +sample = dataset[1] +image = sample["image"].convert("RGB") +messages = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": sample["text"], + }, + { + "type": "image", + }, + ], + }, +] +input_text = processor.apply_chat_template(messages, add_generation_prompt = True) +inputs = processor( + image, + input_text, + add_special_tokens = False, + return_tensors = "pt", +).to("cuda") + +from transformers import TextStreamer + +text_streamer = TextStreamer(processor.tokenizer, skip_prompt = True) +_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128, + use_cache = True, temperature = 1.0, top_p = 0.95, top_k = 64) + + +# ### Saving to float16 for VLLM +# +# We also support saving to `float16` directly. Select `merged_16bit` for float16. Use `push_to_hub_merged` to upload to your Hugging Face account! You can go to https://huggingface.co/settings/tokens for your personal tokens. See [our docs](https://unsloth.ai/docs/basics/inference-and-deployment) for more deployment options. + +# In[22]: + + +# Select ONLY 1 to save! (Both not needed!) + +# Save locally to 16bit +if False: model.save_pretrained_merged("unsloth_finetune", processor,) + +# To export and save to your Hugging Face account +if False: model.push_to_hub_merged("YOUR_USERNAME/unsloth_finetune", processor, token = "YOUR_HF_TOKEN") + + +# And we're done! If you have any questions on Unsloth, we have a [Discord](https://discord.gg/unsloth) channel! If you find any bugs or want to keep updated with the latest LLM stuff, or need help, join projects etc, feel free to join our Discord! +# +# Some other resources: +# 1. Train your own reasoning model - Llama GRPO notebook [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb) +# 2. Saving finetunes to Ollama. [Free notebook](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_(8B)-Ollama.ipynb) +# 3. Llama 3.2 Vision finetuning - Radiography use case. [Free Colab](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(11B)-Vision.ipynb) +# 4. See notebooks for DPO, ORPO, Continued pretraining, conversational finetuning and more on our [documentation](https://unsloth.ai/docs/get-started/unsloth-notebooks)! +# +#
+# +# +# +# +# Join Discord if you need help + ⭐️ Star us on Github ⭐️ +#
+# +# This notebook and all Unsloth notebooks are licensed [LGPL-3.0](https://github.com/unslothai/notebooks?tab=LGPL-3.0-1-ov-file#readme). diff --git a/tooling/gemma-family/codegemma.md b/tooling/gemma-family/codegemma.md new file mode 100644 index 0000000..cbf1933 --- /dev/null +++ b/tooling/gemma-family/codegemma.md @@ -0,0 +1,88 @@ +# CodeGemma + +Code completion / generation with native **fill-in-the-middle (FIM)** support. Built on **Gemma 1** — still the most recent generation as of April 2026. No CodeGemma 2/3/4 release. + +## What it is + +Gemma 1 fine-tuned on code. Trained with 80–90% FIM rate, 50/50 split between PSM (Prefix-Suffix-Middle) and SPM (Suffix-Prefix-Middle) formats. Designed for IDE autocomplete more than chat. + +## Sizes + +- **2B pretrained** — fast completion +- **7B pretrained** — higher quality completion + FIM +- **7B instruction-tuned** — code chat + +Versioned point releases exist (2B 1.1, 7B-IT 1.1). + +## Model card + +- https://ai.google.dev/gemma/docs/codegemma/model_card +- HF: https://huggingface.co/google/codegemma-7b +- Tech report: https://arxiv.org/abs/2406.11409 + +## FIM tokens + +``` +<|fim_prefix|> prefix-of-completion marker +<|fim_suffix|> cursor/insertion-point marker +<|fim_middle|> generation trigger +<|file_separator|> multi-file boundary +``` + +### PSM (Prefix-Suffix-Middle) template + +``` +<|fim_prefix|>[code before cursor]<|fim_suffix|>[code after cursor]<|fim_middle|> +``` + +Example: + +```python +prompt = ( + "<|fim_prefix|>import datetime\n" + "def calculate_age(birth_year):\n" + " current_year = datetime.date.today().year\n" + " <|fim_suffix|>\n" + " return age<|fim_middle|>" +) +``` + +The model generates the middle chunk and halts. + +### Multi-file context + +Prepend referenced files separated by `<|file_separator|>`, then the target file in FIM format. + +## Minimum invocation + +```python +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch + +model_id = "google/codegemma-7b" +tokenizer = AutoTokenizer.from_pretrained(model_id) +model = AutoModelForCausalLM.from_pretrained( + model_id, torch_dtype=torch.bfloat16, device_map="auto" +) + +prompt = "<|fim_prefix|>def fib(n):\n if n <= 1:\n return n\n <|fim_suffix|>\n return a<|fim_middle|>" +inputs = tokenizer(prompt, return_tensors="pt").to("cuda") +out = model.generate(**inputs, max_new_tokens=128) +print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=False)) +``` + +## Ollama + +`ollama pull codegemma:7b` or `codegemma:2b`. Ollama wraps the FIM tokens for you when you use its completion API with prefix/suffix. + +## When to choose it over base Gemma 4 + +- You need **IDE-grade FIM autocomplete** — CodeGemma was trained for it, base Gemma 4 was not. +- You want a **2B code model** — base Gemma 4 skips this size (E2B is multimodal, not code-specialized). +- You want **Ollama-native FIM** that tools like `continue.dev` can talk to. + +Base Gemma 4 31B still beats CodeGemma 7B on LiveCodeBench, so for **agentic coding** (plan, write, execute) Gemma 4 or `qwen3-coder:30b` wins. CodeGemma is the inline-cursor-assistant niche. + +## Homelab fit + +Steel141 already has qwen3-coder:30b and qwen3-coder-next:79.7B — those are stronger than CodeGemma 7B. Only reason to pull CodeGemma is if you want a tiny 2B FIM model for a latency-sensitive editor integration on a Pi or on pve197 alongside the vision stack. diff --git a/tooling/gemma-family/datagemma.md b/tooling/gemma-family/datagemma.md new file mode 100644 index 0000000..1f2f7a4 --- /dev/null +++ b/tooling/gemma-family/datagemma.md @@ -0,0 +1,76 @@ +# DataGemma + +LLM grounding with Google **Data Commons** — a public knowledge graph of 240B+ statistical data points (economics, health, demographics, science). Built on **Gemma 2 27B**. No Gemma 3 or 4 generation yet. + +## What it is + +Two flavors: + +- **DataGemma RIG** (Retrieval-Interleaved Generation): Model is fine-tuned to emit inline Data Commons queries wrapped around its own claims. Outputs look like `The population of Sunnyvale is [__DC__("population of Sunnyvale") --> "152,200"]`. An external resolver substitutes the real stat. +- **DataGemma RAG** (Retrieval-Augmented Generation): Standard RAG pipeline — query Data Commons, inject results into context, generate. + +## Sizes + +- **27B instruct** only (`datagemma-rig-27b-it`, `datagemma-rag-27b-it`). + +## Model cards + +- https://ai.google.dev/gemma/docs/datagemma +- DeepMind: https://deepmind.google/models/gemma/datagemma/ +- HF RIG: https://huggingface.co/google/datagemma-rig-27b-it +- HF RAG: https://huggingface.co/google/datagemma-rag-27b-it +- Paper: https://docs.datacommons.org/papers/DataGemma-FullPaper.pdf + +## Performance claim + +Baseline Gemma 2 factuality on the 101-query statistical eval: **5–17%**. DataGemma RIG: **~58%**. The improvement is narrow (statistical claims only) but real. + +## Prompt format + +No special template. Plain natural-language input. The difference is in the **training** and the **output format**. + +**RIG output example:** +``` +Sunnyvale has [__DC__("total population of Sunnyvale CA") --> "152,200"] +residents as of 2020, with a median age of [__DC__("median age of +Sunnyvale CA") --> "34.8"]. +``` + +Post-processing: regex out the `[__DC__("...") --> "..."]` blocks and either (a) replace with resolved Data Commons values, or (b) render as inline citations. + +**RAG flow:** query Data Commons first, inject tabular context, then prompt normally. + +## Minimum invocation — RIG + +```python +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch + +model_id = "google/datagemma-rig-27b-it" +tokenizer = AutoTokenizer.from_pretrained(model_id) +model = AutoModelForCausalLM.from_pretrained( + model_id, device_map="auto", torch_dtype=torch.bfloat16 +) + +prompt = "What are the demographic trends in Sunnyvale, California?" +inputs = tokenizer(prompt, return_tensors="pt").to("cuda") +out = model.generate(**inputs, max_new_tokens=1024) +print(tokenizer.batch_decode( + out[:, inputs["input_ids"].shape[1]:], + skip_special_tokens=True +)[0]) +``` + +Then run a resolver that extracts each `[__DC__(q) --> ""]` and hits the Data Commons API. + +## When to choose it over base Gemma 4 + +- You're building a **statistics-grounded assistant** (government data, public health, economic indicators) and need low hallucination on numbers. +- You're okay with a **27B model** — DataGemma only ships at this size. +- Your domain overlaps Data Commons coverage (US-heavy, but growing internationally). + +Base Gemma 4 + a conventional RAG pipeline can do the same thing if you bring your own retriever. DataGemma's value is the **trained inline-citation behavior** (RIG) — Gemma 4 won't emit that format without prompting gymnastics. + +## Homelab fit + +Low. No current Seth project leans on statistical grounding. Niche for a news-summary use case (POS-Automation daily print) if Seth ever wants "US inflation was X% as of Y" kind of interjections — but then a simple Data Commons API call from the script is cheaper than running a 27B model. diff --git a/tooling/gemma-family/dolphingemma.md b/tooling/gemma-family/dolphingemma.md new file mode 100644 index 0000000..419252d --- /dev/null +++ b/tooling/gemma-family/dolphingemma.md @@ -0,0 +1,44 @@ +# DolphinGemma + +Marine biology / dolphin vocalization model. Developed with the Wild Dolphin Project (WDP) and Georgia Tech. Announced April 2025. + +## Status + +**Not publicly released as of April 2026.** DeepMind's page states "DolphinGemma is currently in development. On release, it will be openly available." No weights on Hugging Face, Kaggle, or Google AI for Developers. Google's 2025 post anticipated a summer 2025 open-source release; that slipped. + +If you see a `dolphingemma-*` tag somewhere, it is either community-named (not Google) or a leaked checkpoint. Verify the uploader is `google/` on HF. + +## What it is (from announcement material) + +- **Audio-in, audio-out** model. +- Trained on tens of thousands of hours of Atlantic spotted dolphin vocalizations. +- Predicts the next sound in a sequence (same training objective as an LLM, just in the audio token domain). +- **~400M parameters** — small enough to run on a Pixel phone in the field. +- Intended to plug into the CHAT (Cetacean Hearing Augmentation Telemetry) system to accelerate real-time pattern recognition during dolphin interactions. + +## Base generation + +Announced as "built on Google's open Gemma series." Google has not disclosed which generation. Given the mid-2025 timing and 400M size, most likely Gemma 3-era tech, but **this is an educated guess**, not confirmed. + +## Model card + +- DeepMind: https://deepmind.google/models/gemma/dolphingemma/ +- Blog: https://blog.google/innovation-and-ai/products/dolphingemma/ + +No model card on ai.google.dev yet (expected once released). + +## Prompt format + +Not published. The audio-token I/O format will depend on the tokenizer Google picked (e.g., SoundStream, Whisper-style, or a custom cetacean-phoneme tokenizer). Wait for release. + +## Minimum invocation + +Not possible. No weights available. + +## When to choose it + +If and when it ships: marine biology research, specifically Atlantic spotted dolphins. Fine-tunable for other cetacean species per Google. + +## Homelab fit + +Zero for normal use. If it ships and Seth wants a novelty "run the model on a cheap Pi and watch it hallucinate dolphin whistles" project, it's a candidate for the 400M-parameter slot on seth-pi. Until then, nothing to deploy. diff --git a/tooling/gemma-family/embeddinggemma.md b/tooling/gemma-family/embeddinggemma.md new file mode 100644 index 0000000..7cb6475 --- /dev/null +++ b/tooling/gemma-family/embeddinggemma.md @@ -0,0 +1,93 @@ +# EmbeddingGemma + +On-device text embedding model. Released **September 2025**. Built on **Gemma 3 with T5Gemma initialization**. No Gemma 4 generation yet. + +## What it is + +A **308M-parameter** open embedding model. Trained on 100+ languages. State-of-the-art on MTEB for its size class. Uses **Matryoshka Representation Learning (MRL)** — one model produces embeddings at 768, 512, 256, or 128 dimensions by truncation + renormalization, with graceful quality degradation. + +## Sizes + +- **308M** — only size. + +## Model card + +- https://ai.google.dev/gemma/docs/embeddinggemma/model_card +- HF: https://huggingface.co/google/embeddinggemma-300m +- HF blog: https://huggingface.co/blog/embeddinggemma +- DeepMind: https://deepmind.google/models/gemma/embeddinggemma/ +- Paper: https://arxiv.org/html/2509.20354v2 + +## Prompt format + +EmbeddingGemma uses **task-prefixed inputs** — you prepend a task descriptor to each string before embedding. + +### Query prompts + +``` +task: {task description} | query: {your query} +``` + +Default task description: `search result`. + +Example: `task: search result | query: what is the capital of France?` + +### Document prompts + +``` +title: {title or "none"} | text: {document text} +``` + +Providing a real title improves retrieval; use `none` if unavailable. + +Example: `title: Eiffel Tower | text: The Eiffel Tower is a wrought-iron lattice tower...` + +## Minimum invocation + +### Sentence-Transformers (easy path) + +```python +from sentence_transformers import SentenceTransformer + +model = SentenceTransformer("google/embeddinggemma-300m") + +query = "Which planet is known as the Red Planet?" +documents = [ + "Mars, known for its reddish appearance, is often referred to as the Red Planet.", + "Venus is often called Earth's twin due to its similar size.", +] + +q_emb = model.encode_query(query) +d_emb = model.encode_document(documents) + +print(model.similarity(q_emb, d_emb)) +``` + +The `encode_query` / `encode_document` methods apply the task prefixes automatically. + +### Shorter embeddings (MRL) + +```python +emb_768 = model.encode(text) # full +emb_256 = emb_768[:, :256] # truncate +emb_256 = emb_256 / emb_256.norm(dim=-1, keepdim=True) # renormalize +``` + +## Gotcha + +**Activations do not support `float16`.** Use `bfloat16` or `float32`. This is explicit in the model card. + +## When to choose it over base Gemma 4 + +Always, when you want embeddings. Base Gemma 4 is a generative decoder — not trained as an embedding model. EmbeddingGemma is the correct tool for retrieval, clustering, semantic search, RAG. + +Its main competitor is `nomic-embed-text` (already in Seth's pantry). EmbeddingGemma's MRL and multilingual coverage (100+ vs. nomic's ~English-focused) are the differentiators. + +## Homelab fit + +**Highest-impact variant for Seth right now, along with TranslateGemma.** + +- **Family history agent:** 100+ language support + 128d embeddings = tight, multilingual indices over scanned documents, letters, census records. MRL lets you serve fast 128d approximate search and fall back to 768d for reranking. +- **SearXNG / SethSearch:** drop-in upgrade from nomic-embed-text for the semantic-search layer. Bigger model but better quality. +- **Mortdecai memory:** use 308M EmbeddingGemma for long-term memory over chat logs. Small enough to run alongside the big mortdecai qwen35 models on pve197 or steel141 without resource contention. +- **Gemma-cookbook already has a tutorial** (`tutorials_RAG_EmbeddingGemma.ipynb` in the corpus) — skip straight to working code. diff --git a/tooling/gemma-family/index.md b/tooling/gemma-family/index.md new file mode 100644 index 0000000..753af47 --- /dev/null +++ b/tooling/gemma-family/index.md @@ -0,0 +1,55 @@ +# Gemma family index (as of April 2026) + +Specialized sister models Google has released alongside base Gemma. Base Gemma 4 instruct/base variants are **not** listed here — they live in the main corpus at `/home/claude/bin/gemma4-research/`. + +## Summary table + +| Variant | Base gen | Sizes | Canonical use case | HF URL | +|---|---|---|---|---| +| **ShieldGemma** | Gemma 2 | 2B, 9B, 27B | Text safety classification (4 harm types) | [google/shieldgemma-2b](https://huggingface.co/google/shieldgemma-2b) | +| **ShieldGemma 2** | Gemma 3 | 4B | Image safety classification (3 categories) | [google/shieldgemma-2-4b-it](https://huggingface.co/google/shieldgemma-2-4b-it) | +| **CodeGemma** | Gemma 1 | 2B, 7B, 7B-IT | Code completion with FIM tokens | [google/codegemma-7b](https://huggingface.co/google/codegemma-7b) | +| **PaliGemma** | Gemma 1 | 3B | Vision-language (task-prefix prompting) | [google/paligemma-3b-mix-448](https://huggingface.co/google/paligemma-3b-mix-448) | +| **PaliGemma 2** | Gemma 2 | 3B, 10B, 28B | Vision-language, multi-resolution | [google/paligemma2-3b-pt-448](https://huggingface.co/google/paligemma2-3b-pt-448) | +| **RecurrentGemma** | Gemma 1 | 2B, 9B | Griffin architecture, long-context throughput | [google/recurrentgemma-9b](https://huggingface.co/google/recurrentgemma-9b) | +| **DataGemma (RIG/RAG)** | Gemma 2 | 27B | Statistical grounding via Google Data Commons | [google/datagemma-rig-27b-it](https://huggingface.co/google/datagemma-rig-27b-it) | +| **MedGemma 1.5** | Gemma 3 | 4B multimodal | Medical text + image comprehension (non-clinical) | [google/medgemma-1.5-4b-it](https://huggingface.co/google/medgemma-1.5-4b-it) | +| **TxGemma** | Gemma 2 | 2B, 9B, 27B | Therapeutics/drug-discovery prediction | [google/txgemma-27b-predict](https://huggingface.co/google/txgemma-27b-predict) | +| **DolphinGemma** | Gemma (unstated) | ~400M | Marine biology / dolphin vocalization | *Not released as of April 2026* | +| **SignGemma** | Gemma 3-era | small on-device | ASL → English translation | *Limited preview only; no public weights as of April 2026* | +| **TranslateGemma** | Gemma 3 | 4B, 12B, 27B | 55-language text + image translation | [google/translategemma-4b-it](https://huggingface.co/google/translategemma-4b-it) | +| **EmbeddingGemma** | Gemma 3 (T5Gemma init) | 308M | On-device text embeddings, MRL (768/512/256/128) | [google/embeddinggemma-300m](https://huggingface.co/google/embeddinggemma-300m) | +| **T5Gemma / T5Gemma 2** | Gemma 2 / Gemma 3 | small → 4B-4B | Encoder-decoder for summarization, translation | [google/t5gemma-2-4b-4b](https://huggingface.co/google/t5gemma-2-4b-4b) | +| **FunctionGemma** | Gemma 3 | 270M | Function-calling specialist | [google/functiongemma-270m](https://huggingface.co/google/functiongemma-270m) | +| **VaultGemma** | Gemma 3 | 1B | Differential-privacy-trained LLM | [google/vaultgemma-1b](https://huggingface.co/google/vaultgemma-1b) | +| **Gemma-APS** | Gemma 2 | 2B, 7B | Abstractive proposition segmentation | — | +| **Gemma Scope / Scope 2** | Gemma 2/3 | SAE suite | Mechanistic interpretability | [google/gemma-scope](https://huggingface.co/google/gemma-scope) | + +## Gemma 4 generation status + +**As of 2026-04-18, no specialized sister model has been re-based to Gemma 4.** Every variant in the table above is built on Gemma 1, 2, or 3. The newest specialized releases (TranslateGemma, Jan 2026; T5Gemma 2, Dec 2025) still sit on Gemma 3. This is normal for Google's cadence — sisters lag the base release by 3–6 months. Expect a MedGemma-on-Gemma-4, ShieldGemma-3-on-Gemma-4, and PaliGemma 3 over summer/fall 2026. + +## Per-variant files + +- `shieldgemma.md` — covers both ShieldGemma (text) and ShieldGemma 2 (image) +- `codegemma.md` +- `paligemma.md` — covers both PaliGemma and PaliGemma 2 +- `recurrentgemma.md` +- `datagemma.md` +- `medgemma.md` +- `txgemma.md` +- `dolphingemma.md` +- `signgemma.md` +- `translategemma.md` +- `embeddinggemma.md` +- `other-variants.md` — T5Gemma, FunctionGemma, VaultGemma, Gemma-APS, Gemma Scope + +## Picking a variant for homelab use + +Short read — see individual files for depth. + +- **Minecraft agent (Mortdecai):** consider `FunctionGemma` (270M) as a fast-path tool-router in front of the big `mortdecai:*` models. Today's setup uses the base `qwen35`/`mortdecai` tool calling, but FunctionGemma's 270M size makes it cheap enough to run as a gateway classifier. +- **AI music video gen / visualizer:** `PaliGemma 2` for detailed captioning of reference frames; `ShieldGemma 2` to pre-filter generated output before publishing. Base Gemma 4 vision (tested in existing corpus) handles the "describe this image" job fine — reach for PaliGemma 2 when you need spatial grounding (detect/segment task prefixes). +- **Family history agent:** `EmbeddingGemma` (308M) is the immediate win — small, multilingual, 100+ languages, MRL to 128d for tight indices. Pair with `TranslateGemma` if sources are in German/Polish/etc. For ingest of old scanned documents, `PaliGemma 2` + `TranslateGemma` handles image-embedded text translation. +- **General safety pass for anything going public:** `ShieldGemma 2` for images, `ShieldGemma` (Gemma 2-based) for text. Both run comfortably on pve197's CT 105. +- **Skip for homelab:** MedGemma (disclaimer-laden, not clinical-grade, niche), TxGemma (drug discovery, highly specialist), DolphinGemma (not released), SignGemma (limited preview, no weights). diff --git a/tooling/gemma-family/medgemma.md b/tooling/gemma-family/medgemma.md new file mode 100644 index 0000000..81515eb --- /dev/null +++ b/tooling/gemma-family/medgemma.md @@ -0,0 +1,72 @@ +# MedGemma + +Medical-domain variant for text + image comprehension. Current release is **MedGemma 1.5** (Jan 13, 2026), built on **Gemma 3**. **No Gemma 4 generation.** + +## What it is + +Gemma 3 fine-tuned on de-identified medical corpora — clinical notes, radiology images, dermatology images, histopathology, etc. The multimodal variants use a SigLIP image encoder trained specifically on medical imagery (not the base SigLIP). + +## Sizes + +**MedGemma 1.5** (current): **4B multimodal IT only**. Previous 27B variants were in MedGemma 1; 1.5 currently ships 4B only with improvements in medical reasoning, records interpretation, and image interpretation. + +**MedGemma 1** (prior): 4B multimodal, 27B text-only, 27B multimodal. + +## Model card + +- https://developers.google.com/health-ai-developer-foundations/medgemma/model-card +- DeepMind: https://deepmind.google/models/gemma/medgemma/ +- Repo: https://github.com/google-health/medgemma +- Tech report: https://arxiv.org/abs/2507.05201 + +## Intended use + +"A starting point that enables more efficient development of downstream healthcare applications involving medical text and images." **Developer tool, not a clinical product.** + +### Disclaimer (near-verbatim from model card) + +> The outputs generated by MedGemma are not intended to directly inform clinical diagnosis, patient management decisions, treatment recommendations, or any other direct clinical practice applications. All outputs require independent verification and clinical correlation. + +Terms of use are governed by **Health AI Developer Foundations** — a separate license from base Gemma's. Read it before shipping anything. + +## Prompt format + +Standard Gemma 3 chat template. Content messages accept `{"type": "image"}` and `{"type": "text"}`. + +## Minimum invocation + +```python +from transformers import pipeline +from PIL import Image +import requests, torch + +pipe = pipeline( + "image-text-to-text", + model="google/medgemma-1.5-4b-it", + torch_dtype=torch.bfloat16, + device="cuda", +) + +img_url = "https://upload.wikimedia.org/wikipedia/commons/c/c8/Chest_Xray_PA_3-8-2010.png" +image = Image.open(requests.get(img_url, stream=True).raw) + +messages = [{"role": "user", "content": [ + {"type": "image", "image": image}, + {"type": "text", "text": "Describe this chest X-ray. What anatomical structures are visible?"}, +]}] + +out = pipe(text=messages, max_new_tokens=512) +print(out[0]["generated_text"][-1]["content"]) +``` + +## When to choose it over base Gemma 4 + +- You're building **healthcare dev tools** (medical image triage assistant, doctor-facing records summarizer, clinician education) and want the SigLIP-medical image encoder. +- You can accept the Health AI Developer Foundations license and embed the disclaimers. +- You need **medical-vocabulary fluency** (SNOMED, ICD, RxNorm) that base Gemma 4 doesn't have at the 4B size. + +Use base Gemma 4 otherwise — including for health-adjacent content that isn't clinical (fitness logs, nutrition, sleep data). + +## Homelab fit + +Zero. Seth is not running medical apps. Noted for completeness only. diff --git a/tooling/gemma-family/other-variants.md b/tooling/gemma-family/other-variants.md new file mode 100644 index 0000000..be7ce83 --- /dev/null +++ b/tooling/gemma-family/other-variants.md @@ -0,0 +1,74 @@ +# Other Gemma variants + +Smaller / more specialized sisters that don't warrant a full file each. All on Gemma 2 or Gemma 3. **None on Gemma 4 as of April 2026.** + +## T5Gemma / T5Gemma 2 + +**Encoder-decoder** Gemma, built by adapting decoder-only Gemma weights into a T5-style encoder-decoder via UL2 or PrefixLM pretraining. + +- **T5Gemma** (Jul 2025): Gemma 2-based. Sizes include 2B-2B, 9B-2B, 9B-9B plus new T5-sized small/base/large/XL models. +- **T5Gemma 2** (Dec 2025): Gemma 3-based. Sizes: 270M-270M, 1B-1B, 4B-4B. Multimodal (128K context). + +### When to pick it + +- **Summarization, translation, QA** where the encoder's separate bidirectional attention buys quality. +- Anywhere a decoder-only Gemma feels wasteful for "read input, compress into short output" tasks. + +HF: https://huggingface.co/google/t5gemma-2-4b-4b +Blog: https://developers.googleblog.com/en/t5gemma/ + +## FunctionGemma + +**270M tool/function-calling specialist.** Gemma 3-based. Released Dec 2025. + +Trained to emit structured function calls given a tool catalog. Not a generalist chat model — feed it a user message + tool schemas and it picks the right tool. Tiny enough to run as a pre-router in front of a larger model. + +### When to pick it + +- **Minecraft agent (Mortdecai):** plausibly interesting — use it as a 270M gateway that classifies intent and picks one of the Mortdecai tools, then hands off to the bigger `mortdecai:*` model for reasoning. Latency/cost savings if the tool decision is hot-path. +- Any agent where tool-selection volume is high and model call cost matters. + +HF: search `google/functiongemma-270m`. + +## VaultGemma + +**1B Gemma 3 trained with differential privacy.** Released Sep 2025. + +The point is the training process (DP-SGD with rigorous privacy budget) more than the weights per se. Useful as a reference checkpoint or for deployments where "model cannot have memorized training data" is a hard requirement. + +### When to pick it + +- Niche. You almost never need DP-trained weights unless you're in regulated space. + +## Gemma-APS + +**Abstractive Proposition Segmentation.** 2B and 7B on Gemma 2. Oct 2024. + +Takes a passage, splits it into atomic propositions (self-contained factual statements). Useful for fact-checking, citation mapping, and as a preprocessing step for RAG indexing. + +### When to pick it + +- Building a **fact-verification pipeline** where you need to decompose generated text into checkable claims. +- **Family history** — could decompose narrative biographical text into timestamped facts for structured storage. + +## Gemma Scope / Gemma Scope 2 + +Sparse autoencoder (SAE) suites for **mechanistic interpretability** research. Gemma Scope on Gemma 2, Gemma Scope 2 on Gemma 3 (Dec 2025). + +Not models you deploy for product work. Tools for "which neurons activate on what" research. + +HF: https://huggingface.co/google/gemma-scope + +### When to pick it + +- Interpretability research only. Not a homelab deployment candidate. + +## Summary of homelab relevance + +| Variant | Homelab fit | +|---|---| +| T5Gemma 2 4B-4B | Moderate — summarization for the news-briefing printer | +| FunctionGemma 270M | **High — tool-router for Mortdecai** | +| VaultGemma | None | +| Gemma-APS | Low-moderate — niche preprocessing step | +| Gemma Scope | None (research tool) | diff --git a/tooling/gemma-family/paligemma.md b/tooling/gemma-family/paligemma.md new file mode 100644 index 0000000..6de23c2 --- /dev/null +++ b/tooling/gemma-family/paligemma.md @@ -0,0 +1,80 @@ +# PaliGemma / PaliGemma 2 + +Vision-language model combining a **SigLIP** image encoder with a Gemma text decoder. Separate product line from base Gemma 4's built-in vision. Still on Gemma 2 as of April 2026 — **no PaliGemma 3 or PaliGemma-on-Gemma-4 yet.** + +## What it is + +- **PaliGemma** (May 2024): Gemma 1 + SigLIP-So400m/14. Sizes: 3B only. Built for task-prefix prompting (`caption`, `detect`, `segment`, `ocr`). +- **PaliGemma 2** (Dec 2024): Gemma 2 + SigLIP-So400m/14. Sizes: 3B, 10B, 28B. Each available at three resolutions: 224x224, 448x448, 896x896. +- **PaliGemma 2 mix** (Feb 2025): task-mixed instruction-tuned variant — works better out-of-the-box on ad-hoc VQA without per-task fine-tuning. + +## Sizes (PaliGemma 2) + +| Text decoder | Image encoder | Total | Resolutions | +|---|---|---|---| +| Gemma 2 2B | SigLIP-So400m | ~3B | 224 / 448 / 896 | +| Gemma 2 9B | SigLIP-So400m | ~10B | 224 / 448 / 896 | +| Gemma 2 27B | SigLIP-So400m | ~28B | 224 / 448 / 896 | + +## Model cards + +- PaliGemma 2: https://ai.google.dev/gemma/docs/paligemma/model-card-2 +- DeepMind: https://deepmind.google/models/gemma/paligemma-2/ +- HF blog: https://huggingface.co/blog/paligemma2 + +## Prompt format + +PaliGemma uses **task-prefix** prompting, not chat turns. Format: + +``` +{task} {args} +``` + +Known task prefixes (not exhaustive; Google under-documents the full list): + +| Prefix | Purpose | Example | +|---|---|---| +| `caption {lang}` | Image captioning | `caption en` | +| `ocr` | Read all text in image | `ocr` | +| `answer en {q}` | VQA | `answer en what color is the car?` | +| `detect {obj}` | Object detection (bounding boxes) | `detect cat ; dog` | +| `segment {obj}` | Segmentation masks | `segment person` | + +For `detect` and `segment`, output uses custom location (``) and segmentation (``) tokens. You need the PaliGemma postprocessing routines to convert them to pixel coords. + +## Minimum invocation — PaliGemma 2 + +```python +from transformers import AutoProcessor, PaliGemmaForConditionalGeneration +from PIL import Image +import requests, torch + +model_id = "google/paligemma2-3b-mix-448" +model = PaliGemmaForConditionalGeneration.from_pretrained( + model_id, torch_dtype=torch.bfloat16 +).to("cuda") +processor = AutoProcessor.from_pretrained(model_id) + +image = Image.open(requests.get( + "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png", + stream=True +).raw).convert("RGB") + +prompt = "caption en" +inputs = processor(prompt, image, return_tensors="pt").to("cuda") +out = model.generate(**inputs, max_new_tokens=200) +gen = processor.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True) +print(gen) +``` + +## When to choose it over base Gemma 4 vision + +- You need **structured spatial output** — bounding boxes, segmentation masks. Base Gemma 4 vision returns freeform text; PaliGemma 2 returns grid-aligned location tokens. +- You're doing **pure VQA or captioning at scale** and want a smaller, faster, task-specialized 3B model (vs. Gemma 4 E4B at 4B-effective). +- You're **fine-tuning** for a narrow vision task — PaliGemma 2 is explicitly designed to be easy to fine-tune; Google ships LoRA recipes. + +Use base Gemma 4 for **conversational multimodal** (back-and-forth with images + text reasoning). PaliGemma is the "turn image into structured text" workhorse. + +## Homelab fit + +For `ai-visualizer` (CT 167, pve197 with V100): PaliGemma 2 3B-448 is a great caption-and-ground step when producing SDXL prompts from reference images. Already tested: base Gemma 4 E4B handles "describe this image" at ~25 tok/s on pve197. PaliGemma 2 would add `detect`/`segment` for spatial control (e.g., "put the character in the upper-left quadrant of the generated scene"). diff --git a/tooling/gemma-family/recurrentgemma.md b/tooling/gemma-family/recurrentgemma.md new file mode 100644 index 0000000..fa6c020 --- /dev/null +++ b/tooling/gemma-family/recurrentgemma.md @@ -0,0 +1,67 @@ +# RecurrentGemma + +Griffin-architecture sibling. Built on **Gemma 1**. No Gemma 2/3/4 generation — the line has effectively stalled, with long-context Transformer variants (Gemma 4 with 256K context) overtaking the memory-efficiency argument. + +## What it is + +Gated linear recurrences + local sliding-window attention, replacing full self-attention. Fixed-size hidden state → **O(1) memory per token generated**, no KV cache growth. Inference stays fast and cheap as context lengthens. + +## Sizes + +- **2B** pretrained + instruct +- **9B** pretrained + instruct + +Only two sizes. No 27B. Griffin scaling beyond 9B is an open research question and Google didn't ship it. + +## Model card + +- https://ai.google.dev/gemma/docs/recurrentgemma/model_card +- DeepMind: https://deepmind.google/models/gemma/recurrentgemma/ +- Paper: https://arxiv.org/abs/2404.07839 +- Repo: https://github.com/google-deepmind/recurrentgemma + +## Architecture highlights + +- **Griffin block:** alternates two residual recurrent blocks with a local MQA attention block. +- **State size:** fixed — independent of sequence length. +- **Sliding window:** local attention only, not global. +- **Trade-off:** loses some needle-in-haystack precision vs. a full-attention Transformer, gains memory flatness. + +## Prompt format + +Standard Gemma turn format — same `user … ` as Gemma 1 IT. No RecurrentGemma-specific tokens. + +## Minimum invocation + +```python +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch + +model_id = "google/recurrentgemma-9b-it" +tokenizer = AutoTokenizer.from_pretrained(model_id) +model = AutoModelForCausalLM.from_pretrained( + model_id, torch_dtype=torch.bfloat16, device_map="auto" +) + +prompt = "user\nWrite a haiku about memory.\nmodel\n" +inputs = tokenizer(prompt, return_tensors="pt").to("cuda") +out = model.generate(**inputs, max_new_tokens=100) +print(tokenizer.decode(out[0], skip_special_tokens=True)) +``` + +## When to choose it over base Gemma 4 + +Honestly: **rarely, in April 2026.** + +The original pitch was "long-context generation without KV blowup." Gemma 4 now ships with 256K context on the 26B/31B and 128K on the edge models, with efficient attention implementations. The gap RecurrentGemma was filling has narrowed. + +Reasonable residual cases: +- **Extremely memory-constrained hardware** (Jetson Nano tier) where even quantized Gemma 4 E2B KV cache is the limiting factor on sequence length. +- **Streaming-generation workloads** where latency-per-token must stay constant as output length grows into the tens of thousands of tokens. +- **Research interest** in recurrent LLMs. + +For typical homelab use, skip. The V100 on pve197 has 32GB VRAM; Gemma 4 31B at Q4 fits with room for generous context. + +## Homelab fit + +Not a strong candidate for any current Seth project. Note for file: if a CPU-only streaming-transcript use case ever comes up (e.g., running on seth-pi for always-on audio processing), RecurrentGemma 2B could reappear in scope. diff --git a/tooling/gemma-family/shieldgemma.md b/tooling/gemma-family/shieldgemma.md new file mode 100644 index 0000000..83dd4f9 --- /dev/null +++ b/tooling/gemma-family/shieldgemma.md @@ -0,0 +1,89 @@ +# ShieldGemma / ShieldGemma 2 + +Safety classifiers. Two separate product lines now: **ShieldGemma** (text, built on Gemma 2) and **ShieldGemma 2** (images, built on Gemma 3). There is no Gemma 4 generation yet. + +## What it is + +- **ShieldGemma (text):** LLM-as-a-judge safety classifier. Takes a prompt + optional model response + a policy, emits `Yes`/`No` (yes = violates policy). Four harm types. +- **ShieldGemma 2 (image):** Image classifier. Takes a PIL image, emits probabilities across three image-safety categories. Image-only — does not accept text. + +## Sizes + +- ShieldGemma: **2B, 9B, 27B** — all instruction-tuned. +- ShieldGemma 2: **4B** — only size available. + +## Model cards + +- Text: https://ai.google.dev/gemma/docs/shieldgemma/model_card +- Image: https://huggingface.co/google/shieldgemma-2-4b-it +- DeepMind: https://deepmind.google/models/gemma/shieldgemma-2/ + +## Safety categories + +**ShieldGemma (text):** +1. Sexually explicit content +2. Dangerous content +3. Hate speech +4. Harassment + +**ShieldGemma 2 (image):** +1. Sexually explicit content +2. Dangerous content +3. Violence / gore + +Note the image model dropped "hate" and "harassment" (hard to define visually) and added "violence/gore" (a visual primitive). + +## Text prompt format (ShieldGemma) + +Five-component structure: + +``` + + +user + + + +model + + + +Our safety principle is defined in the below: +* + +Does the human prompt/response violate the above principle? Your answer must start with 'Yes' or 'No'. +``` + +The model outputs one token: `Yes` (violates) or `No` (safe). Softmax the logits on those two tokens for a calibrated score. + +## Minimum invocation — ShieldGemma 2 (image) + +```python +from transformers import AutoProcessor, ShieldGemma2ForImageClassification +from PIL import Image +import torch + +model_id = "google/shieldgemma-2-4b-it" +model = ShieldGemma2ForImageClassification.from_pretrained(model_id).eval() +processor = AutoProcessor.from_pretrained(model_id) + +image = Image.open("input.jpg") +inputs = processor(images=[image], return_tensors="pt") + +with torch.inference_mode(): + out = model(**inputs) + +print(out.probabilities) # tensor of per-category "Yes" probabilities +``` + +## When to choose it over base Gemma 4 + +- You need a **calibrated safety score**, not a free-form "is this safe?" answer from the chat model. ShieldGemma emits Yes/No token logits — easy to threshold. +- You want **policy-by-policy classification** (e.g., run each category separately with different thresholds). +- You're running a moderation pipeline and need **a small, fast, purpose-trained classifier** rather than a general chat model reasoning about safety. + +Use base Gemma 4 for "explain *why* this is unsafe" narrative output. ShieldGemma is the yes/no stamp. + +## Homelab fit + +Pre-filter for `ai-visualizer` (CT 167, pve197) before publishing generated images. ShieldGemma 2 4B at Q4 fits comfortably on the Tesla V100-PCIE-32GB alongside SDXL. diff --git a/tooling/gemma-family/signgemma.md b/tooling/gemma-family/signgemma.md new file mode 100644 index 0000000..e64d4fa --- /dev/null +++ b/tooling/gemma-family/signgemma.md @@ -0,0 +1,43 @@ +# SignGemma + +ASL (American Sign Language) → English translation model. Announced at Google I/O 2025. + +## Status + +**Limited preview only. No open weights as of April 2026.** Google published an interest form at I/O 2025; access has been gated to language-service providers, accessibility researchers, and members of the Deaf community. Participants receive a TensorFlow Lite package and sample integration code. + +There is no public Hugging Face entry under `google/signgemma*`. The original plan was general availability by end-of-2025, which slipped. No updated timeline announced as of April 2026. + +## What it is (from announcement material) + +- **Video-in, text-out** on-device model. +- Best performance on **ASL → English**; training includes other sign languages for future expansion. +- Uses a **vision transformer** to analyze hand shapes, facial expressions, and motion, followed by a compact language model that produces English output. +- Sized for **smartphones and laptops** — on-device real-time translation is the design goal. + +## Base generation + +Google states it is "part of the Gemma family" and "built on the Gemini Nano framework." Likely Gemma 3-era image/video encoder on a small Gemma 3 text decoder — **not confirmed**, and the "Gemini Nano framework" language suggests it may use Gemini-not-Gemma internals despite the name. Verify at release. + +## Model card + +- LinkedIn announcement: https://www.linkedin.com/posts/googledeepmind_signgemma-is-our-most-advanced-model-for-activity-7342957078249955329-JwJJ +- Slator coverage: https://slator.com/google-invites-feedback-for-signgemma-a-new-ai-sign-language-translation-model/ + +No public model card yet. + +## Prompt format + +Not published. + +## Minimum invocation + +Not possible. No weights available. + +## When to choose it + +On release: accessibility apps, live captioning for Deaf users, sign-language learning tools. + +## Homelab fit + +Zero for typical homelab use. If Seth ever wants to pilot a real-time captioning overlay for video streams this could matter — but not buildable until Google ships weights. diff --git a/tooling/gemma-family/translategemma.md b/tooling/gemma-family/translategemma.md new file mode 100644 index 0000000..a9b0d29 --- /dev/null +++ b/tooling/gemma-family/translategemma.md @@ -0,0 +1,105 @@ +# TranslateGemma + +Multilingual text + image translation. Released **January 15, 2026**. Built on **Gemma 3** (not Gemma 4, despite being the newest variant at time of writing). + +## What it is + +Gemma 3 fine-tuned for translation across **55 languages**, using a two-stage distillation from Gemini. Retains Gemma 3's multimodal capability — can translate text embedded in images. + +## Sizes + +- **4B IT** +- **12B IT** +- **27B IT** + +Google's headline claim: the 12B beats Gemma 3 27B baseline translation quality with less than half the parameters. + +## Model card + +- HF: https://huggingface.co/google/translategemma-4b-it +- Blog: https://blog.google/innovation-and-ai/technology/developers-tools/translategemma/ +- InfoQ: https://www.infoq.com/news/2026/01/google-translategemma-models/ + +## Supported languages + +55 languages via ISO 639-1 codes (`en`, `de`, `es`, `fr`, `pl`, `ja`, `zh`, `ar`, `hi`, etc.) plus regional variants (`en-US`, `en-GB`, `pt-BR`, `pt-PT`, `de-DE`, `de-AT`, `de-CH`, `zh-CN`, `zh-TW`, etc.). + +## Prompt format + +**Strict chat-template format.** Content list must contain exactly **one entry**, with mandatory `source_lang_code` and `target_lang_code`. + +### Text translation + +```python +messages = [{ + "role": "user", + "content": [{ + "type": "text", + "source_lang_code": "cs", + "target_lang_code": "de-DE", + "text": "V nejhorším případě i k prasknutí čočky.", + }], +}] +``` + +### Image translation (translates text inside the image) + +```python +messages = [{ + "role": "user", + "content": [{ + "type": "image", + "source_lang_code": "ja", + "target_lang_code": "en", + "url": "https://example.com/japanese-sign.jpg", + }], +}] +``` + +Only `"text"` and `"image"` types are supported. Only `user` and `assistant` roles. Image input is normalized to 896×896 (256 vision tokens). + +## Minimum invocation + +```python +from transformers import pipeline +import torch + +pipe = pipeline( + "image-text-to-text", + model="google/translategemma-4b-it", + device="cuda", + dtype=torch.bfloat16, +) + +messages = [{ + "role": "user", + "content": [{ + "type": "text", + "source_lang_code": "pl", + "target_lang_code": "en", + "text": "Dziadek mieszkał w Warszawie przed wojną.", + }], +}] + +out = pipe(text=messages, max_new_tokens=200) +print(out[0]["generated_text"][-1]["content"]) +``` + +## Performance + +- **WMT24++ across 55 languages:** MetricX 5.32, COMET 81.6. +- Context window: 2K tokens (short — this is a translation model, not a long-doc summarizer). + +## When to choose it over base Gemma 4 + +- You want **translation quality > general Gemma 4** at equivalent size, with the strict prompt contract making it easy to drop into a pipeline. +- You need **image-text translation** (street signs, menus, old documents) as a first-class task. +- You care about the 55-language coverage and regionalized variants. + +Base Gemma 4 31B *can* translate — fine for casual use. TranslateGemma wins for production pipelines and when you care about metric-validated quality. + +## Homelab fit + +**Strong fit for family history agent.** If source documents are in German, Polish, Hungarian, Yiddish, or any of the 55 supported languages, TranslateGemma 4B on pve197 (GPU-backed) becomes the translation leg of an ingest pipeline: OCR → TranslateGemma → Gemma 4 for reasoning. The 4B size fits alongside the other models on the V100. + +Also useful for SearchXNG (if Seth ever wants to auto-translate non-English search results) and the news-summary print system (translate foreign-language feeds before summarization). diff --git a/tooling/gemma-family/txgemma.md b/tooling/gemma-family/txgemma.md new file mode 100644 index 0000000..8bdc54b --- /dev/null +++ b/tooling/gemma-family/txgemma.md @@ -0,0 +1,63 @@ +# TxGemma + +Therapeutic-development / drug-discovery variant. Built on **Gemma 2**. No Gemma 3 or 4 generation yet. + +## What it is + +Gemma 2 fine-tuned on 7M examples curated from the **Therapeutics Data Commons (TDC)** — predictive tasks across small molecules, proteins, nucleic acids, diseases, and cell lines. Beats or matches state-of-the-art on 50 of 66 TDC tasks; beats specialist models on 26 of them. + +## Sizes + +- **2B predict** — prediction-only, narrow prompt format. +- **9B predict** + **9B chat** — prediction plus conversational reasoning. +- **27B predict** + **27B chat** — same, larger. + +## Model card + +- https://developers.google.com/health-ai-developer-foundations/txgemma/model-card +- DeepMind: https://deepmind.google/models/gemma/txgemma/ +- Paper: https://deepmind.google/research/publications/153799/ + +## Prompting modes + +**Prediction mode** (all sizes): structured TDC-format prompt with instruction + context + question + optional few-shot. Output is a short prediction (sometimes a single token or a float). + +**Conversational mode** (9B, 27B): chat-template interactions, can explain reasoning behind predictions. + +## Minimum invocation — prediction + +```python +from transformers import pipeline + +pipe = pipeline( + "text-generation", + model="google/txgemma-27b-predict", + device="cuda", +) + +prompt = ( + "Instructions: Predict whether the molecule can penetrate the blood-brain barrier.\n" + "Context: Blood-brain barrier penetration is an important property for CNS drugs.\n" + "Question: Given the SMILES string CN1C=NC2=C1C(=O)N(C(=O)N2C)C, " + "predict BBB penetration. Answer with 'Yes' or 'No'.\n" + "Answer:" +) + +out = pipe(prompt, max_new_tokens=8) +print(out[0]["generated_text"]) +``` + +## License + +Health AI Developer Foundations — same terms as MedGemma. Non-clinical, research-use. + +## When to choose it over base Gemma 4 + +- You're doing **drug-discovery research** and need TDC-format predictions out of the box. +- You want **SMILES-aware reasoning** without a custom cheminformatics stack. + +Almost never chosen for general-purpose work. TxGemma's value is the training data, not the base model. + +## Homelab fit + +Zero. Noted for completeness. diff --git a/tooling/google-official/README.md b/tooling/google-official/README.md new file mode 100644 index 0000000..64020ec --- /dev/null +++ b/tooling/google-official/README.md @@ -0,0 +1,226 @@ +# Google-official Gemma tooling (as of 2026-04-18) + +Downloaded corpus of canonical Google / Google-DeepMind Gemma tooling. This +directory mirrors only **upstream-authored** material — no third-party forks, +no community ports, no Ollama-specific content (that lives in +`../../CORPUS_ollama_variants.md`). + +Reach for this directory when you need to verify what the canonical code/docs +actually say (prompt tokens, API shapes, supported variants) versus what a +third-party wrapper claims they say. + +## Top-line findings (flag for cross-check with rest of corpus) + +1. **Canonical JAX/Flax library (`google-deepmind/gemma`) has first-class + Gemma 4 support today** — `gm.nn.Gemma4_E4B()`, + `gm.ckpts.CheckpointPath.GEMMA4_E4B_IT`, and the unified `ChatSampler` / + `ToolSampler` API explicitly lists "2, 3, 3n, 4" as supported. This is the + least-friction Python path if you want the actual reference behavior. +2. **`google/gemma_pytorch` has NO Gemma 4 support** as of last push + (2025-05-30). `scripts/run.py` validates variant in + `['2b', '2b-v2', '7b', '9b', '27b', '1b']`; `scripts/run_multimodal.py` in + `['4b', '12b', '27b_v3']` (all Gemma 3). If someone tells you to "use + the official PyTorch repo" for Gemma 4, they're wrong — it's stale. +3. **`google/gemma.cpp` README says Gemma 2-3 + PaliGemma 2 only** (no Gemma 4 + yet), but the repo is actively pushed and explicitly notes active work + happens on the `dev` branch. Worth rechecking `dev` for Gemma 4 support. +4. **Gemma 4 uses a NEW prompt-token syntax** distinct from Gemma 1/2/3: + - Gemma 1/2/3: `` / `` (symmetric angle brackets) + - Gemma 4: `<|turn>` / `` (asymmetric pipe-brackets) + - Plus Gemma-4-new: `<|tool>`/``, `<|tool_call>`/``, + `<|tool_response>`/``, `<|think|>`, + `<|channel>`/``, `<|image>`/``, `<|audio>`/``, + string delimiter `<|"|>`. + - Roles are named directly: `system`, `user`, `model` (no role brackets). + This directly contradicts any chat template built against Gemma 3 tokens. + `CORPUS_tool_calling_format.md` already captures the tool tokens correctly + but does NOT yet document the turn-token change or the thinking tokens. +5. **`gemma.cpp` ships an HTTP API server (`gemma_api_server`) that speaks + the Google Gemini API protocol** (`POST /v1beta/models/:generateContent`, + SSE streaming, session management). This is a canonical Google-built + alternative to Ollama that implements the *real* Gemini REST API locally. + See `gemma-cpp/API_SERVER_README.md`. +6. **Tool use was NOT a trained capability in Gemma 1/2/3** — the DeepMind + `colabs/tool_use.ipynb` explicitly disclaims: *"The Gemma 1, 2 and 3 models + were not specifically trained for tool use. This is more a proof-of-concept + than an officially supported feature."* Gemma 4 is notably absent from that + caveat; the cookbook and blog confirm Gemma 4 has **native function + calling** as a first-class trained capability. +7. **No Gemma 4 technical-report PDF exists yet.** All conventional URLs + (`storage.googleapis.com/deepmind-media/gemma/Gemma4Report.pdf`, + `goo.gle/gemma4report`) return 404/redirect-to-google.com, and the + DeepMind repo README explicitly says "Gemma 4 (Coming soon)". Current + most-authoritative scientific document for the family is the Gemma 3 + technical report (arXiv:2503.19786), downloaded here. +8. **Cookbook ships a Gemma-4-specific agentic reference app** + (`apps/Gemma_4_HDP_Agentic_Security/`) demonstrating how to cryptographically + gate Gemma 4's native function calls with Ed25519-signed delegation tokens + (IETF draft `draft-helixar-hdp-agentic-delegation-00`). A more + production-shaped pattern than the toy `tool_use.ipynb`. + +## File index + +### `deepmind-gemma/` — JAX/Flax reference (the primary Python library) +Upstream: https://github.com/google-deepmind/gemma (`main`, pushed 2026-04-17). + +| File | What | Why keep | +|------|------|----------| +| `README.md` | PyPI `gemma` package entry point | Shows canonical `gm.nn.Gemma4_E4B()` API, `ChatSampler` multi-turn/multi-modal example | +| `example_multimodal.py` | Image-captioning fine-tune (Kauldron config) | Canonical end-to-end SFT example; docstring shows exact `user / / ` interleave for Gemma 3 | +| `example_lora.py` | LoRA fine-tuning recipe | Reach for this if doing PEFT against a Gemma 4 checkpoint | +| `example_dpo.py` | Direct Preference Optimization recipe | Reference for preference-alignment post-training | +| `example_classification.py` | Classification fine-tune | Shows Gemma as a feature extractor | +| `example_sharding.py` | Multi-device sharding | Reference for running >E4B on multi-GPU/TPU | +| `colab_tool_use.ipynb` | Tool-use demo (`ToolSampler`) | Important caveat inside: "not specifically trained for tool use" for Gemma 1/2/3; shows the `gm.tools.Tool` base class API | +| `colab_sampling.ipynb` | Basic inference / chat notebook | Starter-grade canonical sampling example | + +Other scripts in the repo (not downloaded, cherry-picked above): `seq2seq.py`, `npo.py`, colabs for `quantization_aware_training`, `sharding`, `tokenizer`, `multimodal`, `finetuning`, `lora_finetuning`, `lora_sampling`. Fetch directly from https://github.com/google-deepmind/gemma/tree/main when needed. + +### `gemma-pytorch/` — PyTorch reference (STALE for Gemma 4) +Upstream: https://github.com/google/gemma_pytorch (`main`, pushed 2025-05-30). + +| File | What | Why keep | +|------|------|----------| +| `README.md` | Entry-point docs | Only documents up through Gemma 3; no Gemma 4 | +| `run.py` | Text-only inference entry point | Variant whitelist `['2b','2b-v2','7b','9b','27b','1b']` — Gemma 1/2 only | +| `run_multimodal.py` | Multimodal inference entry point | Variant whitelist `['4b','12b','27b_v3']` — Gemma 3 only. Shows exact interleaved `user\n`, image, `text, \nmodel` pattern | +| `run_xla.py` | TPU/XLA inference | Reference for running Gemma 3 on TPU | + +**Do not reach for this repo for Gemma 4 work** until it's updated. Use the +DeepMind JAX lib, Hugging Face `transformers`, or gemma.cpp instead. + +### `gemma-cpp/` — C++ reference inference +Upstream: https://github.com/google/gemma.cpp (`main`, pushed 2026-04-17; active dev on `dev` branch). + +| File | What | Why keep | +|------|------|----------| +| `README.md` | Project overview, build instructions | States "Gemma 2-3 + PaliGemma 2" in features; Gemma 4 status unclear from `main` — check `dev` branch | +| `API_SERVER_README.md` | HTTP API server that speaks Gemini API protocol | **Most interesting find** — canonical drop-in for apps written against the Gemini API, runs locally. `POST /v1beta/models/:generateContent`, SSE streaming, session KV-cache | +| `examples_README.md` | Pointer to `hello_world` / `simplified_gemma` minimal embedding examples | Starting point for embedding gemma.cpp into your own C++ binary | + +### `cookbook/` — Official recipes and end-to-end apps +Upstream: https://github.com/google-gemma/cookbook (`main`, pushed 2026-04-17). +**Note:** `google-gemini/gemma-cookbook` now 301-redirects here; use the +`google-gemma/cookbook` URL going forward. + +| File | What | Why keep | +|------|------|----------| +| `README.md` | Cookbook index | Authoritative list of Gemma variants incl. Gemma 4 (E2B / E4B / 26B A4B / 31B), the ecosystem (FunctionGemma, MedGemma, PaliGemma 2, RecurrentGemma, ShieldGemma 2, T5Gemma, TranslateGemma, TxGemma, VaultGemma, EmbeddingGemma) | +| `tutorials_RAG_EmbeddingGemma.ipynb` | RAG with EmbeddingGemma | Currently the only notebook in `tutorials/` — reflects the "latest tested" tier | +| `docs_gemma_chat.ipynb` | Chatbot with Gemma on Keras | Documents the `__START_TURN_USER__ = "user\n"` / `__END_TURN__ = "\n"` format explicitly; Gemma 2 example, but the class is the canonical illustration of the Gemma 1/2/3 chat template | +| `apps_Gemma4_HDP_AgenticSecurity_README.md` | README for the HDP agentic-security reference app | Gemma-4-specific demo; real production pattern for gating native function calls | +| `apps_Gemma4_HDP_hdp_middleware.py` | Drop-in middleware (`HDPMiddleware.gate()`) | Wraps any Gemma 4 tool executor with Ed25519-signed HDT verification | +| `apps_Gemma4_HDP_AgenticSecurity.ipynb` | Walkthrough notebook | End-to-end: load Gemma 4, issue tokens, gate function calls | + +Other cookbook content worth noting (not downloaded — fetch on demand): +- `docs/capabilities/thinking.ipynb` (438 KB) — Gemma 4 thinking-mode notebook +- `docs/capabilities/audio.ipynb` — audio-input capability +- `docs/functiongemma/{finetuning-with-functiongemma,full-function-calling-sequence-with-functiongemma,function-calling-with-hf}.ipynb` — **FunctionGemma** is a separate fine-tune on the Gemma 3 270M IT checkpoint specifically for function calling; distinct from Gemma 4's native function calling +- `docs/core/pytorch_gemma.ipynb`, `keras_inference.ipynb`, `huggingface_*.ipynb` — framework-specific recipes +- `docs/integrations/langchain.ipynb` — LangChain integration +- `experiments/{MedGemma,TxGemma}/` and `experiments/[T5Gemma]Example.ipynb`, `[VaultGemma]FineTuning_Inference_Huggingface.ipynb`, etc. — domain-specific Gemma variants + +### `docs/` — Canonical ai.google.dev pages (HTML cached) +Verified URLs below; HTML snapshots saved for verbatim preservation. + +| File | Source URL | +|------|-----------| +| `ai-google-dev_core.html` | https://ai.google.dev/gemma/docs/core — Gemma 4 overview | +| `ai-google-dev_model_card_4.html` | https://ai.google.dev/gemma/docs/core/model_card_4 — Gemma 4 model card | +| `ai-google-dev_prompt_formatting_gemma4.html` | https://ai.google.dev/gemma/docs/core/prompt-formatting-gemma4 — **Gemma 4 prompt tokens (new `<\|turn>`/`` syntax)** | +| `ai-google-dev_function_calling_gemma4.html` | https://ai.google.dev/gemma/docs/capabilities/text/function-calling-gemma4 — **Gemma 4 native function calling spec** | +| `ai-google-dev_formatting.html` | https://ai.google.dev/gemma/docs/formatting — Gemma 1/2/3 prompt format (``/``) | +| `blog_announcement.html` | https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/ — Gemma 4 launch blog, 2026-04-02 | + +Other canonical doc URLs (verified to exist, not snapshotted here — visit +directly): +- https://ai.google.dev/gemma/docs — top-level Gemma hub +- https://ai.google.dev/gemma/docs/releases — release history +- https://ai.google.dev/gemma/docs/functiongemma — FunctionGemma variant +- https://ai.google.dev/gemma/docs/core/deploy_to_cloud_run_from_ai_studio — AI Studio → Cloud Run +- https://docs.cloud.google.com/vertex-ai/generative-ai/docs/open-models/use-gemma — Vertex AI +- https://aistudio.google.com — AI Studio +- https://gemma-llm.readthedocs.io — DeepMind JAX lib docs +- https://www.kaggle.com/models/google/gemma-4 — Gemma 4 on Kaggle +- https://huggingface.co/collections/google/gemma-4 — Gemma 4 on HF + +### `tech-report/` +| File | What | Source | +|------|------|--------| +| `Gemma3Report.pdf` | **Gemma 3 Technical Report** (arXiv:2503.19786, 2025-03-12) | https://storage.googleapis.com/deepmind-media/gemma/Gemma3Report.pdf | + +No Gemma 4 technical report exists yet. Probed paths that return 404: +- `Gemma4Report.pdf`, `gemma4-report.pdf`, `Gemma4Report_v1.pdf` under + `storage.googleapis.com/deepmind-media/gemma/` +- `goo.gle/gemma4report` (not configured — redirects to google.com) + +DeepMind repo README line: **"Gemma 4 (Coming soon)"**. The Gemma 3 report +remains the most-authoritative Google-DeepMind scientific document for the +family and is the correct citation for architecture fundamentals (Grouped-Query +Attention with post-norm/pre-norm RMSNorm, 5:1 local/global attention layer +interleave, 1024-token local sliding window, RoPE base 1M on global / 10k on +local, SigLIP 400M vision encoder at 896×896 shared across 4B/12B/27B and +frozen during training, SentencePiece tokenizer with 262k vocab shared with +Gemini 2.0, knowledge distillation during pre-training, QAT checkpoints via +5k-step fine-tune for int4/SFP8). Per-variant parameter counts for Gemma 3: +1B = 698M non-embedding + 302M embedding, 4B = 3209M + 675M, 12B = 10759M + +1012M, 27B = 25600M + 1416M. + +## Canonical Gemma 4 prompt format (verified 2026-04-18) + +**Source:** https://ai.google.dev/gemma/docs/core/prompt-formatting-gemma4 and +https://ai.google.dev/gemma/docs/capabilities/text/function-calling-gemma4 + +Note the `<|turn>` / `` are asymmetric — opening has the pipe on the +left, closing has the pipe on the right. Same for all paired delimiters. + +``` +<|turn>system +<|think|> (optional — activates thinking mode) +<|tool>declaration:FUNCTION_NAME{description:<|"|>...<|"|>,parameters:{properties:{...},required:[...]}} +You are a helpful assistant. +<|turn>user +What's the weather in Tokyo? +<|turn>model +<|channel>thought +...internal reasoning... +<|tool_call>call:get_current_weather{location:<|"|>Tokyo, JP<|"|>} +<|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>} +The current weather in Tokyo is 15 degrees and sunny. +``` + +Recommended sampling (per model card, verified): +`temperature=1.0, top_p=0.95, top_k=64`. Tokenizer vocab = **262k** (same as +Gemini 2.0). **BOS token required** — prepend `[BOS]` / set `add_bos=True`. + +**Gemma 1/2/3 prompt format (different — for reference):** +``` +user +[message] +model +[response] +``` +Gemma 1/2/3 have no trained tool-use or thinking tokens. PT models end with +``; IT models end with ``. + +## Gemma 4 variants (canonical spec from model card) + +| Variant | Params | Active | Context | Multimodal | +|---------|--------|--------|---------|------------| +| Gemma 4 E2B | 2.3B effective (5.1B w/ embeddings), 35 layers | — | 128K | text+image+audio (30s max) | +| Gemma 4 E4B | 4.5B effective (8B w/ embeddings), 42 layers | — | 128K | text+image+audio (30s max) | +| Gemma 4 26B A4B | 25.2B total (MoE), 30 layers | 3.8B | 256K | text+image | +| Gemma 4 31B | 30.7B dense, 60 layers | — | 256K | text+image | + +All variants: Apache 2.0, base + instruction-tuned (`-it`), 140+ languages, +native function calling, native structured JSON output. Vision encoder = 150M +(E2B/E4B) or 550M (26B/31B). Image resolution token budgets: 70, 140, 280, +560, 1120. Released 2026-04-02. + +## Fetched using + +All files fetched via `curl -sL` from `raw.githubusercontent.com` on +2026-04-18. Repos enumerated via the GitHub API +(`https://api.github.com/repos///contents/`). Google docs +pages fetched via WebFetch tool. No GitHub auth needed for public raw files +(unauthenticated rate limit = 60 req/hr, sufficient for this task). diff --git a/tooling/google-official/cookbook/README.md b/tooling/google-official/cookbook/README.md new file mode 100644 index 0000000..e8bd787 --- /dev/null +++ b/tooling/google-official/cookbook/README.md @@ -0,0 +1,80 @@ + +# Welcome to the Gemma Cookbook +This is a collection of guides and examples for [Google Gemma](https://ai.google.dev/gemma/). + +> **Disclaimer:** Gemma is a family of developer-focused models built by Google DeepMind. This cookbook is a collection of guides and examples for Google Gemma. Please keep in mind that Gemma is an open model and can hallucinate as you build on examples in this cookbook. + +## Repository Structure +* [**Tutorials**](tutorials/): The latest tested notebooks for Gemma models and variants. +* [**Apps**](apps/): Full-stack demos and complex end-to-end use cases. +* [**Experiments**](experiments/): Research-focused model notebooks, including [TxGemma](experiments/TxGemma) and [MedGemma](experiments/MedGemma). +* [**Responsible**](responsible/): Notebooks for responsible AI development. +* [**Docs**](docs/): Core documentation, capabilities, and technical guides. +* [**Archive**](.archive/): All older notebooks and historical examples. + +## Get started with the Gemma models +Gemma is a family of lightweight, generative artificial intelligence (AI) open models, built from the same research and technology used to create the Gemini models. The Gemma model family includes: +* Gemma\ + The core models of the Gemma family. + * [Gemma](https://ai.google.dev/gemma/docs/core/model_card)\ + For a variety of text generation tasks and can be further tuned for specific use cases + * [Gemma 2](https://ai.google.dev/gemma/docs/core/model_card_2)\ + Higher-performing and more efficient, available in 2B, 9B, 27B parameter sizes + * [Gemma 3](https://ai.google.dev/gemma/docs/core/model_card_3)\ + Longer context window and handling text and image input, available in 1B, 4B, 12B, and 27B parameter sizes + * [Gemma 3n](https://ai.google.dev/gemma/docs/gemma-3n/model_card) \ + Designed for efficient execution on low-resource devices. Handling text, image, video, and audio input, available in E2B and E4B parameter sizes + * [Gemma 4](https://ai.google.dev/gemma/docs/core/model_card_4)\ + Well-suited for reasoning, agentic workflows, coding, and multimodal understanding, available in E2B, E4B, 26B A4B, and 31B parameter sizes. +* Gemma variants + * [CodeGemma](https://ai.google.dev/gemma/docs/codegemma)\ + Fine-tuned for a variety of coding tasks + * [DataGemma](https://ai.google.dev/gemma/docs/datagemma)\ + Fine-tuned for using Data Commons to address AI hallucinations + * [FunctionGemma](https://ai.google.dev/gemma/docs/functiongemma)\ + Fine-tuned on Gemma 3 270M IT checkpoint for function calling + * [MedGemma](https://developers.google.com/health-ai-developer-foundations/medgemma) + The MedGemma collection contains Google's most capable open models for medical text and image comprehension, built on Gemma 3. Developers can use MedGemma to accelerate building healthcare-based AI applications. MedGemma comes in two variants: a 4B multimodal version and a 27B text-only version. + * [PaliGemma](https://ai.google.dev/gemma/docs/paligemma/model-card)\ + Vision Language Model\ + For a deeper analysis of images and provide useful insights + * [PaliGemma 2](https://ai.google.dev/gemma/docs/paligemma/model-card-2)\ + VLM which incorporates the capabilities of the Gemma 2 models + * [RecurrentGemma](https://ai.google.dev/gemma/docs/recurrentgemma)\ + Based on [Griffin](https://arxiv.org/abs/2402.19427) architecture\ + For a variety of text generation tasks + * [ShieldGemma](https://ai.google.dev/gemma/docs/shieldgemma/model_card)\ + Fine-tuned for evaluating the safety of text prompt input and text output responses against a set of defined safety policies + * [ShieldGemma 2](https://ai.google.dev/gemma/docs/shieldgemma/model_card_2)\ + Fine-tuned on Gemma 3 4B IT checkpoint for image safety classification + * [T5Gemma](https://deepmind.google/models/gemma/t5gemma)\ + A collection of encoder-decoder models that provide a strong quality-inference efficiency tradeoff + * [TranslateGemma](https://huggingface.co/collections/google/translategemma)\ + A collection of open model designed to handle translation tasks across 55 languages + * [TxGemma](https://deepmind.google/models/gemma/txgemma)\ + A collection of open models designed to improve the efficiency of therapeutic development + * [VaultGemma](https://deepmind.google/models/gemma/vaultgemma)\ + An open model trained from the ground up using differential privacy to prevent memorization and leaking of training data examples + +You can find the Gemma models on the Hugging Face Hub, Kaggle, Google Cloud Vertex AI Model Garden, and [ai.nvidia.com](https://ai.nvidia.com). + +## Additional Resources +* [MedGemma on Google-Health](https://github.com/Google-Health/medgemma/tree/main/notebooks) : Google-Health has additional notebooks for using MedGemma +* [Gemma on Google Cloud](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/open-models) : GCP open models has additional notebooks for using Gemma + +## Get help +Ask a Gemma cookbook-related question on the [developer forum](https://discuss.ai.google.dev/c/gemma/10), or open an [issue](https://github.com/google-gemini/gemma-cookbook/issues) on GitHub. + +## Wish list +If you want to see additional cookbooks implemented for specific features/integrations, please open a new issue with [“Feature Request” template](https://github.com/google-gemini/gemma-cookbook/issues/new?template=feature_request.yml). + +If you want to make contributions to the Gemma Cookbook project, you are welcome to pick any idea in the [“Wish List”](https://github.com/google-gemini/gemma-cookbook/labels/wishlist) and implement it. + +## Contributing +Contributions are always welcome. Please read [contributing](https://github.com/google-gemini/gemma-cookbook/blob/main/CONTRIBUTING.md) before implementation. + +Thank you for developing with Gemma! We’re excited to see what you create. + +## Translation of this repository +* [Traditional Chinese](https://github.com/doggy8088/gemma-cookbook) +* [Simplified Chinese](https://github.com/xiaoxiong1006/gemma-cookbook) diff --git a/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity.ipynb b/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity.ipynb new file mode 100644 index 0000000..6b3d473 --- /dev/null +++ b/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity.ipynb @@ -0,0 +1,526 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "colab-badge" + }, + "source": [ + "\n", + " \n", + "
\n", + " Run in Google Colab\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "byline" + }, + "source": [ + "# Securing Gemma 4 Agentic Workflows with HDP\n", + "\n", + "**Author:** Asiri Dalugoda, Helixar Limited ([@asiridalugoda](https://github.com/asiridalugoda)) | [helixar.ai](https://helixar.ai)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gpu-instructions" + }, + "source": [ + "## Before you begin\n", + "\n", + "This notebook requires a GPU runtime. To enable GPU in Colab:\n", + "1. Go to **Runtime → Change runtime type**\n", + "2. Set **Hardware accelerator** to **GPU** (T4 is sufficient for E4B)\n", + "3. Click **Save**\n", + "\n", + "You will also need a **Hugging Face token** to download Gemma 4 (gated model):\n", + "1. Go to [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)\n", + "2. Create a token with **Read** access\n", + "3. Accept the Gemma 4 model license at [huggingface.co/google/gemma-4-E4B-it](https://huggingface.co/google/gemma-4-E4B-it)\n", + "4. Run the cell below to authenticate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hf-login" + }, + "outputs": [], + "source": [ + "from huggingface_hub import notebook_login\n", + "notebook_login()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "overview" + }, + "source": [ + "# Securing Gemma 4 Agentic Workflows with HDP\n", + "\n", + "**Human Delegation Provenance (HDP)** is an open protocol that adds a cryptographic chain-of-custody to AI agent function calls — ensuring every tool invocation can be traced back to an authorized human principal.\n", + "\n", + "This notebook demonstrates how to integrate HDP with Gemma 4's native function-calling capability to:\n", + "\n", + "- **Verify** that Gemma 4's function calls were authorized by a human principal before execution\n", + "- **Classify** actions by irreversibility (read-only → irreversible → physical actuation)\n", + "- **Block** unauthorized or out-of-scope tool calls at the middleware layer\n", + "- **Audit** every decision with a pre-execution log\n", + "\n", + "This is particularly relevant for Gemma 4 deployments on edge devices (Jetson Nano, Raspberry Pi) where the model may be directing physical actuators offline with no out-of-band authorization check.\n", + "\n", + "**References:**\n", + "- HDP IETF draft: [draft-helixar-hdp-agentic-delegation-00](https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/)\n", + "- HDP-P (physical AI agents): [DOI 10.5281/ZENODO.19332440](https://doi.org/10.5281/ZENODO.19332440)\n", + "- Helixar: [helixar.ai](https://helixar.ai)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b3600ee25c8e" + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "7a80251f52b3" + }, + "outputs": [], + "source": [ + "!pip install -q transformers torch cryptography" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ed80fe18f255" + }, + "outputs": [], + "source": [ + "# Download the middleware\n", + "!wget -q https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/apps/Gemma_4_HDP_Agentic_Security/hdp_middleware.py\n", + "\n", + "from hdp_middleware import (\n", + " HDPDelegationToken,\n", + " HDPMiddleware,\n", + " IrreversibilityClass,\n", + " DEFAULT_TOOL_CLASS_MAP,\n", + ")\n", + "from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey\n", + "import json" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e88bdc7b7265" + }, + "source": [ + "## 1. Load Gemma 4\n", + "\n", + "We use the 4B Effective model for this demo. For production agentic deployments, the 26B MoE or 31B Dense models are recommended." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1e4e7779806d" + }, + "outputs": [], + "source": [ + "from transformers import pipeline\n", + "\n", + "# For edge/robotics use cases: swap to google/gemma-4-E2B-it\n", + "MODEL_ID = \"google/gemma-4-E4B-it\"\n", + "\n", + "pipe = pipeline(\n", + " \"text-generation\",\n", + " model=MODEL_ID,\n", + " device_map=\"auto\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d91e36cfb0b2" + }, + "source": [ + "## 2. Define Tools\n", + "\n", + "Gemma 4 uses structured JSON function-calling. We define a tool set spanning different IrreversibilityClasses to demonstrate the middleware's classification behaviour." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1becdb52e7f8" + }, + "outputs": [], + "source": [ + "TOOLS = [\n", + " {\n", + " \"name\": \"get_weather\",\n", + " \"description\": \"Get the current weather for a location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"location\": {\"type\": \"string\", \"description\": \"City name\"}\n", + " },\n", + " \"required\": [\"location\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"send_email\",\n", + " \"description\": \"Send an email to a recipient.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"to\": {\"type\": \"string\"},\n", + " \"subject\": {\"type\": \"string\"},\n", + " \"body\": {\"type\": \"string\"}\n", + " },\n", + " \"required\": [\"to\", \"subject\", \"body\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"delete_file\",\n", + " \"description\": \"Permanently delete a file by path.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"path\": {\"type\": \"string\"}\n", + " },\n", + " \"required\": [\"path\"]\n", + " }\n", + " },\n", + " {\n", + " \"name\": \"actuate_robot_arm\",\n", + " \"description\": \"Command a robot arm to move to a target position.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"joint_angles\": {\"type\": \"array\", \"items\": {\"type\": \"number\"}},\n", + " \"force_limit_n\": {\"type\": \"number\"}\n", + " },\n", + " \"required\": [\"joint_angles\"]\n", + " }\n", + " }\n", + "]\n", + "\n", + "# Tools indexed by name for lookup\n", + "TOOL_REGISTRY = {t[\"name\"]: t for t in TOOLS}\n", + "print(f\"Registered {len(TOOLS)} tools\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "722948b00a92" + }, + "source": [ + "## 3. Issue an HDP Delegation Token\n", + "\n", + "The human principal generates an Ed25519 keypair and issues an HDT that specifies:\n", + "- Which tools the agent is permitted to call\n", + "- The maximum IrreversibilityClass the agent can act on\n", + "- The token's lifetime" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b0622c68dfa5" + }, + "outputs": [], + "source": [ + "# Human principal generates their signing keypair\n", + "# In production: loaded from secure key storage (HSM, OS keychain, etc.)\n", + "principal_private_key = Ed25519PrivateKey.generate()\n", + "principal_public_key = principal_private_key.public_key()\n", + "\n", + "# Issue an HDT authorizing the Gemma 4 agent to call weather queries\n", + "# and send emails (Class 0 and Class 2), but NOT delete files or actuate hardware\n", + "token = HDPDelegationToken.issue(\n", + " principal_id=\"alice@example.com\",\n", + " agent_id=\"gemma4-agent-01\",\n", + " scope=[\"get_weather\", \"send_email\"],\n", + " max_class=IrreversibilityClass.CLASS_2,\n", + " ttl_seconds=3600,\n", + " private_key=principal_private_key,\n", + ")\n", + "\n", + "print(json.dumps(token.to_dict(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e206f950f4bc" + }, + "source": [ + "## 4. Initialise the HDP Middleware\n", + "\n", + "The middleware takes the principal's **public key** only — it verifies but cannot issue tokens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e24676f528bf" + }, + "outputs": [], + "source": [ + "audit_log = []\n", + "\n", + "# Confirmation callback for Class 2 (irreversible) actions.\n", + "# In production: this would invoke a push notification, SMS OTP,\n", + "# or hardware confirmation device to the human principal.\n", + "def require_human_confirmation(tool_name: str, parameters: dict) -> bool:\n", + " print(f\"\\n⚠️ Class 2 action requested: {tool_name}\")\n", + " print(f\" Parameters: {json.dumps(parameters, indent=4)}\")\n", + " response = input(\" Confirm? [y/N]: \").strip().lower()\n", + " return response == \"y\"\n", + "\n", + "middleware = HDPMiddleware(\n", + " public_key=principal_public_key,\n", + " tool_class_map=DEFAULT_TOOL_CLASS_MAP,\n", + " confirmation_callback=require_human_confirmation,\n", + " audit_log=audit_log,\n", + ")\n", + "\n", + "print(\"HDP middleware initialised.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "72d56542eba0" + }, + "source": [ + "## 5. Gemma 4 Function Call → HDP Gate → Tool Execution\n", + "\n", + "This is the core integration pattern. Every function call Gemma 4 generates is passed through `middleware.gate()` before being forwarded to tool execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "da20bc191e71" + }, + "outputs": [], + "source": [ + "# Simulated Gemma 4 function call outputs\n", + "# In production these come from parsing Gemma 4's structured JSON output\n", + "gemma_function_calls = [\n", + " # ✅ Should ALLOW — Class 0, in scope\n", + " {\"name\": \"get_weather\", \"parameters\": {\"location\": \"Auckland\"}},\n", + "\n", + " # ⚠️ Should CONFIRM then ALLOW — Class 2, in scope\n", + " {\"name\": \"send_email\", \"parameters\": {\n", + " \"to\": \"bob@example.com\",\n", + " \"subject\": \"Weekly report\",\n", + " \"body\": \"Please find attached.\"\n", + " }},\n", + "\n", + " # ❌ Should BLOCK — Class 2, NOT in HDT scope\n", + " {\"name\": \"delete_file\", \"parameters\": {\"path\": \"/data/important.csv\"}},\n", + "\n", + " # ❌ Should BLOCK — Class 3, physical actuation\n", + " {\"name\": \"actuate_robot_arm\", \"parameters\": {\n", + " \"joint_angles\": [0.0, -1.57, 0.0, -1.57, 0.0, 0.0],\n", + " \"force_limit_n\": 50.0\n", + " }},\n", + "]\n", + "\n", + "print(\"=\" * 60)\n", + "print(\"HDP VERIFICATION RESULTS\")\n", + "print(\"=\" * 60)\n", + "\n", + "for call in gemma_function_calls:\n", + " result = middleware.gate(call, token)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "be0d0dd05bce" + }, + "source": [ + "## 6. Audit Log\n", + "\n", + "Every decision is logged pre-execution. This is the HDP audit trail — a cryptographically linked record of what was authorized, by whom, and when." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e6dbab6d88d1" + }, + "outputs": [], + "source": [ + "print(\"\\nAUDIT LOG\")\n", + "print(\"-\" * 60)\n", + "for i, entry in enumerate(audit_log):\n", + " status = \"✅ ALLOWED\" if entry.allowed else \"❌ BLOCKED\"\n", + " print(f\"{i+1}. {status} | {entry.tool_name} | {entry.action_class.name} | {entry.reason}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bcadcb7040db" + }, + "source": [ + "## 7. Token Expiry and Scope Violation Demo\n", + "\n", + "Demonstrate that expired tokens and out-of-scope calls are blocked regardless of the action class." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "deb2e3b6b20e" + }, + "outputs": [], + "source": [ + "import time\n", + "\n", + "# Issue a token that's already expired\n", + "expired_token = HDPDelegationToken.issue(\n", + " principal_id=\"alice@example.com\",\n", + " agent_id=\"gemma4-agent-01\",\n", + " scope=[\"get_weather\"],\n", + " max_class=IrreversibilityClass.CLASS_0,\n", + " ttl_seconds=-1, # expired immediately\n", + " private_key=principal_private_key,\n", + ")\n", + "\n", + "print(\"Testing expired token:\")\n", + "middleware.gate({\"name\": \"get_weather\", \"parameters\": {\"location\": \"Auckland\"}}, expired_token)\n", + "\n", + "print(\"\\nTesting call outside HDT scope:\")\n", + "middleware.gate({\"name\": \"delete_file\", \"parameters\": {\"path\": \"/etc/passwd\"}}, token)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b8f4acddb6fa" + }, + "source": [ + "## 8. Edge / Robotics Deployment (HDP-P)\n", + "\n", + "For Gemma 4 E2B/E4B running on Jetson Nano or Raspberry Pi and directing physical actuators, use the HDP-P extension. The key additions are:\n", + "\n", + "- **Embodiment context** — bind the token to a specific hardware ID\n", + "- **Policy attestation** — hash the deployed model weights into the token\n", + "- **Fleet delegation constraints** — prevent lateral movement across robot fleet\n", + "- **Pre-execution logging** — write audit records *before* actuator commands are issued\n", + "\n", + "See the [HDP-P specification](https://doi.org/10.5281/ZENODO.19332440) for the full EDT extension structure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fcf7b451d175" + }, + "outputs": [], + "source": [ + "# Minimal HDP-P Embodied Delegation Token (EDT) extension example\n", + "# This shows how to attach physical constraints to an HDT\n", + "\n", + "hdp_p_extension = {\n", + " \"hdp-p\": {\n", + " \"version\": \"0.1\",\n", + " \"embodiment\": {\n", + " \"type\": \"mobile\",\n", + " \"platform\": \"raspberry-pi-5\",\n", + " \"hardware_id\": \"rpi-serial-XXXX\", # TPM-attested in production\n", + " \"workspace\": \"lab-zone-a\"\n", + " },\n", + " \"action_scope\": {\n", + " \"permitted_actions\": [\"move_base\", \"read_sensor\"],\n", + " \"excluded_zones\": [\"human-workspace\"],\n", + " \"force_limit_n\": 10.0,\n", + " \"max_velocity_ms\": 0.5\n", + " },\n", + " \"irreversibility\": {\n", + " \"max_class\": 1, # Class 1 max for this token\n", + " \"class2_requires_confirmation\": True,\n", + " \"class3_prohibited\": True\n", + " },\n", + " \"policy_attestation\": {\n", + " \"policy_hash\": \"sha256:abc123...\", # SHA-256 of deployed model weights\n", + " \"training_run_id\": \"gemma4-e2b-it\",\n", + " \"sim_validated\": True\n", + " },\n", + " \"delegation_scope\": {\n", + " \"fleet_delegation_permitted\": False, # No lateral movement\n", + " \"max_delegation_depth\": 0\n", + " }\n", + " }\n", + "}\n", + "\n", + "print(\"HDP-P EDT extension structure:\")\n", + "print(json.dumps(hdp_p_extension, indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b0af7c701dfc" + }, + "source": [ + "## Summary\n", + "\n", + "| Layer | What it solves | Tool |\n", + "|---|---|---|\n", + "| Gemma 4 function calling | Model generates structured tool calls | `pipeline(\"text-generation\")` |\n", + "| HDP middleware | Was this call authorized by a human? | `HDPMiddleware.gate()` |\n", + "| HDP-P EDT extension | Is this physical action within delegated bounds? | `hdp_p_extension` |\n", + "| Audit log | Pre-execution record of every decision | `audit_log` |\n", + "\n", + "The full HDP specification (IETF draft), HDP-P companion paper, TypeScript SDK, and Python bindings are available at:\n", + "\n", + "- **IETF draft:** https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/\n", + "- **HDP-P paper:** https://doi.org/10.5281/ZENODO.19332440\n", + "- **GitHub:** https://github.com/Helixar-AI\n", + "- **Site:** https://helixar.ai" + ] + } + ], + "metadata": { + "colab": { + "name": "Gemma_4_HDP_Agentic_Security.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity_README.md b/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity_README.md new file mode 100644 index 0000000..8811f85 --- /dev/null +++ b/tooling/google-official/cookbook/apps_Gemma4_HDP_AgenticSecurity_README.md @@ -0,0 +1,75 @@ +# Gemma 4 + HDP: Securing Agentic Function Calls + +This example demonstrates how to integrate the **Human Delegation Provenance (HDP)** protocol with **Gemma 4's native function-calling** to cryptographically verify that every tool invocation was authorized by a human principal before execution. + +## The problem + +Gemma 4 is purpose-built for agentic workflows. Its native function-calling lets it autonomously call tools and APIs across multi-step plans — on anything from a cloud workstation to a Raspberry Pi running a robot offline. + +This creates a gap: when Gemma 4 generates a function call, there is no verifiable record that a human principal authorized that specific action. An injected prompt, a compromised system prompt, or a lateral pivot from another agent can trigger function calls that are indistinguishable from legitimate requests at the tool interface. + +HDP closes this gap. + +## What HDP does + +HDP (IETF draft: `draft-helixar-hdp-agentic-delegation-00`) provides: + +- **Ed25519-signed Delegation Tokens (HDTs)** issued by a human principal +- **Scope constraints** — which tools the agent is permitted to call +- **Irreversibility classification** (Class 0–3) — from read-only to physical actuation +- **Pre-execution verification** — the middleware gate runs *before* any tool executes +- **Audit log** — a tamper-evident record of every authorization decision + +For Gemma 4 on **edge devices directing physical actuators** (Jetson Nano, Raspberry Pi + robot arm), the HDP-P companion specification adds embodiment constraints, policy attestation, and fleet delegation controls. + +## Files + +| File | Description | +|---|---| +| `Gemma_4_HDP_Agentic_Security.ipynb` | Full walkthrough notebook — load Gemma 4, issue tokens, gate function calls | +| `hdp_middleware.py` | Drop-in middleware — `HDPMiddleware.gate()` wraps any Gemma 4 tool executor | + +## Quick start + +```python +from hdp_middleware import HDPDelegationToken, HDPMiddleware, IrreversibilityClass +from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey + +# Human principal issues a delegation token +private_key = Ed25519PrivateKey.generate() +token = HDPDelegationToken.issue( + principal_id="alice@example.com", + agent_id="gemma4-agent-01", + scope=["get_weather", "send_email"], + max_class=IrreversibilityClass.CLASS_2, + ttl_seconds=3600, + private_key=private_key, +) + +# Middleware verifies every Gemma 4 function call before execution +middleware = HDPMiddleware(public_key=private_key.public_key()) + +result = middleware.gate( + function_call={"name": "send_email", "parameters": {"to": "bob@example.com", ...}}, + token=token, +) + +if result.allowed: + execute_tool(function_call) +``` + +## Irreversibility classes + +| Class | Definition | Authorization | +|---|---|---| +| 0 | Fully reversible — reads, queries | HDT sufficient | +| 1 | Reversible with effort — writes, moves | HDT sufficient | +| 2 | Irreversible — send, delete, publish | HDT + principal confirmation | +| 3 | Irreversible + potentially harmful — physical actuation | Dual-principal required (HDP-P) | + +## References + +- **IETF draft:** https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/ +- **Zenodo DOI:** https://doi.org/10.5281/zenodo.19332023 +- **HDP-P (physical AI):** https://doi.org/10.5281/ZENODO.19332440 +- **Helixar:** https://helixar.ai diff --git a/tooling/google-official/cookbook/apps_Gemma4_HDP_hdp_middleware.py b/tooling/google-official/cookbook/apps_Gemma4_HDP_hdp_middleware.py new file mode 100644 index 0000000..33b4442 --- /dev/null +++ b/tooling/google-official/cookbook/apps_Gemma4_HDP_hdp_middleware.py @@ -0,0 +1,390 @@ +""" +HDP (Human Delegation Provenance) middleware for Gemma 4 function calling. + +Intercepts Gemma 4 function call outputs and verifies that a valid HDP +Delegation Token (HDT) authorizes the requested action before forwarding +to the tool execution layer. + +Reference: draft-helixar-hdp-agentic-delegation-00 + https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/ + DOI: 10.5281/zenodo.19332023 + +For physical AI agents (robots, edge devices), see HDP-P: + DOI: 10.5281/ZENODO.19332440 +""" + +import json +import time +import base64 +import hashlib +import hmac +from dataclasses import dataclass, field +from enum import IntEnum +from typing import Optional, Callable, Any +from cryptography.hazmat.primitives.asymmetric.ed25519 import ( + Ed25519PrivateKey, + Ed25519PublicKey, +) +from cryptography.hazmat.primitives.serialization import ( + Encoding, + PublicFormat, + PrivateFormat, + NoEncryption, +) +from cryptography.exceptions import InvalidSignature + + +# --------------------------------------------------------------------------- +# Irreversibility Classes (HDP-P §4.2) +# --------------------------------------------------------------------------- + +class IrreversibilityClass(IntEnum): + """ + Classification of physical action reversibility (HDP-P §4.2). + + For digital-only Gemma 4 deployments, all tool calls are Class 0 or 1. + For edge/robotics deployments (Jetson Nano, Raspberry Pi + actuators), + Class 2 and 3 require explicit pre-execution confirmation. + """ + CLASS_0 = 0 # Fully reversible — read-only, query, observe + CLASS_1 = 1 # Reversible with effort — write, create, move + CLASS_2 = 2 # Irreversible under normal conditions — delete, send, publish + CLASS_3 = 3 # Irreversible and potentially harmful — physical actuation + + +# Default tool → irreversibility class mapping. +# Deployments should override this for their specific tool set. +DEFAULT_TOOL_CLASS_MAP: dict[str, IrreversibilityClass] = { + # Class 0 — safe reads + "get_weather": IrreversibilityClass.CLASS_0, + "search_web": IrreversibilityClass.CLASS_0, + "read_file": IrreversibilityClass.CLASS_0, + "query_database": IrreversibilityClass.CLASS_0, + # Class 1 — reversible writes + "write_file": IrreversibilityClass.CLASS_1, + "create_record": IrreversibilityClass.CLASS_1, + "move_object": IrreversibilityClass.CLASS_1, + # Class 2 — irreversible digital actions + "send_email": IrreversibilityClass.CLASS_2, + "delete_file": IrreversibilityClass.CLASS_2, + "publish_post": IrreversibilityClass.CLASS_2, + "execute_transaction": IrreversibilityClass.CLASS_2, + # Class 3 — physical actuation (HDP-P scope) + "actuate_robot_arm": IrreversibilityClass.CLASS_3, + "command_vehicle": IrreversibilityClass.CLASS_3, + "dispense_fluid": IrreversibilityClass.CLASS_3, + "apply_force": IrreversibilityClass.CLASS_3, +} + + +# --------------------------------------------------------------------------- +# HDP Delegation Token (HDT) +# --------------------------------------------------------------------------- + +@dataclass +class HDPDelegationToken: + """ + Simplified HDT structure derived from draft-helixar-hdp-agentic-delegation-00. + + In production, HDTs are JOSE/JWT tokens signed with Ed25519. + This implementation provides the core claims structure and verification logic. + + Claims: + iss — issuer (human principal identifier) + sub — subject (agent being delegated to) + iat — issued at (unix timestamp) + exp — expiry (unix timestamp) + scope — list of permitted tool names or wildcard patterns + max_irreversibility_class — ceiling on action class (0–3) + delegation_depth — remaining delegation hops permitted + nonce — replay-attack prevention + """ + iss: str + sub: str + iat: int + exp: int + scope: list[str] + max_irreversibility_class: IrreversibilityClass + delegation_depth: int = 1 + nonce: str = "" + _signature: bytes = field(default=b"", repr=False) + _public_key: Optional[Ed25519PublicKey] = field(default=None, repr=False) + + @classmethod + def issue( + cls, + principal_id: str, + agent_id: str, + scope: list[str], + max_class: IrreversibilityClass, + ttl_seconds: int = 3600, + delegation_depth: int = 1, + private_key: Optional[Ed25519PrivateKey] = None, + ) -> "HDPDelegationToken": + """ + Issue a new HDT signed by the human principal's Ed25519 private key. + + Args: + principal_id: Human principal identifier (e.g. "alice@example.com") + agent_id: Agent being delegated to (e.g. "gemma4-agent-01") + scope: List of permitted tool names. Use ["*"] for unrestricted. + max_class: Maximum IrreversibilityClass this token permits. + ttl_seconds: Token lifetime in seconds. + delegation_depth: How many times this token can be re-delegated. + private_key: Ed25519 private key for signing. Generated if None. + """ + now = int(time.time()) + nonce = base64.urlsafe_b64encode( + hashlib.sha256(f"{principal_id}{now}".encode()).digest()[:16] + ).decode() + + token = cls( + iss=principal_id, + sub=agent_id, + iat=now, + exp=now + ttl_seconds, + scope=scope, + max_irreversibility_class=max_class, + delegation_depth=delegation_depth, + nonce=nonce, + ) + + if private_key is None: + private_key = Ed25519PrivateKey.generate() + + token._public_key = private_key.public_key() + token._signature = private_key.sign(token._canonical_bytes()) + return token + + def _canonical_bytes(self) -> bytes: + """Deterministic serialisation for signing/verification.""" + payload = { + "iss": self.iss, + "sub": self.sub, + "iat": self.iat, + "exp": self.exp, + "scope": sorted(self.scope), + "max_irreversibility_class": int(self.max_irreversibility_class), + "delegation_depth": self.delegation_depth, + "nonce": self.nonce, + } + return json.dumps(payload, sort_keys=True, separators=(",", ":")).encode() + + def verify(self, public_key: Ed25519PublicKey) -> bool: + """Verify the token's Ed25519 signature.""" + try: + public_key.verify(self._signature, self._canonical_bytes()) + return True + except InvalidSignature: + return False + + def is_expired(self) -> bool: + return int(time.time()) > self.exp + + def permits_tool(self, tool_name: str) -> bool: + """Check whether this token's scope covers the requested tool.""" + if "*" in self.scope: + return True + return tool_name in self.scope + + def permits_class(self, action_class: IrreversibilityClass) -> bool: + return action_class <= self.max_irreversibility_class + + def to_dict(self) -> dict: + return { + "iss": self.iss, + "sub": self.sub, + "iat": self.iat, + "exp": self.exp, + "scope": self.scope, + "max_irreversibility_class": int(self.max_irreversibility_class), + "delegation_depth": self.delegation_depth, + "nonce": self.nonce, + } + + +# --------------------------------------------------------------------------- +# Verification result +# --------------------------------------------------------------------------- + +@dataclass +class VerificationResult: + allowed: bool + reason: str + tool_name: str + action_class: IrreversibilityClass + token_iss: Optional[str] = None + requires_confirmation: bool = False + + def __str__(self) -> str: + status = "ALLOWED" if self.allowed else "BLOCKED" + conf = " [CONFIRMATION REQUIRED]" if self.requires_confirmation else "" + return ( + f"[HDP] {status}{conf} — tool={self.tool_name} " + f"class={self.action_class.name} reason={self.reason}" + ) + + +# --------------------------------------------------------------------------- +# HDP Middleware +# --------------------------------------------------------------------------- + +class HDPMiddleware: + """ + HDP verification gate for Gemma 4 function calls. + + Sits between Gemma 4's function-call output and the tool execution layer. + For each function call Gemma 4 generates, this middleware: + + 1. Parses the tool name from the function call. + 2. Looks up its IrreversibilityClass. + 3. Verifies the attached HDT (signature, expiry, scope, class ceiling). + 4. For Class 2 actions, invokes the confirmation callback. + 5. Blocks Class 3 actions unless explicitly pre-authorized with + dual verification (HDP-P §5.4). + 6. Logs all decisions before forwarding or blocking. + + Usage: + middleware = HDPMiddleware( + public_key=principal_public_key, + tool_class_map=DEFAULT_TOOL_CLASS_MAP, + confirmation_callback=my_confirmation_fn, + ) + + # Wrap your tool executor: + result = middleware.gate( + function_call=gemma_output, # {"name": "...", "parameters": {...}} + token=hdp_token, + ) + + if result.allowed: + output = execute_tool(function_call) + """ + + def __init__( + self, + public_key: Ed25519PublicKey, + tool_class_map: dict[str, IrreversibilityClass] = None, + confirmation_callback: Optional[Callable[[str, dict], bool]] = None, + default_class: IrreversibilityClass = IrreversibilityClass.CLASS_1, + audit_log: Optional[list] = None, + ): + """ + Args: + public_key: Principal's Ed25519 public key for HDT verification. + tool_class_map: Mapping of tool names to IrreversibilityClass. + Defaults to DEFAULT_TOOL_CLASS_MAP. + confirmation_callback: Called for Class 2 actions. Receives + (tool_name, parameters) and returns bool. + If None, Class 2 actions are blocked. + default_class: Class assigned to unknown tools. Defaults to CLASS_1. + audit_log: Optional list to append VerificationResult records to. + """ + self.public_key = public_key + self.tool_class_map = tool_class_map or DEFAULT_TOOL_CLASS_MAP + self.confirmation_callback = confirmation_callback + self.default_class = default_class + self.audit_log = audit_log if audit_log is not None else [] + + def classify(self, tool_name: str) -> IrreversibilityClass: + """Return the IrreversibilityClass for a tool name.""" + return self.tool_class_map.get(tool_name, self.default_class) + + def gate( + self, + function_call: dict, + token: HDPDelegationToken, + ) -> VerificationResult: + """ + Main verification gate. Call this for every Gemma 4 function call. + + Args: + function_call: Gemma 4 function call dict: + {"name": "tool_name", "parameters": {...}} + token: HDPDelegationToken issued by the human principal. + + Returns: + VerificationResult — check .allowed before executing the tool. + """ + tool_name = function_call.get("name", "") + parameters = function_call.get("parameters", {}) + action_class = self.classify(tool_name) + + def _block(reason: str) -> VerificationResult: + result = VerificationResult( + allowed=False, + reason=reason, + tool_name=tool_name, + action_class=action_class, + token_iss=token.iss if token else None, + ) + self.audit_log.append(result) + print(result) + return result + + def _allow(reason: str, requires_confirmation: bool = False) -> VerificationResult: + result = VerificationResult( + allowed=True, + reason=reason, + tool_name=tool_name, + action_class=action_class, + token_iss=token.iss, + requires_confirmation=requires_confirmation, + ) + self.audit_log.append(result) + print(result) + return result + + # ── 1. Token presence ─────────────────────────────────────────────── + if token is None: + return _block("no HDT present") + + # ── 2. Expiry ─────────────────────────────────────────────────────── + if token.is_expired(): + return _block("HDT expired") + + # ── 3. Signature ──────────────────────────────────────────────────── + if not token.verify(self.public_key): + return _block("HDT signature invalid") + + # ── 4. Scope ──────────────────────────────────────────────────────── + if not token.permits_tool(tool_name): + return _block(f"tool '{tool_name}' not in HDT scope") + + # ── 5. Irreversibility class ceiling ──────────────────────────────── + if not token.permits_class(action_class): + return _block( + f"action class {action_class.name} exceeds HDT ceiling " + f"{token.max_irreversibility_class.name}" + ) + + # ── 6. Class 3 — always blocked without explicit dual verification ── + if action_class == IrreversibilityClass.CLASS_3: + # In production: implement dual-principal confirmation (HDP-P §5.4) + return _block( + "Class 3 physical action requires dual-principal confirmation " + "(HDP-P §5.4) — not implemented in this middleware instance" + ) + + # ── 7. Class 2 — confirmation callback required ───────────────────── + if action_class == IrreversibilityClass.CLASS_2: + if self.confirmation_callback is None: + return _block( + "Class 2 action requires confirmation callback — " + "none configured" + ) + confirmed = self.confirmation_callback(tool_name, parameters) + if not confirmed: + return _block("Class 2 action — confirmation denied by principal") + return _allow("Class 2 confirmed by principal", requires_confirmation=True) + + # ── 8. Class 0 / 1 — allow ───────────────────────────────────────── + return _allow(f"HDT valid, scope and class verified") + + def gate_batch( + self, + function_calls: list[dict], + token: HDPDelegationToken, + ) -> list[VerificationResult]: + """Verify a list of function calls. Returns one result per call.""" + return [self.gate(fc, token) for fc in function_calls] diff --git a/tooling/google-official/cookbook/docs_gemma_chat.ipynb b/tooling/google-official/cookbook/docs_gemma_chat.ipynb new file mode 100644 index 0000000..1eb5aa4 --- /dev/null +++ b/tooling/google-official/cookbook/docs_gemma_chat.ipynb @@ -0,0 +1,1008 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "G3MMAcssHTML" + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tce3stUlHN0L" + }, + "source": [ + "##### Copyright 2024 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "tuOe1ymfHZPu" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4qxv4Sn9b8CE" + }, + "source": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " View on ai.google.dev\n", + " \n", + " Run in Google Colab\n", + " \n", + " Run in Kaggle\n", + " \n", + " Open in Vertex AI\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "402c3d8a" + }, + "source": [ + "# Building a chatbot with Gemma" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b686fd95" + }, + "source": [ + "Large Language Models (LLMs) such as Gemma excel at generating informative responses, making them ideal for building virtual assistants and chatbots.\n", + "\n", + "Conventionally, LLMs operate in a stateless manner, meaning they lack an inherent memory to store past conversations. Each prompt or question is processed independently, disregarding prior interactions. However, a crucial aspect of natural conversation is the ability to retain context from prior interactions. To overcome this limitation and enable LLMs to maintain conversation context, they must be explicitly provided with relevant information such as the conversation history (or pertinent parts) into each new prompt presented to the LLM.\n", + "\n", + "This tutorial shows you how to develop a chatbot using the instruction-tuned model variant of Gemma." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "29732090" + }, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QQ6W7NzRe1VM" + }, + "source": [ + "### Gemma setup\n", + "\n", + "To complete this tutorial, you'll first need to complete the setup instructions at [Gemma setup](https://ai.google.dev/gemma/docs/setup). The Gemma setup instructions show you how to do the following:\n", + "\n", + "* Get access to Gemma on kaggle.com.\n", + "* Select a Colab runtime with sufficient resources to run\n", + " the Gemma 2B model.\n", + "* Generate and configure a Kaggle username and API key.\n", + "\n", + "After you've completed the Gemma setup, move on to the next section, where you'll set environment variables for your Colab environment." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_gN-IVRC3dQe" + }, + "source": [ + "### Set environment variables\n", + "\n", + "Set environment variables for `KAGGLE_USERNAME` and `KAGGLE_KEY`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "DrBoa_Urw9Vx" + }, + "outputs": [], + "source": [ + "import os\n", + "from google.colab import userdata\n", + "\n", + "# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env\n", + "# vars as appropriate for your system.\n", + "os.environ[\"KAGGLE_USERNAME\"] = userdata.get('KAGGLE_USERNAME')\n", + "os.environ[\"KAGGLE_KEY\"] = userdata.get('KAGGLE_KEY')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z9oy3QUmXtSd" + }, + "source": [ + "### Install dependencies\n", + "\n", + "Install Keras and KerasNLP." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "a973dd7a" + }, + "outputs": [], + "source": [ + "# Install Keras 3 last. See https://keras.io/getting_started/ for more details.\n", + "!pip install -q tensorflow-cpu\n", + "!pip install -q -U keras-nlp tensorflow-hub\n", + "!pip install -q -U \"keras>=3\"\n", + "!pip install -q -U tensorflow-text" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wme8666dUPVR" + }, + "source": [ + "### Select a backend\n", + "\n", + "Keras is a high-level, multi-framework deep learning API designed for simplicity and ease of use. [Keras 3](https://keras.io/keras_3){:.external} lets you choose the backend: TensorFlow, JAX, or PyTorch. All three will work for this tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "67d12d2d" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# Select JAX as the backend\n", + "os.environ[\"KERAS_BACKEND\"] = \"jax\"\n", + "\n", + "# Pre-allocate 100% of TPU memory to minimize memory fragmentation\n", + "os.environ[\"XLA_PYTHON_CLIENT_MEM_FRACTION\"] = \"1.0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ajm_SGWTUjVd" + }, + "source": [ + "### Import packages\n", + "\n", + "Import Keras and KerasNLP." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3lyn9FxPUok8" + }, + "outputs": [], + "source": [ + "import keras\n", + "import keras_nlp\n", + "\n", + "# for reproducibility\n", + "keras.utils.set_random_seed(42)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "39dc9d5b" + }, + "source": [ + "### Instantiate the model\n", + "\n", + "KerasNLP provides implementations of many popular [model architectures](https://keras.io/api/keras_nlp/models/){:.external}. In this tutorial, you'll instantiate the model using `GemmaCausalLM`, an end-to-end Gemma model for causal language modeling. A causal language model predicts the next token based on previous tokens.\n", + "\n", + "Instantiate the model using the `from_preset` method:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "c86dc8fe" + }, + "outputs": [], + "source": [ + "gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset(\"gemma2_instruct_2b_en\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tcCv0BSdVFv9" + }, + "source": [ + "The `GemmaCausalLM.from_preset()` function instantiates the model from a preset architecture and weights. In the code above, the string `\"gemma2_instruct_2b_en\"` specifies the preset the Gemma 2 2B model with 2 billion parameters. Gemma models with [7B, 9B, and 27B parameters](https://ai.google.com/gemma/docs/get_started#models-list) are also available. You can find the code strings for Gemma models in their **Model Variation** listings on [Kaggle](https://www.kaggle.com/models/google/gemma).\n", + "\n", + "Note: To run the larger models in Colab, you need access to the premium GPUs available in paid plans. Alternatively, you can perform inferences using Kaggle notebooks or Google Cloud projects." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bLNx8AoeVe-a" + }, + "source": [ + "Use the `summary` method to get more info about the model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3MorieIpVksu" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
Preprocessor: \"gemma_causal_lm_preprocessor\"\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1mPreprocessor: \"gemma_causal_lm_preprocessor\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+              "┃ Tokenizer (type)                                                                                Vocab # ┃\n",
+              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+              "│ gemma_tokenizer (GemmaTokenizer)                   │                                             256,000 │\n",
+              "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n",
+              "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mTokenizer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Vocab #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│ gemma_tokenizer (\u001b[38;5;33mGemmaTokenizer\u001b[0m) │ \u001b[38;5;34m256,000\u001b[0m │\n", + "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Model: \"gemma_causal_lm\"\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"gemma_causal_lm\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+              "┃ Layer (type)                   Output Shape                       Param #  Connected to               ┃\n",
+              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+              "│ padding_mask (InputLayer)     │ (None, None)              │               0 │ -                          │\n",
+              "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
+              "│ token_ids (InputLayer)        │ (None, None)              │               0 │ -                          │\n",
+              "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
+              "│ gemma_backbone                │ (None, None, 2304)        │   2,614,341,888 │ padding_mask[0][0],        │\n",
+              "│ (GemmaBackbone)               │                           │                 │ token_ids[0][0]            │\n",
+              "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
+              "│ token_embedding               │ (None, None, 256000)      │     589,824,000 │ gemma_backbone[0][0]       │\n",
+              "│ (ReversibleEmbedding)         │                           │                 │                            │\n",
+              "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n",
+              "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to \u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│ padding_mask (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n", + "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n", + "│ token_ids (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n", + "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n", + "│ gemma_backbone │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2304\u001b[0m) │ \u001b[38;5;34m2,614,341,888\u001b[0m │ padding_mask[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n", + "│ (\u001b[38;5;33mGemmaBackbone\u001b[0m) │ │ │ token_ids[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n", + "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n", + "│ token_embedding │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256000\u001b[0m) │ \u001b[38;5;34m589,824,000\u001b[0m │ gemma_backbone[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n", + "│ (\u001b[38;5;33mReversibleEmbedding\u001b[0m) │ │ │ │\n", + "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 2,614,341,888 (9.74 GB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2,614,341,888\u001b[0m (9.74 GB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 2,614,341,888 (9.74 GB)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m2,614,341,888\u001b[0m (9.74 GB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 0 (0.00 B)\n",
+              "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gemma_lm.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ArZPOzFpVp6S" + }, + "source": [ + "As you can see from the summary, the model has 2.6 billion trainable parameters.\n", + "\n", + "Note: For purposes of naming the model (\"2B\"), the embedding layer is not counted against the number of parameters." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1WpS39TBYql9" + }, + "source": [ + "### Define formatting helper functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3-obTC1jZGpZ" + }, + "outputs": [], + "source": [ + "from IPython.display import Markdown\n", + "import textwrap\n", + "\n", + "def display_chat(prompt, text):\n", + " formatted_prompt = \"🙋‍♂️
\" + prompt + \"
\"\n", + " text = text.replace('•', ' *')\n", + " text = textwrap.indent(text, '> ', predicate=lambda _: True)\n", + " formatted_text = \"🤖\\n\\n\" + text + \"\\n\"\n", + " return Markdown(formatted_prompt+formatted_text)\n", + "\n", + "def to_markdown(text):\n", + " text = text.replace('•', ' *')\n", + " return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5ca54e8c" + }, + "source": [ + "## Building the chatbot\n", + "\n", + "The Gemma instruction-tuned model `gemma2_instruct_2b_en` is fine-tuned to understand the following turn tokens:\n", + "\n", + "```\n", + "user\\n ... \\n\n", + "model\\n ... \\n\n", + "```\n", + "\n", + "This tutorial uses these tokens to build the chatbot. Refer to [Formatting and system instructions](https://ai.google.dev/gemma/docs/formatting) for more information on Gemma control tokens.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9583dfd1" + }, + "source": [ + "### Create a chat helper to manage the conversation state" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e4e9a187" + }, + "outputs": [], + "source": [ + "class ChatState():\n", + " \"\"\"\n", + " Manages the conversation history for a turn-based chatbot\n", + " Follows the turn-based conversation guidelines for the Gemma family of models\n", + " documented at https://ai.google.dev/gemma/docs/formatting\n", + " \"\"\"\n", + "\n", + " __START_TURN_USER__ = \"user\\n\"\n", + " __START_TURN_MODEL__ = \"model\\n\"\n", + " __END_TURN__ = \"\\n\"\n", + "\n", + " def __init__(self, model, system=\"\"):\n", + " \"\"\"\n", + " Initializes the chat state.\n", + "\n", + " Args:\n", + " model: The language model to use for generating responses.\n", + " system: (Optional) System instructions or bot description.\n", + " \"\"\"\n", + " self.model = model\n", + " self.system = system\n", + " self.history = []\n", + "\n", + " def add_to_history_as_user(self, message):\n", + " \"\"\"\n", + " Adds a user message to the history with start/end turn markers.\n", + " \"\"\"\n", + " self.history.append(self.__START_TURN_USER__ + message + self.__END_TURN__)\n", + "\n", + " def add_to_history_as_model(self, message):\n", + " \"\"\"\n", + " Adds a model response to the history with start/end turn markers.\n", + " \"\"\"\n", + " self.history.append(self.__START_TURN_MODEL__ + message)\n", + "\n", + " def get_history(self):\n", + " \"\"\"\n", + " Returns the entire chat history as a single string.\n", + " \"\"\"\n", + " return \"\".join([*self.history])\n", + "\n", + " def get_full_prompt(self):\n", + " \"\"\"\n", + " Builds the prompt for the language model, including history and system description.\n", + " \"\"\"\n", + " prompt = self.get_history() + self.__START_TURN_MODEL__\n", + " if len(self.system)>0:\n", + " prompt = self.system + \"\\n\" + prompt\n", + " return prompt\n", + "\n", + " def send_message(self, message):\n", + " \"\"\"\n", + " Handles sending a user message and getting a model response.\n", + "\n", + " Args:\n", + " message: The user's message.\n", + "\n", + " Returns:\n", + " The model's response.\n", + " \"\"\"\n", + " self.add_to_history_as_user(message)\n", + " prompt = self.get_full_prompt()\n", + " response = self.model.generate(prompt, max_length=2048)\n", + " result = response.replace(prompt, \"\") # Extract only the new response\n", + " self.add_to_history_as_model(result)\n", + " return result\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9hmJS4h4ZmiP" + }, + "source": [ + "### Chat with the model\n", + "\n", + "Start chatting with the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "b1913181" + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "🙋‍♂️
Tell me, in a few words, how to compute all prime numbers up to 1000?
🤖\n", + "\n", + "> **Sieve of Eratosthenes.** \n", + "> \n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chat = ChatState(gemma_lm)\n", + "message = \"Tell me, in a few words, how to compute all prime numbers up to 1000?\"\n", + "display_chat(message, chat.send_message(message))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ODKxUPP2Zuqy" + }, + "source": [ + "Continue the conversation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "7448005b" + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "🙋‍♂️
Now in Python! No numpy, please!
🤖\n", + "\n", + "> ```python\n", + "> def sieve_of_eratosthenes(n):\n", + "> \"\"\"Returns a list of prime numbers up to n.\"\"\"\n", + "> primes = [True] * (n + 1)\n", + "> primes[0] = primes[1] = False\n", + "> for i in range(2, int(n**0.5) + 1):\n", + "> if primes[i]:\n", + "> for j in range(i * i, n + 1, i):\n", + "> primes[j] = False\n", + "> return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "> \n", + "> primes = sieve_of_eratosthenes(1000)\n", + "> print(primes)\n", + "> ```\n", + "> \n", + "> **Explanation:**\n", + "> \n", + "> 1. **Initialization:**\n", + "> - `primes = [True] * (n + 1)`: Creates a list `primes` of boolean values, initially assuming all numbers are prime.\n", + "> - `primes[0] = primes[1] = False`: Sets 0 and 1 as non-prime.\n", + "> \n", + "> 2. **Iteration:**\n", + "> - `for i in range(2, int(n**0.5) + 1):`: Iterates from 2 to the square root of `n`. We only need to check up to the square root because any composite number must have a prime factor less than or equal to its square root.\n", + "> - `if primes[i]:`: If `i` is marked as prime:\n", + "> - `for j in range(i * i, n + 1, i):`: Marks all multiples of `i` as non-prime.\n", + "> \n", + "> 3. **Result:**\n", + "> - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Creates a list of indices where `primes[i]` is True, representing the prime numbers.\n", + "> \n", + "> \n", + "> Let me know if you'd like a more detailed explanation of any part! \n", + "> \n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "message = \"Now in Python! No numpy, please!\"\n", + "display_chat(message, chat.send_message(message))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "0973ff54" + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "🙋‍♂️
Thank you, it works! Can you explain the code in French?
🤖\n", + "\n", + "> Bien sûr ! Voici une explication du code en français :\n", + "> \n", + "> ```python\n", + "> def sieve_of_eratosthenes(n):\n", + "> \"\"\"Retourne une liste de nombres premiers jusqu'à n.\"\"\"\n", + "> primes = [True] * (n + 1)\n", + "> primes[0] = primes[1] = False\n", + "> for i in range(2, int(n**0.5) + 1):\n", + "> if primes[i]:\n", + "> for j in range(i * i, n + 1, i):\n", + "> primes[j] = False\n", + "> return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "> \n", + "> primes = sieve_of_eratosthenes(1000)\n", + "> print(primes)\n", + "> ```\n", + "> \n", + "> **Explication:**\n", + "> \n", + "> 1. **Initialisation:**\n", + "> - `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers.\n", + "> - `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers.\n", + "> \n", + "> 2. **Itération:**\n", + "> - `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée.\n", + "> - `if primes[i]:`: Si `i` est considéré comme premier:\n", + "> - `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers.\n", + "> \n", + "> 3. **Resultat:**\n", + "> - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers.\n", + "> \n", + "> \n", + "> N'hésitez pas à me demander si vous avez besoin d'une explication plus détaillée de quelque chose! \n", + "> \n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "message = \"Thank you, it works! Can you explain the code in French?\"\n", + "display_chat(message, chat.send_message(message))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "a0c51f42" + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "🙋‍♂️
Great! Now add those explanations as comments in the code.
🤖\n", + "\n", + "> ```python\n", + "> def sieve_of_eratosthenes(n):\n", + "> \"\"\"Retourne une liste de nombres premiers jusqu'à n.\"\"\"\n", + "> # Initialise une liste de boolean avec True pour tous les nombres de 0 à n\n", + "> primes = [True] * (n + 1)\n", + "> # Définit 0 et 1 comme non-premiers\n", + "> primes[0] = primes[1] = False\n", + "> # Itère de 2 à la racine carrée de n\n", + "> for i in range(2, int(n**0.5) + 1):\n", + "> # Si i est considéré comme premier\n", + "> if primes[i]:\n", + "> # Itère sur tous les multiples de i\n", + "> for j in range(i * i, n + 1, i):\n", + "> # Définit les multiples de i comme non-premiers\n", + "> primes[j] = False\n", + "> # Retourne la liste des indices des nombres premiers\n", + "> return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "> \n", + "> primes = sieve_of_eratosthenes(1000)\n", + "> print(primes)\n", + "> ```\n", + "> \n", + "> **Explication:**\n", + "> \n", + "> * **Initialisation:**\n", + "> * `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers.\n", + "> * `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers.\n", + "> * **Itération:**\n", + "> * `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée.\n", + "> * `if primes[i]:`: Si `i` est considéré comme premier:\n", + "> * `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers.\n", + "> * **Resultat:**\n", + "> * `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers. \n", + "> \n", + "> \n", + "> \n", + "> \n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "message = \"Great! Now add those explanations as comments in the code.\"\n", + "display_chat(message, chat.send_message(message))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "51a33627" + }, + "source": [ + "Test the generated response by running the generated code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "221c0817" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]\n" + ] + } + ], + "source": [ + "def sieve_of_eratosthenes(n):\n", + " \"\"\"Retourne une liste de nombres premiers jusqu'à n.\"\"\"\n", + " # Initialise une liste de boolean avec True pour tous les nombres de 0 à n\n", + " primes = [True] * (n + 1)\n", + " # Définit 0 et 1 comme non-premiers\n", + " primes[0] = primes[1] = False\n", + " # Itère de 2 à la racine carrée de n\n", + " for i in range(2, int(n**0.5) + 1):\n", + " # Si i est considéré comme premier\n", + " if primes[i]:\n", + " # Itère sur tous les multiples de i\n", + " for j in range(i * i, n + 1, i):\n", + " # Définit les multiples de i comme non-premiers\n", + " primes[j] = False\n", + " # Retourne la liste des indices des nombres premiers\n", + " return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "\n", + "primes = sieve_of_eratosthenes(1000)\n", + "print(primes)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1c8ece6c" + }, + "source": [ + "Use the `get_history` method to see how all the context was retained by the `Chat` class." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "e48f4ca1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "user\n", + "Tell me, in a few words, how to compute all prime numbers up to 1000?\n", + "model\n", + "**Sieve of Eratosthenes.** \n", + "user\n", + "Now in Python! No numpy, please!\n", + "model\n", + "```python\n", + "def sieve_of_eratosthenes(n):\n", + " \"\"\"Returns a list of prime numbers up to n.\"\"\"\n", + " primes = [True] * (n + 1)\n", + " primes[0] = primes[1] = False\n", + " for i in range(2, int(n**0.5) + 1):\n", + " if primes[i]:\n", + " for j in range(i * i, n + 1, i):\n", + " primes[j] = False\n", + " return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "\n", + "primes = sieve_of_eratosthenes(1000)\n", + "print(primes)\n", + "```\n", + "\n", + "**Explanation:**\n", + "\n", + "1. **Initialization:**\n", + " - `primes = [True] * (n + 1)`: Creates a list `primes` of boolean values, initially assuming all numbers are prime.\n", + " - `primes[0] = primes[1] = False`: Sets 0 and 1 as non-prime.\n", + "\n", + "2. **Iteration:**\n", + " - `for i in range(2, int(n**0.5) + 1):`: Iterates from 2 to the square root of `n`. We only need to check up to the square root because any composite number must have a prime factor less than or equal to its square root.\n", + " - `if primes[i]:`: If `i` is marked as prime:\n", + " - `for j in range(i * i, n + 1, i):`: Marks all multiples of `i` as non-prime.\n", + "\n", + "3. **Result:**\n", + " - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Creates a list of indices where `primes[i]` is True, representing the prime numbers.\n", + "\n", + "\n", + "Let me know if you'd like a more detailed explanation of any part! \n", + "user\n", + "Thank you, it works! Can you explain the code in French?\n", + "model\n", + "Bien sûr ! Voici une explication du code en français :\n", + "\n", + "```python\n", + "def sieve_of_eratosthenes(n):\n", + " \"\"\"Retourne une liste de nombres premiers jusqu'à n.\"\"\"\n", + " primes = [True] * (n + 1)\n", + " primes[0] = primes[1] = False\n", + " for i in range(2, int(n**0.5) + 1):\n", + " if primes[i]:\n", + " for j in range(i * i, n + 1, i):\n", + " primes[j] = False\n", + " return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "\n", + "primes = sieve_of_eratosthenes(1000)\n", + "print(primes)\n", + "```\n", + "\n", + "**Explication:**\n", + "\n", + "1. **Initialisation:**\n", + " - `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers.\n", + " - `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers.\n", + "\n", + "2. **Itération:**\n", + " - `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée.\n", + " - `if primes[i]:`: Si `i` est considéré comme premier:\n", + " - `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers.\n", + "\n", + "3. **Resultat:**\n", + " - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers.\n", + "\n", + "\n", + "N'hésitez pas à me demander si vous avez besoin d'une explication plus détaillée de quelque chose! \n", + "user\n", + "Great! Now add those explanations as comments in the code.\n", + "model\n", + "```python\n", + "def sieve_of_eratosthenes(n):\n", + " \"\"\"Retourne une liste de nombres premiers jusqu'à n.\"\"\"\n", + " # Initialise une liste de boolean avec True pour tous les nombres de 0 à n\n", + " primes = [True] * (n + 1)\n", + " # Définit 0 et 1 comme non-premiers\n", + " primes[0] = primes[1] = False\n", + " # Itère de 2 à la racine carrée de n\n", + " for i in range(2, int(n**0.5) + 1):\n", + " # Si i est considéré comme premier\n", + " if primes[i]:\n", + " # Itère sur tous les multiples de i\n", + " for j in range(i * i, n + 1, i):\n", + " # Définit les multiples de i comme non-premiers\n", + " primes[j] = False\n", + " # Retourne la liste des indices des nombres premiers\n", + " return [i for i, is_prime in enumerate(primes) if is_prime]\n", + "\n", + "primes = sieve_of_eratosthenes(1000)\n", + "print(primes)\n", + "```\n", + "\n", + "**Explication:**\n", + "\n", + "* **Initialisation:**\n", + " * `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers.\n", + " * `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers.\n", + "* **Itération:**\n", + " * `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée.\n", + " * `if primes[i]:`: Si `i` est considéré comme premier:\n", + " * `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers.\n", + "* **Resultat:**\n", + " * `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers. \n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(chat.get_history())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9693c66f" + }, + "source": [ + "## Summary and further reading\n", + "\n", + "In this tutorial, you learned how to chat with the Gemma 2B Instruction tuned model using Keras on JAX.\n", + "\n", + "Check out these guides and tutorials to learn more about Gemma:\n", + "\n", + "* [Get started with Keras Gemma](https://ai.google.dev/gemma/docs/get_started).\n", + "* [Finetune the Gemma model on GPU](https://ai.google.dev/gemma/docs/lora_tuning).\n", + "* Learn about [Gemma integration with Vertex AI](https://ai.google.dev/gemma/docs/integrations/vertex)\n", + "* Learn how to [use Gemma models with Vertex AI](https://cloud.google.com/vertex-ai/docs/generative-ai/open-models/use-gemma){:.external}.\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "gemma_chat.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/google-official/cookbook/tutorials_RAG_EmbeddingGemma.ipynb b/tooling/google-official/cookbook/tutorials_RAG_EmbeddingGemma.ipynb new file mode 100644 index 0000000..70a8e27 --- /dev/null +++ b/tooling/google-official/cookbook/tutorials_RAG_EmbeddingGemma.ipynb @@ -0,0 +1,925 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "-u7xRR3DeFXz" + }, + "source": [ + "##### Copyright 2026 Google LLC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "oed1Dh9SeIlD" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A0UbyyBOeKmV" + }, + "source": [ + "# RAG with EmbeddingGemma\n", + "\n", + "\n", + " \n", + "
\n", + " Run in Google Colab\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ND35JUp9ecq2" + }, + "source": [ + "EmbeddingGemma is a lightweight, open embedding model designed for fast, high-quality retrieval on everyday devices like mobile phones. At only 308 million parameters, it's efficient enough to run advanced AI techniques, such as Retrieval Augmented Generation (RAG), directly on your local machine with no internet connection required.\n", + "\n", + "## Setup\n", + "\n", + "Before starting this tutorial, complete the following steps:\n", + "\n", + "* Get access to EmbeddingGemma by logging into [Hugging Face](https://huggingface.co/google/embeddinggemma-300M) and selecting **Acknowledge license** for a Gemma model.\n", + "* Select a Colab runtime with sufficient resources to run\n", + " the Gemma model size you want to run. [Learn more](https://ai.google.dev/gemma/docs/core#sizes).\n", + "* Generate a Hugging Face [Access Token](https://huggingface.co/docs/hub/en/security-tokens#how-to-manage-user-access-token) and use it to login from Colab.\n", + "\n", + "This notebook will run on an NVIDIA T4 GPU." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SZ8cw1nPf-NV" + }, + "source": [ + "### Install Python packages\n", + "\n", + "Install the libraries required for running the EmbeddingGemma model and generating embeddings. Sentence Transformers is a Python framework for text and image embeddings. For more information, see the [Sentence Transformers](https://www.sbert.net/) documentation." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "daXx6O20Q7M0" + }, + "outputs": [], + "source": [ + "!pip install -q -U sentence-transformers transformers" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kYiTsNFSjGJH" + }, + "source": [ + "After you have accepted the license, you need a valid Hugging Face Token to access the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eLagJ9aff9Ks" + }, + "outputs": [], + "source": [ + "# Login into Hugging Face Hub\n", + "from huggingface_hub import login\n", + "login()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IiDcW_rmHBfx" + }, + "source": [ + "### Load language model\n", + "\n", + "You will use Gemma 4 E2B to generate responses." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "HX2JFDQI-vg8" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c0b54b8b91da46fdb7ba8fd3aecb5002", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "config.json: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4291694230e74608a2808adde451bd0f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/10.2G [00:00\n", + " ```python\n", + " query_embedding = model.encode(\n", + " \"How do I use prompts with this model?\",\n", + " prompt_name=\"Retrieval-query\"\n", + " )\n", + " ```\n", + "\n", + "* **For Documents:** Use `prompt_name=\"Retrieval-document\"`. To further improve document embeddings, you can also include a title by using the `prompt` argument directly:
\n", + " * **With a title:**
\n", + " ```python\n", + " doc_embedding = model.encode(\n", + " \"The document text...\",\n", + " prompt=\"title: Using Prompts in RAG | text: \"\n", + " )\n", + " ```\n", + " * **Without a title:**
\n", + " ```python\n", + " doc_embedding = model.encode(\n", + " \"The document text...\",\n", + " prompt=\"title: none | text: \"\n", + " )\n", + " ```\n", + "\n", + "### Further Reading\n", + "\n", + "* For details on all available EmbeddingGemma prompts, see the [model card](http://ai.google.dev/gemma/docs/embeddinggemma/model_card#prompt_instructions).\n", + "* For general information on prompt templates, see the [Sentence Transformer documentation](https://sbert.net/examples/sentence_transformer/applications/computing-embeddings/README.html#prompt-templates).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "Y5hVNF3F-qZ7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available tasks:\n", + " query: \"task: search result | query: \"\n", + " document: \"title: none | text: \"\n", + " BitextMining: \"task: search result | query: \"\n", + " Clustering: \"task: clustering | query: \"\n", + " Classification: \"task: classification | query: \"\n", + " InstructionRetrieval: \"task: code retrieval | query: \"\n", + " MultilabelClassification: \"task: classification | query: \"\n", + " PairClassification: \"task: sentence similarity | query: \"\n", + " Reranking: \"task: search result | query: \"\n", + " Retrieval: \"task: search result | query: \"\n", + " Retrieval-query: \"task: search result | query: \"\n", + " Retrieval-document: \"title: none | text: \"\n", + " STS: \"task: sentence similarity | query: \"\n", + " Summarization: \"task: summarization | query: \"\n" + ] + } + ], + "source": [ + "print(\"Available tasks:\")\n", + "for name, prefix in model.prompts.items():\n", + " print(f\" {name}: \\\"{prefix}\\\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eIfWZ_z3xDZq" + }, + "source": [ + "## Simple RAG example\n", + "\n", + "Retrieval is the task of finding the most relevant pieces of information from a large collection (a database, a set of documents, a website) based on the meaning of a query, not just keywords.\n", + "\n", + "Imagine you work for a company, and you need to find information from the internal employee handbook, which is stored as a collection of hundreds of documents." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "cellView": "form", + "id": "fbaiy-CXRAs7" + }, + "outputs": [], + "source": [ + "#@title Corp knowledge base\n", + "corp_knowledge_base = [\n", + " {\n", + " \"category\": \"HR & Leave Policies\",\n", + " \"documents\": [\n", + " {\n", + " \"title\": \"Procedure for Unscheduled Absence\",\n", + " \"content\": \"In the event of an illness or emergency preventing you from working, please notify both your direct manager and the HR department via email by 9:30 AM JST. The subject line should be 'Sick Leave - [Your Name]'. If the absence extends beyond two consecutive days, a doctor's certificate (診断書) will be required upon your return.\"\n", + " },\n", + " {\n", + " \"title\": \"Annual Leave Policy\",\n", + " \"content\": \"Full-time employees are granted 10 days of annual paid leave in their first year. This leave is granted six months after the date of joining and increases each year based on length of service. For example, an employee in their third year of service is entitled to 14 days per year. For a detailed breakdown, please refer to the attached 'Annual Leave Accrual Table'.\"\n", + " },\n", + " ]\n", + " },\n", + " {\n", + " \"category\": \"IT & Security\",\n", + " \"documents\": [\n", + " {\n", + " \"title\": \"Account Password Management\",\n", + " \"content\": \"If you have forgotten your password or your account is locked, please use the self-service reset portal at https://reset.ourcompany. You will be prompted to answer your pre-configured security questions. For security reasons, the IT Help Desk cannot reset passwords over the phone or email. If you have not set up your security questions, please visit the IT support desk on the 12th floor of the Shibuya office with your employee ID card.\"\n", + " },\n", + " {\n", + " \"title\": \"Software Procurement Process\",\n", + " \"content\": \"All requests for new software must be submitted through the 'IT Service Desk' portal under the 'Software Request' category. Please include a business justification for the request. All software licenses require approval from your department head before procurement can begin. Please note that standard productivity software is pre-approved and does not require this process.\"\n", + " },\n", + " ]\n", + " },\n", + " {\n", + " \"category\": \"Finance & Expenses\",\n", + " \"documents\": [\n", + " {\n", + " \"title\": \"Expense Reimbursement Policy\",\n", + " \"content\": \"To ensure timely processing, all expense claims for a given month must be submitted for approval no later than the 5th business day of the following month. For example, all expenses incurred in July must be submitted by the 5th business day of August. Submissions after this deadline may be processed in the next payment cycle.\"\n", + " },\n", + " {\n", + " \"title\": \"Business Trip Expense Guidelines\",\n", + " \"content\": \"Travel expenses for business trips will, as a rule, be reimbursed based on the actual cost of the most logical and economical route. Please submit a travel expense application in advance when using the Shinkansen or airplanes. Taxis are permitted only when public transportation is unavailable or when transporting heavy equipment. Receipts are mandatory.\"\n", + " },\n", + " ]\n", + " },\n", + " {\n", + " \"category\": \"Office & Facilities\",\n", + " \"documents\": [\n", + " {\n", + " \"title\": \"Conference Room Booking Instructions\",\n", + " \"content\": \"All conference rooms in the Shibuya office can be reserved through your Calendar App. Create a new meeting invitation, add the attendees, and then use the 'Room Finder' feature to select an available room. Please be sure to select the correct floor. For meetings with more than 10 people, please book the 'Sakura' or 'Fuji' rooms on the 14th floor.\"\n", + " },\n", + " {\n", + " \"title\": \"Mail and Delivery Policy\",\n", + " \"content\": \"The company's mail services are intended for business-related correspondence only. For security and liability reasons, employees are kindly requested to refrain from having personal parcels or mail delivered to the Shibuya office address. The front desk will not be able to accept or hold personal deliveries.\"\n", + " },\n", + " ]\n", + " },\n", + "]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fvecfoko--hL" + }, + "source": [ + "And imagine you have a question like below." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "wN-WHf26J89m" + }, + "outputs": [], + "source": [ + "question = \"How do I reset my password?\" # @param [\"How many days of annual paid leave do I get?\", \"How do I reset my password?\", \"What travel expenses can be reimbursed for a business trip?\", \"Can I receive personal packages at the office?\"] {type:\"string\", allow-input: true}\n", + "\n", + "# Define a minimum confidence threshold for a match to be considered valid\n", + "similarity_threshold = 0.4 # @param {\"type\":\"slider\",\"min\":0,\"max\":1,\"step\":0.1}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2CSeSmF7OuMB" + }, + "source": [ + "Search relevant document from the corporate knowledge base." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "NngqWUxOyrLS" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step 1: Finding the best category...\n", + "['HR & Leave Policies', 'IT & Security', 'Finance & Expenses', 'Office & Facilities']\n", + "tensor([[0.5063, 0.5937, 0.5076, 0.4221]])\n", + " `-> ✅ Category Found: 'IT & Security' (Score: 0.59)\n", + "\n", + "Step 2: Finding the best document in that category...\n", + "['Account Password Management', 'Software Procurement Process']\n", + "tensor([[0.5829, 0.1531]])\n", + " `-> ✅ Document Found: 'Account Password Management' (Score: 0.58)\n" + ] + } + ], + "source": [ + "# --- Helper Functions for Semantic Search ---\n", + "\n", + "def _calculate_best_match(similarities):\n", + " print(similarities)\n", + " if similarities is None or similarities.nelement() == 0:\n", + " return None, 0.0\n", + "\n", + " # Find the index and value of the highest score\n", + " best_index = similarities.argmax().item()\n", + " best_score = similarities[0, best_index].item()\n", + "\n", + " return best_index, best_score\n", + "\n", + "def find_best_category(model, query, candidates):\n", + " \"\"\"\n", + " Finds the most relevant category from a list of candidates.\n", + "\n", + " Args:\n", + " model: The SentenceTransformer model.\n", + " query: The user's query string.\n", + " candidates: A list of category name strings.\n", + "\n", + " Returns:\n", + " A tuple containing the index of the best category and its similarity score.\n", + " \"\"\"\n", + " if not candidates:\n", + " return None, 0.0\n", + "\n", + " # Encode the query and candidate categories for classification\n", + " query_embedding = model.encode(query, prompt_name=\"Classification\")\n", + " candidate_embeddings = model.encode(candidates, prompt_name=\"Classification\")\n", + "\n", + " print(candidates)\n", + " return _calculate_best_match(model.similarity(query_embedding, candidate_embeddings))\n", + "\n", + "def find_best_doc(model, query, candidates):\n", + " \"\"\"\n", + " Finds the most relevant document from a list of candidates.\n", + "\n", + " Args:\n", + " model: The SentenceTransformer model.\n", + " query: The user's query string.\n", + " candidates: A list of document dictionaries, each with 'title' and 'content'.\n", + "\n", + " Returns:\n", + " A tuple containing the index of the best document and its similarity score.\n", + " \"\"\"\n", + " if not candidates:\n", + " return None, 0.0\n", + "\n", + " # Encode the query for retrieval\n", + " query_embedding = model.encode(query, prompt_name=\"Retrieval-query\")\n", + "\n", + " # Encode the document for similarity check\n", + " doc_texts = [\n", + " f\"title: {doc.get('title', 'none')} | text: {doc.get('content', '')}\"\n", + " for doc in candidates\n", + " ]\n", + " candidate_embeddings = model.encode(doc_texts)\n", + "\n", + " print([doc['title'] for doc in candidates])\n", + "\n", + " # Calculate cosine similarity\n", + " return _calculate_best_match(model.similarity(query_embedding, candidate_embeddings))\n", + "\n", + "# --- Main Search Logic ---\n", + "\n", + "# In your application, `best_document` would result from a search.\n", + "# We initialize it to None to ensure it always exists.\n", + "best_document = None\n", + "\n", + "# 1. Find the most relevant category\n", + "print(\"Step 1: Finding the best category...\")\n", + "categories = [item[\"category\"] for item in corp_knowledge_base]\n", + "best_category_index, category_score = find_best_category(\n", + " model, question, categories\n", + ")\n", + "\n", + "# Check if the category score meets the threshold\n", + "if category_score < similarity_threshold:\n", + " print(f\" `-> 🤷 No relevant category found. The highest score was only {category_score:.2f}.\")\n", + "else:\n", + " best_category = corp_knowledge_base[best_category_index]\n", + " print(f\" `-> ✅ Category Found: '{best_category['category']}' (Score: {category_score:.2f})\")\n", + "\n", + " # 2. Find the most relevant document ONLY if a good category was found\n", + " print(\"\\nStep 2: Finding the best document in that category...\")\n", + " best_document_index, document_score = find_best_doc(\n", + " model, question, best_category[\"documents\"]\n", + " )\n", + "\n", + " # Check if the document score meets the threshold\n", + " if document_score < similarity_threshold:\n", + " print(f\" `-> 🤷 No relevant document found. The highest score was only {document_score:.2f}.\")\n", + " else:\n", + " best_document = best_category[\"documents\"][best_document_index]\n", + " # 3. Display the final successful result\n", + " print(f\" `-> ✅ Document Found: '{best_document['title']}' (Score: {document_score:.2f})\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zK9T5rRGAMDw" + }, + "source": [ + "Next, generate the answer with the retrieved context" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "FrwKySpMASpt" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Question🙋‍♂️: How do I reset my password?\n", + "Using document: Account Password Management\n", + "Answer🤖: Please use the self-service reset portal at https://reset.ourcompany. You will be prompted to answer your pre-configured security questions.\n" + ] + } + ], + "source": [ + "from transformers import GenerationConfig\n", + "MODEL_ID = \"google/gemma-4-E2B-it\"\n", + "config = GenerationConfig.from_pretrained(MODEL_ID)\n", + "config.max_new_tokens = 512\n", + "\n", + "qa_prompt_template = \"\"\"Answer the following QUESTION based only on the CONTEXT provided. If the answer cannot be found in the CONTEXT, write \"I don't know.\"\n", + "\n", + "---\n", + "CONTEXT:\n", + "{context}\n", + "---\n", + "QUESTION:\n", + "{question}\n", + "\"\"\"\n", + "\n", + "# First, check if a valid document was found before proceeding.\n", + "if best_document and \"content\" in best_document:\n", + " # If the document exists and has a \"content\" key, generate the answer.\n", + " context = best_document[\"content\"]\n", + "\n", + " prompt = qa_prompt_template.format(context=context, question=question)\n", + "\n", + " messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [{\"type\": \"text\", \"text\": prompt}],\n", + " },\n", + " ]\n", + "\n", + " print(\"Question🙋‍♂️: \" + question)\n", + " # This part assumes your pipeline and response parsing logic are correct\n", + " answer = pipeline(messages, generation_config=config)[0][\"generated_text\"][1][\"content\"]\n", + " print(\"Using document: \" + best_document[\"title\"])\n", + " print(\"Answer🤖: \" + answer)\n", + "\n", + "else:\n", + " # If best_document is None or doesn't have content, give a direct response.\n", + " print(\"Question🙋‍♂️: \" + question)\n", + " print(\"Answer🤖: I'm sorry, I could not find a relevant document to answer that question.\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "h4J4pFA3IK1d" + }, + "source": [ + "## Summary and next steps\n", + "\n", + "You have now learned how to build a practical RAG system with EmbeddingGemma.\n", + "\n", + "Explore what more you can do with EmbeddingGemma:\n", + "\n", + "* [Generate embeddings with Sentence Transformers](https://ai.google.dev/gemma/docs/embeddinggemma/inference-embeddinggemma-with-sentence-transformers)\n", + "* [Fine-tune EmbeddingGemma](https://ai.google.dev/gemma/docs/embeddinggemma/fine-tuning-embeddinggemma-with-sentence-transformers)\n", + "* [Mood Palette Generator](https://huggingface.co/spaces/google/mood-palette), an interactive application using EmbeddingGemma" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "RAG_with_EmbeddingGemma.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/google-official/deepmind-gemma/README.md b/tooling/google-official/deepmind-gemma/README.md new file mode 100644 index 0000000..6d50c44 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/README.md @@ -0,0 +1,99 @@ +# Gemma + +[![Unittests](https://github.com/google-deepmind/gemma/actions/workflows/pytest_and_autopublish.yml/badge.svg)](https://github.com/google-deepmind/gemma/actions/workflows/pytest_and_autopublish.yml) +[![PyPI version](https://badge.fury.io/py/gemma.svg)](https://badge.fury.io/py/gemma) +[![Documentation Status](https://readthedocs.org/projects/gemma-llm/badge/?version=latest)](https://gemma-llm.readthedocs.io/en/latest/?badge=latest) + +[Gemma](https://ai.google.dev/gemma) is a family of open-weights Large Language +Model (LLM) by [Google DeepMind](https://deepmind.google/), based on Gemini +research and technology. + +This repository contains the implementation of the +[`gemma`](https://pypi.org/project/gemma/) PyPI package. A +[JAX](https://github.com/jax-ml/jax) library to use and fine-tune Gemma. + +For examples and use cases, see our +[documentation](https://gemma-llm.readthedocs.io/). Please +report issues and feedback in +[our GitHub](https://github.com/google-deepmind/gemma/issues). + +### Installation + +1. Install JAX for CPU, GPU or TPU. Follow the instructions on + [the JAX website](https://jax.readthedocs.io/en/latest/installation.html). +1. Run + + ```sh + pip install gemma + ``` + +### Examples + +Here is a minimal example to have a multi-turn, multi-modal conversation with +Gemma: + +```python +from gemma import gm + +# Model and parameters (Gemma 4) +model = gm.nn.Gemma4_E4B() +params = gm.ckpts.load_params(gm.ckpts.CheckpointPath.GEMMA4_E4B_IT) + +# Example of multi-turn conversation +sampler = gm.text.ChatSampler( + model=model, + params=params, + multi_turn=True, +) + +prompt = """Which of the 2 images do you prefer ? + +Image 1: <|image|> +Image 2: <|image|> + +Write your answer as a poem.""" +out0 = sampler.chat(prompt, images=[image1, image2]) + +out1 = sampler.chat('What about the other image ?') +``` + +The same `ChatSampler` API works with all Gemma versions (2, 3, 3n, 4). + +Our documentation contains various Colabs and tutorials, including: + +* [Sampling](https://gemma-llm.readthedocs.io/en/latest/colab_sampling.html) +* [Multi-modal](https://gemma-llm.readthedocs.io/en/latest/colab_multimodal.html) +* [Fine-tuning](https://gemma-llm.readthedocs.io/en/latest/colab_finetuning.html) +* [LoRA](https://gemma-llm.readthedocs.io/en/latest/colab_lora_sampling.html) +* ... + +Additionally, our +[examples/](https://github.com/google-deepmind/gemma/tree/main/examples) folder +contain additional scripts to fine-tune and sample with Gemma. + +### Learn more about Gemma + +* To use this library: [Gemma documentation](https://gemma-llm.readthedocs.io/) +* Technical reports for metrics and model capabilities: + * [Gemma 1](https://goo.gle/GemmaReport) + * [Gemma 2](https://goo.gle/gemma2report) + * [Gemma 3](https://storage.googleapis.com/deepmind-media/gemma/Gemma3Report.pdf) + * Gemma 4 (Coming soon) +* Other Gemma implementations and doc on the + [Gemma ecosystem](https://ai.google.dev/gemma/docs) + +### Downloading the models + +To download the model weights. See +[our documentation](https://gemma-llm.readthedocs.io/en/latest/checkpoints.html). + +### System Requirements + +Gemma can run on a CPU, GPU and TPU. For GPU, we recommend 8GB+ RAM on GPU for +The 2B checkpoint and 24GB+ RAM on GPU are used for the 7B checkpoint. + +### Contributing + +We welcome contributions! Please read our [Contributing Guidelines](./CONTRIBUTING.md) before submitting a pull request. + +*This is not an official Google product.* diff --git a/tooling/google-official/deepmind-gemma/colab_sampling.ipynb b/tooling/google-official/deepmind-gemma/colab_sampling.ipynb new file mode 100644 index 0000000..94bf66e --- /dev/null +++ b/tooling/google-official/deepmind-gemma/colab_sampling.ipynb @@ -0,0 +1,547 @@ +{ + "cells": [ + { + "metadata": { + "id": "My2AZpV_RuTs" + }, + "cell_type": "markdown", + "source": [ + "# Sampling\n", + "\n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google-deepmind/gemma/blob/main/colabs/sampling.ipynb)\n", + "\n", + "Example on how to load a Gemma model and run inference on it.\n", + "\n", + "The Gemma library has 3 ways to prompt a model:\n", + "\n", + "* `gm.text.ChatSampler`: Easiest to use, simply talk to the model and get answer. Support multi-turns conversations out-of-the-box.\n", + "* `gm.text.Sampler`: Lower level, but give more control. The chat state has to be manually handeled for multi-turn.\n", + "* `model.apply`: Directly call the model, only predict a single token." + ] + }, + { + "metadata": { + "id": "94CVV9ZxKVDO" + }, + "cell_type": "code", + "source": [ + "!pip install -q gemma" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "executionInfo": { + "elapsed": 2610, + "status": "ok", + "timestamp": 1741517119876, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "PXBc1hRKRuTt" + }, + "cell_type": "code", + "source": [ + "# Common imports\n", + "import os\n", + "import jax\n", + "import jax.numpy as jnp\n", + "\n", + "# Gemma imports\n", + "from gemma import gm" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "id": "i_DEVehe3v5Y" + }, + "cell_type": "markdown", + "source": [ + "By default, Jax do not utilize the full GPU memory, but this can be overwritten. See [GPU memory allocation](https://docs.jax.dev/en/latest/gpu_memory_allocation.html):" + ] + }, + { + "metadata": { + "id": "AaK17GWo3v5Y" + }, + "cell_type": "code", + "source": [ + "os.environ[\"XLA_PYTHON_CLIENT_MEM_FRACTION\"]=\"1.00\"" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "id": "XzEj3PYvX1Sm" + }, + "cell_type": "markdown", + "source": [ + "Load the model and the params. Here we load the instruction-tuned version of the model." + ] + }, + { + "metadata": { + "id": "ox1CAuffKJtj" + }, + "cell_type": "code", + "source": [ + "model = gm.nn.Gemma3_4B()\n", + "\n", + "params = gm.ckpts.load_params(gm.ckpts.CheckpointPath.GEMMA3_4B_IT)" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "id": "iRjnbNREdugN" + }, + "cell_type": "markdown", + "source": [ + "## Multi-turns conversations\n", + "\n", + "The easiest way to chat with Gemma is to use the `gm.text.ChatSampler`. It hides the boilerplate of the conversation cache, as well as the `` / `` tokens used to format the conversation.\n", + "\n", + "Here, we set `multi_turn=True` when creating `gm.text.ChatSampler` (by default, the `ChatSampler` start a new conversation every time).\n", + "\n", + "In multi-turn mode, you can erase the previous conversation state, by passing `chatbot.chat(..., multi_turn=False)`." + ] + }, + { + "metadata": { + "executionInfo": { + "elapsed": 18237, + "status": "ok", + "timestamp": 1741517159587, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "bGSE6aTYdxqt", + "outputId": "5d428ab7-f9bf-4898-a921-cd57353ff364" + }, + "cell_type": "code", + "source": [ + "sampler = gm.text.ChatSampler(\n", + " model=model,\n", + " params=params,\n", + " multi_turn=True,\n", + " print_stream=True, # Print output as it is generated.\n", + ")\n", + "\n", + "turn0 = sampler.chat('Share one methapore linking \"shadow\" and \"laughter\".')" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, here's a metaphor linking \"shadow\" and \"laughter,\" aiming for a slightly evocative and layered feel:\n", + "\n", + "**\"Laughter is the fleeting shadow of joy, dancing across a face that’s often hidden in the long shadow of sorrow.\"**\n", + "\n", + "---\n", + "\n", + "**Here's a breakdown of why this works:**\n", + "\n", + "* **\"Shadow\"** represents sadness, pain, or a past experience that lingers. It’s not necessarily a dark shadow, but a persistent presence.\n", + "* **\"Laughter\"** is presented as a brief, bright appearance – a momentary flash of happiness.\n", + "* **\"Dancing across a face that’s often hidden\"** emphasizes that the joy isn't constant, and the underlying sadness is still there, obscuring it.\n", + "\n", + "---\n", + "\n", + "Would you like me to:\n", + "\n", + "* Try a different type of metaphor?\n", + "* Expand on this one with a short story snippet?\n" + ] + } + ], + "execution_count": 3 + }, + { + "metadata": { + "executionInfo": { + "elapsed": 7822, + "status": "ok", + "timestamp": 1741517170597, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "MIZqgSSRfmRS", + "outputId": "575490ff-3d07-48f6-cb39-5fac3553e24a" + }, + "cell_type": "code", + "source": [ + "turn1 = sampler.chat('Expand it in a haiku.')" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, here’s a haiku based on the metaphor:\n", + "\n", + "Shadow stretches long,\n", + "Laughter’s brief, bright, dancing grace,\n", + "Joy hides in the dark. \n", + "\n", + "---\n", + "\n", + "Would you like me to try another haiku, or perhaps a different poetic form?\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "id": "uOQHd6eFd67c" + }, + "cell_type": "markdown", + "source": [ + "Note: By default (`multi_turn=False`), the conversation state is reset everytime, but you can still continue the previous conversation by passing `sampler.chat(..., multi_turn=True)`\n", + "\n", + "By default, greedy decoding is used. You can pass a custom `sampling=` method as kwargs:\n", + "\n", + "* `gm.text.Greedy()`: (default) Greedy decoding\n", + "* `gm.text.RandomSampling()`: Simple random sampling with temperature, for more variety" + ] + }, + { + "metadata": { + "id": "AH0eWFWJaiNk" + }, + "cell_type": "markdown", + "source": [ + "## Sample a prompt\n", + "\n", + "For more control, we also provide a `gm.text.Sampler` which still perform efficient sampling (with kv-caching, early stopping,...).\n", + "\n", + "Prompting the sampler require to correctly add format the prompt with the `` / `` tokens (see the custom token section doc on [tokenizer](https://gemma-llm.readthedocs.io/en/latest/tokenizer.html))." + ] + }, + { + "metadata": { + "executionInfo": { + "elapsed": 14339, + "status": "ok", + "timestamp": 1741277003042, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "6R5J42EiZtkC", + "outputId": "e309909f-b627-4057-94c0-524e66dd3ea2" + }, + "cell_type": "code", + "source": [ + "sampler = gm.text.Sampler(\n", + " model=model,\n", + " params=params,\n", + ")\n", + "\n", + "prompt = \"\"\"user\n", + "Give me a list of inspirational quotes.\n", + "model\n", + "\"\"\"\n", + "\n", + "out = sampler.sample(prompt, max_new_tokens=1000)\n", + "print(out)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, here's a list of inspirational quotes, categorized a little to give you a variety:\n", + "\n", + "**On Perseverance & Resilience:**\n", + "\n", + "* “The only way to do great work is to love what you do.” – Steve Jobs\n", + "* “Fall seven times, stand up eight.” – Japanese Proverb\n", + "* “The difference between ordinary and extraordinary is that little extra.” – Jimmy Johnson\n", + "* “Success is not final, failure is not fatal: It is the courage to continue that counts.” – Winston Churchill\n", + "* “Don’t watch the clock; do what it does. Keep going.” – Sam Levenson\n", + "* “When the going gets tough, the tough get going.” – Theodore Roosevelt\n", + "\n", + "\n", + "**On Self-Love & Confidence:**\n", + "\n", + "* “You are enough.” – Brené Brown\n", + "* “Believe you can and you’re halfway there.” – Theodore Roosevelt\n", + "* “You must be the change you wish to see in the world.” – Mahatma Gandhi\n", + "* “The best is yet to come.” – Frank Sinatra\n", + "* “Be the energy you want to attract.” – Tony Gaskins\n", + "* “Don’t be defined by your past. Define your future.” – Unknown\n", + "\n", + "\n", + "**On Dreams & Goals:**\n", + "\n", + "* “If you can dream it, you can do it.” – Walt Disney\n", + "* “The future belongs to those who believe in the beauty of their dreams.” – Eleanor Roosevelt\n", + "* “Shoot for the moon. Even if you miss, you’ll land among the stars.” – Les Brown\n", + "* “Start where you are. Use what you have. Do what you can.” – Arthur Ashe\n", + "* “Life begins at the end of your comfort zone.” – Unknown\n", + "\n", + "\n", + "**On Happiness & Perspective:**\n", + "\n", + "* “Happiness is not something readymade. It comes from your own actions.” – Dalai Lama\n", + "* “It’s not the triumph that matters, it’s the effort.” – Winston Churchill\n", + "* “Don’t wait for the perfect moment, take the moment and make it perfect.” – Oscar Wilde\n", + "* “Be present. Be grateful. Be you.” – Unknown\n", + "* “The only way out is through.” – Robert Frost\n", + "\n", + "\n", + "\n", + "**Short & Powerful:**\n", + "\n", + "* “Be the change.” – Mahatma Gandhi\n", + "* “Just breathe.”\n", + "* “Keep going.”\n", + "* “You got this.”\n", + "* “Dream big.”\n", + "\n", + "---\n", + "\n", + "**Resources for More Quotes:**\n", + "\n", + "* **BrainyQuote:** [https://www.brainyquote.com/](https://www.brainyquote.com/)\n", + "* **Goodreads:** [https://www.goodreads.com/quotes](https://www.goodreads.com/quotes)\n", + "* **Quote Garden:** [https://quotegarden.com/](https://quotegarden.com/)\n", + "\n", + "To help me give you even more relevant quotes, could you tell me:\n", + "\n", + "* **What kind of inspiration are you looking for?** (e.g., motivation for work, overcoming challenges, self-love, etc.)\n", + "* **Is there a particular theme or topic you'd like quotes about?**\n" + ] + } + ], + "execution_count": null + }, + { + "metadata": { + "id": "TPf01271RuTs" + }, + "cell_type": "markdown", + "source": [ + "## Use the model directly\n", + "\n", + "Here's an example of predicting a single token, directly calling the model.\n", + "\n", + "The model input expectes encoded tokens. For this, we first need to encode the prompt with our tokenizer. See our [tokenizer](https://gemma-llm.readthedocs.io/en/latest/tokenizer.html) documentation for more information on using the tokenizer." + ] + }, + { + "metadata": { + "id": "mvCAQCDXZ0D3" + }, + "cell_type": "code", + "source": [ + "tokenizer = gm.text.Gemma3Tokenizer()" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "id": "kH534DHohG67" + }, + "cell_type": "markdown", + "source": [ + "Note: When encoding the prompt, don't forget to add the beginning-of-string token with `add_bos=True`. All prompts feed to the model should start by this token." + ] + }, + { + "metadata": { + "id": "T1GC0OPRhHGc" + }, + "cell_type": "code", + "source": [ + "prompt = tokenizer.encode('One word to describe Paris: \\n\\n', add_bos=True)\n", + "prompt = jnp.asarray(prompt)" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "id": "hHqyFnskZ5SC" + }, + "cell_type": "markdown", + "source": [ + "We then can call the model, and get the predicted logits." + ] + }, + { + "metadata": { + "colab": { + "height": 35 + }, + "executionInfo": { + "elapsed": 7194, + "status": "ok", + "timestamp": 1741277771722, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "G3Kbo9hgRuTt", + "outputId": "3b0e468e-c55c-466a-ece9-ade04926612d" + }, + "cell_type": "code", + "source": [ + "# Run the model\n", + "out = model.apply(\n", + " {'params': params},\n", + " tokens=prompt,\n", + " return_last_only=True, # Only predict the last token\n", + ")\n", + "\n", + "\n", + "# Sample a token from the predicted logits\n", + "next_token = jax.random.categorical(\n", + " jax.random.key(1),\n", + " out.logits\n", + ")\n", + "tokenizer.decode(next_token)" + ], + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'Romantic'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": null + }, + { + "metadata": { + "id": "TNb88k3EF5gu" + }, + "cell_type": "markdown", + "source": [ + "You can also display the next token probability." + ] + }, + { + "metadata": { + "colab": { + "height": 542 + }, + "executionInfo": { + "elapsed": 104, + "status": "ok", + "timestamp": 1741277773577, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "mIkOdE9dF45s", + "outputId": "ab610392-44f5-44cc-9370-bd881bc9136b" + }, + "cell_type": "code", + "source": [ + "tokenizer.plot_logits(out.logits)" + ], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + "\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": null + }, + { + "metadata": { + "id": "3yeUUP8Rh5mU" + }, + "cell_type": "markdown", + "source": [ + "## Next steps\n", + "\n", + "* See our [multimodal](https://gemma-llm.readthedocs.io/en/latest/multimodal.html) example to query the model with images.\n", + "* See our [finetuning](https://gemma-llm.readthedocs.io/en/latest/finetuning.html) example to train Gemma on your custom task.\n", + "* See our [tool use](https://gemma-llm.readthedocs.io/en/latest/tool_use.html) tutorial to extend Gemma with external tools.\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "last_runtime": {}, + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/google-official/deepmind-gemma/colab_tool_use.ipynb b/tooling/google-official/deepmind-gemma/colab_tool_use.ipynb new file mode 100644 index 0000000..933dfe0 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/colab_tool_use.ipynb @@ -0,0 +1,568 @@ +{ + "cells": [ + { + "metadata": { + "id": "-KkvqLgjiIdD" + }, + "cell_type": "markdown", + "source": [ + "# Tool Use\n", + "\n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google-deepmind/gemma/blob/main/colabs/tool_use.ipynb)\n", + "\n", + "Demo to show how to use tool-use with Gemma library.\n", + "\n", + "Note: The Gemma 1, 2 and 3 models were not specifically trained for tool use. This is more a proof-of-concept than an officially supported feature." + ] + }, + { + "metadata": { + "id": "gcNRfVEnj4aq" + }, + "cell_type": "code", + "source": [ + "!pip install -q gemma" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "executionInfo": { + "elapsed": 2221, + "status": "ok", + "timestamp": 1749202985345, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "k1ZAgLg1j9NT" + }, + "cell_type": "code", + "source": [ + "# Common imports\n", + "import os\n", + "import datetime\n", + "\n", + "# Gemma imports\n", + "from gemma import gm" + ], + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "id": "139lZszJj_CC" + }, + "cell_type": "markdown", + "source": [ + "By default, Jax does not utilize the full GPU memory, but this can be overwritten. See [GPU memory allocation](https://docs.jax.dev/en/latest/gpu_memory_allocation.html):" + ] + }, + { + "metadata": { + "executionInfo": { + "elapsed": 2, + "status": "ok", + "timestamp": 1749138071985, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "VtlWWLIYj_LJ" + }, + "cell_type": "code", + "source": [ + "os.environ[\"XLA_PYTHON_CLIENT_MEM_FRACTION\"]=\"1.00\"" + ], + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "id": "31JPZb5RkD_p" + }, + "cell_type": "markdown", + "source": [ + "Load the model and the params." + ] + }, + { + "metadata": { + "executionInfo": { + "elapsed": 39057, + "status": "ok", + "timestamp": 1749203024713, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "RsAo6k4_kEJS", + "outputId": "e10afb5c-6c81-42e8-e590-a39ea4ef3bf7" + }, + "cell_type": "code", + "source": [ + "model = gm.nn.Gemma3_4B()\n", + "\n", + "params = gm.ckpts.load_params(gm.ckpts.CheckpointPath.GEMMA3_4B_IT)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:2025-06-06 02:43:16,896:jax._src.xla_bridge:749: Unable to initialize backend 'pathways': Could not initialize backend 'pathways'\n", + "INFO:2025-06-06 02:43:16,897:jax._src.xla_bridge:749: Unable to initialize backend 'proxy': INVALID_ARGUMENT: IFRT proxy server address must be '://' (e.g., 'grpc://localhost'), but got \n", + "INFO:2025-06-06 02:43:16,900:jax._src.xla_bridge:749: Unable to initialize backend 'mlcr': Could not initialize backend 'mlcr'\n", + "INFO:2025-06-06 02:43:16,901:jax._src.xla_bridge:749: Unable to initialize backend 'sliceme': Could not initialize backend 'sliceme'\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "id": "p108c5yIlYH7" + }, + "cell_type": "markdown", + "source": [ + "## Using existing tools\n", + "\n", + "If you're familiar with the [sampling](https://gemma-llm.readthedocs.io/en/latest/sampling.html) tutorial, using tool-use differ in two ways:\n", + "\n", + "1. Using the `gm.text.ToolSampler` rather than the `gm.text.ChatSampler`.\n", + "2. Passing the `tools=` you want to use to the sampler.\n", + "\n", + "For example:" + ] + }, + { + "metadata": { + "colab": { + "height": 594 + }, + "executionInfo": { + "elapsed": 50615, + "status": "ok", + "timestamp": 1749138791069, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "iRCV5h8BlVX6", + "outputId": "b3b5d83d-8a8b-4982-fc8f-d409fb8b38a9" + }, + "cell_type": "code", + "source": [ + "sampler = gm.text.ToolSampler(\n", + " model=model,\n", + " params=params,\n", + " tools=[\n", + " gm.tools.Calculator(),\n", + " gm.tools.FileExplorer(),\n", + " ],\n", + " print_stream=True,\n", + ")\n", + "\n", + "output = sampler.chat('I have a serie `Sn+1 = cos(Sn) * 2`. Using the calculator, compute the steps 0-4 for S0 = 3')" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: I need to compute S0, S1, S2, S3, and S4 using the given recursive formula Sn+1 = cos(Sn) * 2 and S0 = 3.\n", + "Let's start with S0 = 3.\n", + "S1 = cos(S0) * 2 = cos(3) * 2\n", + "S2 = cos(S1) * 2 = cos(cos(3) * 2) * 2\n", + "S3 = cos(S2) * 2 = cos(cos(cos(3) * 2) * 2) * 2\n", + "S4 = cos(S3) * 2 = cos(cos(cos(cos(3) * 2) * 2)) * 2\n", + "\n", + "I will use the calculator to compute these values.\n", + "{\"tool_name\": \"calculator\", \"expression\": \"cos(3) * 2\"}\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: -1.9799849932008908]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: Now I need to compute S1 = cos(S0) * 2 = cos(3) * 2 = -1.9799849932008908 * 2\n", + "{\"tool_name\": \"calculator\", \"expression\": \"-1.9799849932008908 * 2\"}\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: -3.9599699864017817]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: Now I need to compute S2 = cos(S1) * 2 = cos(-3.9599699864017817) * 2\n", + "{\"tool_name\": \"calculator\", \"expression\": \"cos(-3.9599699864017817) * 2\"}\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: -1.3668134299076982]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: Now I need to compute S3 = cos(S2) * 2 = cos(-1.3668134299076982) * 2\n", + "{\"tool_name\": \"calculator\", \"expression\": \"cos(-1.3668134299076982) * 2\"}\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: 0.4051424976130353]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: Now I need to compute S4 = cos(S3) * 2 = cos(0.4051424976130353) * 2\n", + "{\"tool_name\": \"calculator\", \"expression\": \"cos(0.4051424976130353) * 2\"}\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: 1.8380924822033438]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The values are: S0 = 3, S1 = -3.9599699864017817, S2 = -1.3668134299076982, S3 = 0.4051424976130353, S4 = 1.8380924822033438" + ] + } + ], + "execution_count": 10 + }, + { + "metadata": { + "id": "FAI54F-Blkan" + }, + "cell_type": "markdown", + "source": [ + "Note: Only the final model answer is returned. You can access the conversation history, including all intermediates tool calls and output through `sampler.turns` property." + ] + }, + { + "metadata": { + "id": "D0_IIS1Nlfuw" + }, + "cell_type": "markdown", + "source": [ + "## Creating your own tool\n", + "\n", + "To create your own tool, you can inherit from the `gm.tools.Tool` class. You should provide:\n", + "\n", + "* A description & example, so the model knows how to use your tool\n", + "* Implement the `call` method. The `call` function can take arbitrary `**kwargs`, but the name of the args should match the ones defined in `tool_kwargs` and `tool_kwargs_doc`" + ] + }, + { + "metadata": { + "executionInfo": { + "elapsed": 55, + "status": "ok", + "timestamp": 1749203934196, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "XqmQcfdI0oEl" + }, + "cell_type": "code", + "source": [ + "class DateTime(gm.tools.Tool):\n", + " \"\"\"Tool to access the current date.\"\"\"\n", + "\n", + " DESCRIPTION = 'Access the current date, time,...'\n", + " EXAMPLE = gm.tools.Example(\n", + " query='Which day of the week are we today ?',\n", + " thought='The `datetime.strptime` uses %a for day of the week',\n", + " tool_kwargs={'format': '%a'},\n", + " tool_kwargs_doc={'format': ''},\n", + " result='Sat',\n", + " answer='Today is Saturday.',\n", + " )\n", + "\n", + " def call(self, format: str) -> str:\n", + " dt = datetime.datetime.now()\n", + " return dt.strftime(format)\n" + ], + "outputs": [], + "execution_count": 7 + }, + { + "metadata": { + "id": "sSxYhXPuuXYp" + }, + "cell_type": "markdown", + "source": [ + "The tool can then be used in the sampler:" + ] + }, + { + "metadata": { + "colab": { + "height": 118 + }, + "executionInfo": { + "elapsed": 2156, + "status": "ok", + "timestamp": 1749204833094, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": -120 + }, + "id": "9S8xB2B-0cbW", + "outputId": "fccc0e89-e922-4184-8b77-800041cdd77e" + }, + "cell_type": "code", + "source": [ + "sampler = gm.text.ToolSampler(\n", + " model=model,\n", + " params=params,\n", + " tools=[\n", + " DateTime(),\n", + " ],\n", + " print_stream=True,\n", + ")\n", + "\n", + "output = sampler.chat('Which date are we today ?')" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thought: I need to get the current date.\n", + "{\"tool_name\": \"datetime\", \"format\": \"%Y-%m-%d\"}\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Tool result: 2025-06-06]\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Today is June 6th, 2025." + ] + } + ], + "execution_count": 9 + }, + { + "metadata": { + "id": "esIpCjhxzHmf" + }, + "cell_type": "markdown", + "source": [ + "## Next steps\n", + "\n", + "* See our [multimodal](https://gemma-llm.readthedocs.io/en/latest/multimodal.html) example to query the model with images.\n", + "* See our [finetuning](https://gemma-llm.readthedocs.io/en/latest/finetuning.html) example to train Gemma on your custom task.\n" + ] + } + ], + "metadata": { + "colab": { + "last_runtime": {}, + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tooling/google-official/deepmind-gemma/example_classification.py b/tooling/google-official/deepmind-gemma/example_classification.py new file mode 100644 index 0000000..4ffdbc7 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/example_classification.py @@ -0,0 +1,130 @@ +# Copyright 2026 DeepMind Technologies Limited. +# +# 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. + +r"""Example config for finetuning Gemma for a classification task. + +* Input: A text to classify. +* Output: A classification label. The pre-trained Gemma model is trained to + predict one world among 256.000. Here, we're finetuning to predict only 2 + tokens among the 256.000 available. + +Train locally with: + +```sh +python -m kauldron.main \ + --cfg=examples/classification.py \ + --cfg.workdir=/tmp/kauldron_oss/workdir +``` + +""" + +from kauldron import konfig + +# pylint: disable=g-import-not-at-top +with konfig.imports(): + from gemma import gm + from kauldron import kd + import optax +# pylint: enable=g-import-not-at-top + + +def get_config(): + """Get the default hyperparameter configuration.""" + return kd.train.Trainer( + seed=42, + # Dataset + train_ds=_make_dataset(training=True), + # Model definition + model=gm.nn.Gemma3_4B( + tokens="batch.sentence", + return_last_only=True, + ), + # Load the weights from the pretrained checkpoint + init_transform=gm.ckpts.LoadCheckpoint( + path=gm.ckpts.CheckpointPath.GEMMA3_4B_IT, + ), + # Training + num_train_steps=10_000, + train_losses={ + "xentropy": kd.losses.SoftmaxCrossEntropyWithIntLabels( + logits="preds.logits", + labels="batch.label", + ), + }, + optimizer=optax.adafactor(learning_rate=1e-4), + checkpointer=kd.ckpts.Checkpointer( + save_interval_steps=500, + ), + # Evaluation + evals={ + "test": kd.evals.Evaluator( + run=kd.evals.EveryNSteps(1000), + ds=_make_dataset(training=False), + ), + }, + ) + + +def _make_dataset(training: bool) -> kd.data.Pipeline: + # Dict key names from the dataset + _INPUT_FIELD = "sentence" # pylint: disable=invalid-name + _LABEL_FIELD = "label" # pylint: disable=invalid-name + + tokenizer = gm.text.Gemma3Tokenizer() + + return kd.data.py.Tfds( + name="glue/cola", + split="train" if training else "validation", + shuffle=True if training else False, + num_epochs=None if training else 1, + batch_size=8, + transforms=[ + # Process the input text + # TFDS datasets returns `bytes`, so convert them to `str` + gm.data.DecodeBytes(key=_INPUT_FIELD), + gm.data.FormatText( + key=_INPUT_FIELD, + template="""user + Please classify whether the following sentence is grammaticaly correct, please answer only with Yes or No. + Sentence: {text} + model""", + ), + gm.data.Tokenize( + key=_INPUT_FIELD, + tokenizer=tokenizer, + add_bos=True, + ), + gm.data.Pad( + key=_INPUT_FIELD, + max_length=128, + ), + # Process the label + gm.data.MapInts( + key=_LABEL_FIELD, + # Rather than predicting the token 0 and 1, we are using the + # token 1294 and 3553 which respectivelly correspond to "No" and + # "Yes". We do this because those token already contain semantic + # information, so even zero-shot prediction without any + # finetuning has better than random performances. + old_to_new={ + 0: 1294, # Token -> "No" + 1: 3553, # Token -> "Yes" + }, + ), + kd.data.Rearrange( + key=_LABEL_FIELD, + pattern="... -> ... 1", # For shape compatibility with the loss. + ), + ], + ) diff --git a/tooling/google-official/deepmind-gemma/example_dpo.py b/tooling/google-official/deepmind-gemma/example_dpo.py new file mode 100644 index 0000000..2d2565a --- /dev/null +++ b/tooling/google-official/deepmind-gemma/example_dpo.py @@ -0,0 +1,122 @@ +# Copyright 2026 DeepMind Technologies Limited. +# +# 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. + +r"""DPO Example. + +DPO works by running two answers (one prefered and one rejected) into both +the reference model and the model to finetune. Then the DPO loss is used to +increase the likelihood of generating the preferred answer. + +Implementation wise, this is done by: + +* Wrapping the model inside a `gm.nn.AnchoredPolicy` (which runs both the + model and the reference frozen model) +* Using the `gm.ckpts.AnchoredPolicyLoader` to restore the weights, so the + weights are correctly mapped to inside `gm.nn.AnchoredPolicy`. + + +Train locally with: + +```sh +python -m kauldron.main \ + --cfg=examples/dpo.py \ + --cfg.workdir=/tmp/kauldron_oss/workdir +``` + +""" + +from kauldron import konfig + +# pylint: disable=g-import-not-at-top +with konfig.imports(): + from gemma import gm + from kauldron import kd + import optax +# pylint: enable=g-import-not-at-top + + +def get_config(): + """Get the default hyperparameter configuration.""" + return kd.train.Trainer( + seed=42, + # Dataset + train_ds=_make_dataset(training=True), + # Model definition + model=gm.nn.AnchoredPolicy( + policy=gm.nn.Gemma3_4B(tokens="batch.tokens", text_only=True), + ), + # Load the weights from the pretrained checkpoint + init_transform=gm.ckpts.AnchoredPolicyLoader( + policy=gm.ckpts.LoadCheckpoint( + path=gm.ckpts.CheckpointPath.GEMMA3_4B_IT, + ), + ), + # Training + num_train_steps=10_000, + train_losses={ + "dpo": gm.losses.DpoLoss( + tokens="batch.targets", + sequence_mask="batch.mask", + policy_logits="preds.policy.logits", + anchor_logits="preds.anchor.logits", + ), + }, + optimizer=optax.adafactor(learning_rate=1e-4), + checkpointer=kd.ckpts.Checkpointer( + save_interval_steps=500, + ), + # Evaluation + evals={ + # "test": kd.evals.Evaluator( + # run=kd.evals.EveryNSteps(1000), + # ds=_make_dataset(training=False), + # ), + }, + ) + + +def _make_dataset(training: bool) -> kd.data.Pipeline: + # TODO(epot): !!!! + max_length = 512 + batch_size = 16 + + tokenizer = gm.text.Gemma3Tokenizer() + + return kd.data.py.HuggingFace( + path="argilla/distilabel-math-preference-dpo", + split="train", + shuffle=True if training else False, + num_epochs=None if training else 1, + batch_size=batch_size, + transforms=[ + # Only keep the fields we need. + kd.data.Elements( + keep=["instruction", "chosen_response", "rejected_response"] + ), + # Create the model inputs and loss mask. + gm.data.ContrastiveTask( + in_prompt="instruction", + in_chosen="chosen_response", + in_rejected="rejected_response", + out_tokens="tokens", + out_targets="targets", + out_mask="mask", + tokenizer=tokenizer, + # Padding parameters + max_length=max_length, + # TODO(epot): Run stats (how many examples are we dropping?) + truncate=True, + ), + ], + ) diff --git a/tooling/google-official/deepmind-gemma/example_lora.py b/tooling/google-official/deepmind-gemma/example_lora.py new file mode 100644 index 0000000..736b0e1 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/example_lora.py @@ -0,0 +1,154 @@ +# Copyright 2026 DeepMind Technologies Limited. +# +# 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. + +r"""Example of Gemma finetuning using LoRA. + +This example is based on the `seq2seq.py` example. See the +docstring of that file for more details. + +The changes to use LoRA are: + +* `model`: Use `gm.nn.LoRA()` wrapper to add `LoRA` adapters to the + model. +* `init_transform`: Use `gm.ckpts.SkipLoRA()` wrapper to only restore the + non-LoRA weights. +* `optimizer`: Use `kd.optim.partial_updates` wrapper to only train the LoRA + weights. + +Train locally with: + +```sh +python -m kauldron.main \ + --cfg=examples/lora.py \ + --cfg.workdir=/tmp/kauldron_oss/workdir +``` + +""" + +from kauldron import konfig + +# pylint: disable=g-import-not-at-top +with konfig.imports(): + from gemma import gm + from kauldron import kd + import optax +# pylint: enable=g-import-not-at-top + + +def get_config(): + batch_size = 16 + max_length = 512 + + return kd.train.Trainer( + seed=42, + # Dataset + train_ds=_make_dataset( + training=True, + batch_size=batch_size, + max_length=max_length, + ), + # Model definition + model=gm.nn.LoRA( + rank=4, + model=gm.nn.Gemma3_4B( + tokens="batch.input", + # TODO(epot): At the moment, LoRA fine-tuning with multimodal + # is not supported. Willbe fixed soon. + text_only=True, + ), + ), + # Load the weights from the pretrained checkpoint + # Use `SkipLoRA` as the original checkpoint does not contain the LoRA + # weights. + init_transform=gm.ckpts.SkipLoRA( + wrapped=gm.ckpts.LoadCheckpoint( + path=gm.ckpts.CheckpointPath.GEMMA3_4B_IT, + ) + ), + # Training + num_train_steps=10_000, + train_losses={ + "xentropy": kd.losses.SoftmaxCrossEntropyWithIntLabels( + logits="preds.logits", + labels="batch.target", + mask="batch.loss_mask", + ), + }, + # TODO(epot): Add Gradient accumenlation. + optimizer=kd.optim.partial_updates( + optax.adafactor(learning_rate=0.005), + # We only optimize the LoRA weights. The rest of the model is frozen. + mask=kd.optim.select("lora"), + ), + checkpointer=kd.ckpts.Checkpointer( + save_interval_steps=500, + ), + # Evaluation + evals={ + "test": kd.evals.Evaluator( + run=kd.evals.EveryNSteps(1000), + ds=_make_dataset( + training=False, + batch_size=batch_size, + max_length=max_length, + ), + ), + # The sampler evaluator run inference on a few prompts from the + # test set. + "sampling": gm.evals.SamplerEvaluator( + run=kd.evals.EveryNSteps(1000), + max_new_tokens=150, # Sampling parameters + num_batches=1, # Only predict a single example (batch_size=None) + ds=_make_dataset(training=False, sampling=True), + ), + }, + ) + + +def _make_dataset( + *, + training: bool, + sampling: bool = False, + batch_size: int | None = None, + max_length: int | None = None, +): + tokenizer = gm.text.Gemma3Tokenizer() + + return kd.data.py.Tfds( + name="mtnt/en-fr", + split="train" if training else "test", + shuffle=True if training else False, + num_epochs=None if training else 1, + batch_size=None if sampling else batch_size, + num_workers=4, + transforms=[ + # Create the model inputs/targets/loss_mask. + gm.data.Seq2SeqTask( + # Select which field from the dataset to use. + # https://www.tensorflow.org/datasets/catalog/mtnt + in_prompt="src", + in_response="dst", + # Output batch is {"input": ..., "target": ..., "loss_mask": ...} + out_input="input", + out_target="target", + out_target_mask="loss_mask", + tokenizer=tokenizer, + # Padding parameters + max_length=None if sampling else max_length, + # In this dataset, ~1% of examples are longer than 512 tokens. + truncate=True, + sampling=sampling, + ), + ], + ) diff --git a/tooling/google-official/deepmind-gemma/example_multimodal.py b/tooling/google-official/deepmind-gemma/example_multimodal.py new file mode 100644 index 0000000..d4341f2 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/example_multimodal.py @@ -0,0 +1,164 @@ +# Copyright 2026 DeepMind Technologies Limited. +# +# 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. + +r"""Example of Gemma finetuning for an image captioning task. + +Example: + +Prompt: + +``` +user + +model +``` + +Target: + +``` +A diagram showing a circuit with a battery, lamp, and switch. +``` + +Here, the prompt only contains the `` to indicate an image +is inserted. + +Train locally with: + +```sh +python -m kauldron.main \ + --cfg=examples/multimodal.py \ + --cfg.workdir=/tmp/kauldron_oss/workdir +``` + +""" + +from kauldron import konfig + +# pylint: disable=g-import-not-at-top +with konfig.imports(): + import jax.numpy as jnp + from gemma import gm + from kauldron import kd + import optax +# pylint: enable=g-import-not-at-top + + +def get_config(): + batch_size = 32 + max_length = 200 + + return kd.train.Trainer( + seed=42, + # Dataset + train_ds=_make_dataset( + training=True, + batch_size=batch_size, + max_length=max_length, + ), + # Model definition + model=gm.nn.Gemma3_4B( + tokens="batch.input", + images="batch.image", + ), + # Load the weights from the pretrained checkpoint + init_transform=gm.ckpts.LoadCheckpoint( + path=gm.ckpts.CheckpointPath.GEMMA3_4B_IT, + ), + # Training + num_train_steps=10_000, + train_losses={ + "xentropy": kd.losses.SoftmaxCrossEntropyWithIntLabels( + logits="preds.logits", + labels="batch.target", + mask="batch.loss_mask", + ), + }, + train_summaries={ + "image": kd.summaries.ShowImages(images="batch.image", num_images=5), + }, + optimizer=optax.adafactor(learning_rate=1e-3), + checkpointer=kd.ckpts.Checkpointer( + save_interval_steps=500, + ), + # Evaluation + evals={ + "test": kd.evals.Evaluator( + run=kd.evals.EveryNSteps(1000), + ds=_make_dataset( + training=False, + batch_size=4, + max_length=max_length, + ), + ), + # The sampler evaluator run inference on a few prompts from the + # test set. + "sampling": gm.evals.SamplerEvaluator( + run=kd.evals.EveryNSteps(1000), + max_new_tokens=50, # Sampling parameters + num_batches=3, + ds=_make_dataset(training=False, sampling=True), + summaries={ + "image": kd.summaries.ShowImages( + images="batch.image", num_images=5 + ), + }, + ), + }, + ) + + +def _make_dataset( + *, + training: bool, + sampling: bool = False, + batch_size: int | None = None, + max_length: int | None = None, +): + tokenizer = gm.text.Gemma3Tokenizer() + + return kd.data.py.Tfds( + name="ai2dcaption", + split="llava_15" if training else "test", + shuffle=True if training else False, + num_epochs=None if training else 1, + batch_size=None if sampling else batch_size, + num_workers=4, + transforms=[ + # Only keep the fields we need.See fields at: + # https://www.tensorflow.org/datasets/catalog/ai2dcaption + kd.data.Elements(keep=["image", "caption"]), + # Create a new constant field + kd.data.AddConstants({"prompt": ""}), + # Create the model inputs/targets/loss_mask. + gm.data.Seq2SeqTask( + # Select which field from the dataset to use. + in_prompt="prompt", + in_response="caption", + # Output batch is {"input": ..., "target": ..., "loss_mask": ...} + out_input="input", + out_target="target", + out_target_mask="loss_mask", + tokenizer=tokenizer, + # Padding parameters + max_length=None if sampling else max_length, + # In this dataset, ~1% of examples are longer than 512 tokens. + truncate=True, + sampling=sampling, + ), + kd.data.py.Resize(key="image", size=(800, 800)), + # TODO(epot): Make the `num_images` dimension optional + kd.data.Rearrange(key="image", pattern="... h w c -> ... 1 h w c"), + kd.data.Cast(key="image", dtype=jnp.uint8), + ], + ) diff --git a/tooling/google-official/deepmind-gemma/example_sharding.py b/tooling/google-official/deepmind-gemma/example_sharding.py new file mode 100644 index 0000000..33f3d77 --- /dev/null +++ b/tooling/google-official/deepmind-gemma/example_sharding.py @@ -0,0 +1,133 @@ +# Copyright 2026 DeepMind Technologies Limited. +# +# 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. + +r"""Example of Gemma finetuning for a prompt -> response task. + +This is a fork of the seq2seq example, but with sharding. +The only difference is the `sharding=kd.sharding.ShardingStrategy()` + +Train locally with: + +```sh +python -m kauldron.main \ + --cfg=examples/sharding.py \ + --cfg.workdir=/tmp/kauldron_oss/workdir +``` + +""" + +from kauldron import konfig + +# pylint: disable=g-import-not-at-top +with konfig.imports(): + from gemma import gm + from kauldron import kd + import optax +# pylint: enable=g-import-not-at-top + + +def get_config(): + batch_size = 16 + max_length = 512 + + return kd.train.Trainer( + seed=42, + # Dataset + train_ds=_make_dataset( + training=True, + batch_size=batch_size, + max_length=max_length, + ), + # Model definition + model=gm.nn.Gemma3_4B( + tokens="batch.input", + ), + sharding=kd.sharding.ShardingStrategy( + params=kd.sharding.FSDPSharding(), + ), + # Load the weights from the pretrained checkpoint + init_transform=gm.ckpts.LoadCheckpoint( + path=gm.ckpts.CheckpointPath.GEMMA3_4B_IT, + ), + # Training + num_train_steps=10_000, + train_losses={ + "xentropy": kd.losses.SoftmaxCrossEntropyWithIntLabels( + logits="preds.logits", + labels="batch.target", + mask="batch.loss_mask", + ), + }, + optimizer=optax.adafactor(learning_rate=1e-3), + checkpointer=kd.ckpts.Checkpointer( + save_interval_steps=500, + ), + # Evaluation + evals={ + "test": kd.evals.Evaluator( + run=kd.evals.EveryNSteps(1000), + ds=_make_dataset( + training=False, + batch_size=batch_size, + max_length=max_length, + ), + ), + # The sampler evaluator run inference on a few prompts from the + # test set. + "sampling": gm.evals.SamplerEvaluator( + run=kd.evals.EveryNSteps(1000), + max_new_tokens=50, # Sampling parameters + num_batches=1, # Only predict a single example (batch_size=None) + ds=_make_dataset(training=False, sampling=True), + ), + }, + ) + + +def _make_dataset( + *, + training: bool, + sampling: bool = False, + batch_size: int | None = None, + max_length: int | None = None, +): + tokenizer = gm.text.Gemma3Tokenizer() + + return kd.data.py.Tfds( + name="mtnt/en-fr", + split="train" if training else "test", + shuffle=True if training else False, + num_epochs=None if training else 1, + batch_size=None if sampling else batch_size, + num_workers=4, + transforms=[ + # Create the model inputs/targets/loss_mask. + gm.data.Seq2SeqTask( + # Select which field from the dataset to use. + # https://www.tensorflow.org/datasets/catalog/mtnt + in_prompt="src", + in_response="dst", + # Output batch is {"input": ..., "target": ..., "loss_mask": ...} + out_input="input", + out_target="target", + out_target_mask="loss_mask", + tokenizer=tokenizer, + # Padding parameters + max_length=None if sampling else max_length, + # In this dataset, ~1% of examples are longer than 512 tokens. + truncate=True, + sampling=sampling, + ), + ], + ) diff --git a/tooling/google-official/docs/ai-google-dev_core.html b/tooling/google-official/docs/ai-google-dev_core.html new file mode 100644 index 0000000..55991c1 --- /dev/null +++ b/tooling/google-official/docs/ai-google-dev_core.html @@ -0,0 +1,4739 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gemma 4 model overview  |  Google AI for Developers + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+ + +
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + +

+ Gemma 4 model overview + + +

+
+ + + + + + +
+ + + + +

+ +

+ + + +
+ + +
+ +

Gemma is a family of generative artificial intelligence models and you can +use them in a wide variety of generation tasks, including question answering, +summarization, and reasoning. Gemma models are provided with open weights and +permit responsible +commercial use, +allowing you to tune and deploy them in your own projects and applications.

+ +

Gemma 4 model family spans three distinct architectures tailored for specific +hardware requirements:

+ +
    +
  • Small Sizes: 2B and 4B effective parameter models built for +ultra-mobile, edge, and browser deployment (e.g., Pixel, Chrome).
  • +
  • Dense: A powerful 31B parameter dense model that bridges the gap between +server-grade performance and local execution.
  • +
  • Mixture-of-Experts: A highly efficient 26B MoE model designed for +high-throughput, advanced reasoning.
  • +
+ +

You can download Gemma 4 models from +Kaggle and +Hugging Face. +For more technical details on Gemma 4, see the +Model Card. +Earlier versions of Gemma core models are also available for download. For more +information, see Previous Gemma models.

+ +

Get it on Kaggle +Get it on Hugging Face

+ +

Capabilities

+ +
    +
  • Reasoning: All models in the family are designed as highly capable +reasoners, with configurable thinking +modes.
  • +
  • Extended Multimodalities: Processes Text, +Image with variable aspect ratio +and resolution support (all models), +Video, and +Audio (featured natively on the E2B and +E4B models).
  • +
  • Increased Context Window: Small models feature a 128K context window, +while the medium models support 256K.
  • +
  • Enhanced Coding & Agentic Capabilities: Achieves notable improvements in +coding benchmarks alongside built-in function-calling +support, powering +highly capable autonomous agents.
  • +
  • Native System Prompt Support: Gemma 4 introduces built-in support for +the system role, enabling more structured and controllable conversations.
  • +
+ +

Parameter sizes and quantization

+ +

Gemma 4 models are available in 4 parameter sizes: E2B, E4B, 31B and 26B A4B. +The models can be used with their default precision (16-bit) or with a lower +precision using quantization. The different sizes and precisions represent a set +of trade-offs for your AI application. Models with higher parameters and bit +counts (higher precision) are generally more capable, but are more expensive to +run in terms of processing cycles, memory cost and power consumption. Models +with lower parameters and bit counts (lower precision) have less capabilities, +but may be sufficient for your AI task.

+ +

Gemma 4 Inference Memory Requirements

+ +

The following table details the approximate GPU or TPU memory requirements for +running inference with each size of the Gemma 4 model versions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersBF16 (16-bit)SFP8 (8-bit)Q4_0 (4-bit)
Gemma 4 E2B9.6 GB4.6 GB3.2 GB
Gemma 4 E4B15 GB7.5 GB5 GB
Gemma 4 31B58.3 GB30.4 GB17.4 GB
Gemma 4 26B A4B48 GB25 GB15.6 GB
+ +

Table 1. Approximate GPU or TPU memory required to load Gemma 4 models based +on parameter count and quantization level.

+ +

Key Considerations for Memory Planning

+ +
    +
  • Efficient Architecture (E2B and E4B): The "E" stands for "effective" +parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to +maximize parameter efficiency in on-device deployments. Rather than adding +more layers to the model, PLE gives each decoder layer its own small +embedding for every token. These embedding tables are large but only used +for quick lookups, which is why the total memory required to load static +weights is higher than the effective parameter count suggests.
  • +
  • The MoE Architecture (26B A4B): The 26B is a Mixture of Experts +model. While it only activates 4 billion parameters per token during +generation, all 26 billion parameters must be loaded into memory to +maintain fast routing and inference speeds. This is why its baseline memory +requirement is much closer to a dense 26B model than a 4B model.
  • +
  • Base Weights Only: The estimates in the preceding table only account +for the memory required to load the static model weights. They don't include +the additional VRAM needed for supporting software or the context window.
  • +
  • Context Window (KV Cache): Memory consumption will increase dynamically +based on the total number of tokens in your prompt and the generated +response. Larger context windows require significantly more VRAM on top of +the base model weights.
  • +
  • Fine-Tuning Overhead: Memory requirements for fine-tuning Gemma models +are drastically higher than for standard inference. Your exact footprint +will depend heavily on the development framework, batch size, and whether +you are using full-precision tuning versus a Parameter-Efficient Fine-Tuning +(PEFT) method like Low-Rank Adaptation (LoRA).
  • +
+ +

Previous Gemma models

+ +

You can work with previous generations of Gemma models, which are also +available from Kaggle and +Hugging Face. +For more technical details about previous Gemma models, see the following +model card pages:

+ + + +

Ready to start building? +Get started +with Gemma models!

+ + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tooling/google-official/docs/ai-google-dev_formatting.html b/tooling/google-official/docs/ai-google-dev_formatting.html new file mode 100644 index 0000000..a131848 --- /dev/null +++ b/tooling/google-official/docs/ai-google-dev_formatting.html @@ -0,0 +1,4632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gemma formatting and system instructions  |  Google AI for Developers + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+ + +
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + +

+ Gemma formatting and system instructions + + +

+
+ + + + + + +
+ + + + +

+ +

+ + + +

Gemma instruction-tuned (IT) models are trained with a specific formatter that +annotates all instruction tuning examples with extra information, both at +training and inference time. The formatter has two purposes:

+ +
    +
  1. Indicating roles in a conversation, such as the system, user, or +assistant roles.
  2. +
  3. Delineating turns in a conversation, especially in a multi-turn +conversation.
  4. +
+ +

Below, we specify the control tokens used by Gemma and their use cases. Note +that the control tokens are reserved in and specific to our tokenizer.

+ +
    +
  • Token to indicate a user turn: user
  • +
  • Token to indicate a model turn: model
  • +
  • Token to indicate the beginning of dialogue turn: <start_of_turn>
  • +
  • Token to indicate the end of dialogue turn: <end_of_turn>
  • +
+ +

Here's an example dialogue:

+
<start_of_turn>user
+knock knock<end_of_turn>
+<start_of_turn>model
+who is there<end_of_turn>
+<start_of_turn>user
+Gemma<end_of_turn>
+<start_of_turn>model
+Gemma who?<end_of_turn>
+
+

The token "<end_of_turn>\n" is the turn separator, and the prompt prefix is +"<start_of_turn>model\n". This means that if you'd like to prompt the model +with a question like, "What is Cramer's Rule?", you should instead feed the +model as follows:

+
"<start_of_turn>user
+What is Cramer's Rule?<end_of_turn>
+<start_of_turn>model"
+
+

Note that if you want to finetune the pretrained Gemma models with your own +data, you can use any such schema for control tokens, as long as it's consistent +between your training and inference use cases.

+ +

System instructions

+ +

Gemma's instruction-tuned models are designed to work with only two roles: +user and model. Therefore, the system role or a system turn is not +supported.

+ +

Instead of using a separate system role, provide system-level instructions +directly within the initial user prompt. The model instruction following +capabilities allow Gemma to interpret the instructions effectively. For example:

+
<start_of_turn>user
+Only reply like a pirate.
+
+What is the answer to life the universe and everything?<end_of_turn>
+<start_of_turn>model
+Arrr, 'tis 42,<end_of_turn>
+
+ + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tooling/google-official/docs/ai-google-dev_function_calling_gemma4.html b/tooling/google-official/docs/ai-google-dev_function_calling_gemma4.html new file mode 100644 index 0000000..dea6afa --- /dev/null +++ b/tooling/google-official/docs/ai-google-dev_function_calling_gemma4.html @@ -0,0 +1,5193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Function calling with Gemma 4  |  Google AI for Developers + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+ + +
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + +

+ Function calling with Gemma 4 + + +

+
+ + + + + + +
+ + + + +

+

+ + + + + + + + + + + +
+ View on ai.google.dev + + Run in Google Colab + + Run in Kaggle + + Open in Vertex AI + + View source on GitHub +
+ +

When using a generative artificial intelligence (AI) model such as Gemma, you +may want to use the model to operate programming interfaces in order to complete +tasks or answer questions. Instructing a model by defining a programming +interface and then making a request that uses that interface is called function +calling.

+ +
+
+ +

This guide shows the process of using Gemma 4 within the Hugging Face ecosystem.

+ +

This notebook will run on T4 GPU.

+ +

Install Python packages

+ +

Install the Hugging Face libraries required for running the Gemma model and making requests.

+ +
# Install PyTorch & other libraries
+pip install torch accelerate
+
+# Install the transformers library
+pip install transformers
+ +

Load Model

+ +

Use the transformers libraries to create an instance of a processor and model using the AutoProcessor and AutoModelForImageTextToText classes as shown in the following code example:

+
MODEL_ID = "google/gemma-4-E2B-it" # @param ["google/gemma-4-E2B-it","google/gemma-4-E4B-it", "google/gemma-4-31B-it", "google/gemma-4-26B-A4B-it"]
+
+from transformers import AutoProcessor, AutoModelForMultimodalLM
+
+model = AutoModelForMultimodalLM.from_pretrained(MODEL_ID, dtype="auto", device_map="auto")
+processor = AutoProcessor.from_pretrained(MODEL_ID)
+
+
+Loading weights:   0%|          | 0/2011 [00:00<?, ?it/s]
+
+ +

Passing Tools

+ +

You can pass tools to the model using the apply_chat_template() function via the tools argument. There are two methods for defining these tools:

+ +
    +
  • JSON schema: You can manually construct a JSON dictionary defining the function name, description, and parameters (including types and required fields).
  • +
  • Raw Python Functions: You can pass actual Python functions. The system automatically generates the required JSON schema by parsing the function's type hints, arguments, and docstrings. For best results, docstrings should adhere to the Google Python Style Guide.
  • +
+ +

Below is the example with the JSON schema.

+
from transformers import TextStreamer
+
+weather_function_schema = {
+    "type": "function",
+    "function": {
+        "name": "get_current_temperature",
+        "description": "Gets the current temperature for a given location.",
+        "parameters": {
+            "type": "object",
+            "properties": {
+                "location": {
+                    "type": "string",
+                    "description": "The city name, e.g. San Francisco",
+                },
+            },
+            "required": ["location"],
+        },
+    }
+}
+
+message = [
+    {
+        "role": "system", "content": "You are a helpful assistant."
+    },
+    {
+        "role": "user", "content": "What's the temperature in London?"
+    }
+]
+
+text = processor.apply_chat_template(message, tools=[weather_function_schema], tokenize=False, add_generation_prompt=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+streamer = TextStreamer(processor)
+outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=64)
+
+
+<bos><|turn>system
+You are a helpful assistant.<|tool>declaration:get_current_temperature{description:<|"|>Gets the current temperature for a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city name, e.g. San Francisco<|"|>,type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
+<|turn>user
+What's the temperature in London?<turn|>
+<|turn>model
+<|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
+
+ +

And the same example with the raw Python function.

+
from transformers.utils import get_json_schema
+
+def get_current_temperature(location: str):
+    """
+    Gets the current temperature for a given location.
+
+    Args:
+        location: The city name, e.g. San Francisco
+    """
+    return "15°C"
+
+message = [
+    {
+        "role": "user", "content": "What's the temperature in London?"
+    }
+]
+
+text = processor.apply_chat_template(message, tools=[get_json_schema(get_current_temperature)], tokenize=False, add_generation_prompt=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+streamer = TextStreamer(processor)
+outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=256)
+
+
+<bos><|turn>system
+<|tool>declaration:get_current_temperature{description:<|"|>Gets the current temperature for a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city name, e.g. San Francisco<|"|>,type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
+<|turn>user
+What's the temperature in London?<turn|>
+<|turn>model
+<|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
+
+ +

Full function calling sequence

+ +

This section demonstrates a three-stage cycle for connecting the model to external tools: the Model's Turn to generate function call objects, the Developer's Turn to parse and execute code (such as a weather API), and the Final Response where the model uses the tool's output to answer the user.

+ +

Model's Turn

+ +

Here's the user prompt "Hey, what's the weather in Tokyo right now?", and the tool [get_current_weather]. Gemma generates a function call object as follows.

+
# Define a function that our model can use.
+def get_current_weather(location: str, unit: str = "celsius"):
+    """
+    Gets the current weather in a given location.
+
+    Args:
+        location: The city and state, e.g. "San Francisco, CA" or "Tokyo, JP"
+        unit: The unit to return the temperature in. (choices: ["celsius", "fahrenheit"])
+
+    Returns:
+        temperature: The current temperature in the given location
+        weather: The current weather in the given location
+    """
+    return {"temperature": 15, "weather": "sunny"}
+
+prompt = "Hey, what's the weather in Tokyo right now?"
+tools = [get_current_weather]
+
+message = [
+    {
+        "role": "system", "content": "You are a helpful assistant."
+    },
+    {
+        "role": "user", "content": prompt
+    },
+]
+
+text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+out = model.generate(**inputs, max_new_tokens=128)
+generated_tokens = out[0][len(inputs["input_ids"][0]):]
+output = processor.decode(generated_tokens, skip_special_tokens=False)
+
+print(f"Prompt: {prompt}")
+print(f"Tools: {tools}")
+print(f"Output: {output}")
+
+
+Prompt: Hey, what's the weather in Tokyo right now?
+Tools: [<function get_current_weather at 0x7cef824ece00>]
+Output: <|tool_call>call:get_current_weather{location:<|"|>Tokyo, JP<|"|>}<tool_call|><|tool_response>
+
+ +

Developer's Turn

+ +

Your application should parse the model's response to extract the function name and argments, and append tool_calls and tool_responses with the assistant role.

+ +
+
+
import re
+import json
+
+def extract_tool_calls(text):
+    def cast(v):
+        try: return int(v)
+        except:
+            try: return float(v)
+            except: return {'true': True, 'false': False}.get(v.lower(), v.strip("'\""))
+
+    return [{
+        "name": name,
+        "arguments": {
+            k: cast((v1 or v2).strip())
+            for k, v1, v2 in re.findall(r'(\w+):(?:<\|"\|>(.*?)<\|"\|>|([^,}]*))', args)
+        }
+    } for name, args in re.findall(r"<\|tool_call>call:(\w+)\{(.*?)\}<tool_call\|>", text, re.DOTALL)]
+
+calls = extract_tool_calls(output)
+if calls:
+    # Call the function and get the result
+    #####################################
+    # WARNING: This is a demonstration. #
+    #####################################
+    # Using globals() to call functions dynamically can be dangerous in
+    # production. In a real application, you should implement a secure way to
+    # map function names to actual function calls, such as a predefined
+    # dictionary of allowed tools and their implementations.
+    results = [
+        {"name": c['name'], "response": globals()[c['name']](**c['arguments'])}
+        for c in calls
+    ]
+
+    message.append({
+        "role": "assistant",
+        "tool_calls": [
+            {"function": call} for call in calls
+        ],
+        "tool_responses": results
+    })
+    print(json.dumps(message[-1], indent=2))
+
+
+{
+  "role": "assistant",
+  "tool_calls": [
+    {
+      "function": {
+        "name": "get_current_weather",
+        "arguments": {
+          "location": "Tokyo, JP"
+        }
+      }
+    }
+  ],
+  "tool_responses": [
+    {
+      "name": "get_current_weather",
+      "response": {
+        "temperature": 15,
+        "weather": "sunny"
+      }
+    }
+  ]
+}
+
+ +
+
+
"tool_responses": [
+  {
+    "name": function_name,
+    "response": function_response
+  }
+]
+
+

In case of multiple independent requests:

+
"tool_responses": [
+  {
+    "name": function_name_1,
+    "response": function_response_1
+  },
+  {
+    "name": function_name_2,
+    "response": function_response_2
+  }
+]
+
+

Final Response

+ +

Finally, Gemma reads the tool response and reply to the user.

+
text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+out = model.generate(**inputs, max_new_tokens=128)
+generated_tokens = out[0][len(inputs["input_ids"][0]):]
+output = processor.decode(generated_tokens, skip_special_tokens=True)
+print(f"Output: {output}")
+message[-1]["content"] = output
+
+
+Output: The current weather in Tokyo is 15 degrees and sunny.
+
+ +

You can see the full chat history below.

+
# full history
+print(json.dumps(message, indent=2))
+
+print("-"*80)
+output = processor.decode(out[0], skip_special_tokens=False)
+print(f"Output: {output}")
+
+
+[
+  {
+    "role": "system",
+    "content": "You are a helpful assistant."
+  },
+  {
+    "role": "user",
+    "content": "Hey, what's the weather in Tokyo right now?"
+  },
+  {
+    "role": "assistant",
+    "tool_calls": [
+      {
+        "function": {
+          "name": "get_current_weather",
+          "arguments": {
+            "location": "Tokyo, JP"
+          }
+        }
+      }
+    ],
+    "tool_responses": [
+      {
+        "name": "get_current_weather",
+        "response": {
+          "temperature": 15,
+          "weather": "sunny"
+        }
+      }
+    ],
+    "content": "The current weather in Tokyo is 15 degrees and sunny."
+  }
+]
+--------------------------------------------------------------------------------
+Output: <bos><|turn>system
+You are a helpful assistant.<|tool>declaration:get_current_weather{description:<|"|>Gets the current weather in a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city and state, e.g. "San Francisco, CA" or "Tokyo, JP"<|"|>,type:<|"|>STRING<|"|>},unit:{description:<|"|>The unit to return the temperature in.<|"|>,enum:[<|"|>celsius<|"|>,<|"|>fahrenheit<|"|>],type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
+<|turn>user
+Hey, what's the weather in Tokyo right now?<turn|>
+<|turn>model
+<|tool_call>call:get_current_weather{location:<|"|>Tokyo, JP<|"|>}<tool_call|><|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>}<tool_response|>The current weather in Tokyo is 15 degrees and sunny.<turn|>
+
+ +

Function calling with Thinking

+ +

By utilizing an internal reasoning process, the model significantly enhances its function-calling accuracy. This allows for more precise decision-making regarding when to trigger a tool and how to define its parameters.

+
prompt = "Hey, I'm in Seoul. Is it good for running now?"
+message = [
+    {
+        "role": "system", "content": "You are a helpful assistant."
+    },
+    {
+        "role": "user", "content": prompt
+    },
+]
+
+text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True, enable_thinking=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+input_len = inputs["input_ids"].shape[-1]
+
+out = model.generate(**inputs, max_new_tokens=1024)
+output = processor.decode(out[0][input_len:], skip_special_tokens=False)
+result = processor.parse_response(output)
+
+for key, value in result.items():
+  if key == "role":
+    print(f"Role: {value}")
+  elif key == "thinking":
+    print(f"\n=== Thoughts ===\n{value}")
+  elif key == "content":
+    print(f"\n=== Answer ===\n{value}")
+  elif key == "tool_calls":
+    print(f"\n=== Tool Calls ===\n{value}")
+  else:
+    print(f"\n{key}: {value}...\n")
+
+
+Role: assistant
+
+=== Thoughts ===
+
+1.  **Analyze the Request:** The user is asking if it's "good for running now" in "Seoul".
+
+2.  **Identify Necessary Information:** To determine if it's good for running, I need current weather information (temperature, precipitation, etc.) for Seoul.
+
+3.  **Examine Available Tools:** The available tool is `get_current_weather(location, unit)`.
+
+4.  **Determine Tool Arguments:**
+    *   `location`: The user specified "Seoul".
+    *   `unit`: The user did not specify a unit (Celsius or Fahrenheit).
+
+5.  **Formulate the Tool Call:** I need to call `get_current_weather` with the location. Since the user didn't specify a unit, I can either omit it (if the tool defaults are acceptable) or choose a common one. However, the tool definition requires `location` but `unit` is optional.
+
+6.  **Construct the Response Strategy:**
+    *   Call the tool to get the weather data for Seoul.
+    *   Once the data is received, I can advise the user on whether it's suitable for running.
+
+7.  **Generate Tool Call:**
+
+    ```json
+    {
+      "toolSpec": {
+        "name": "get_current_weather",
+        "args": {
+          "location": "Seoul"
+        }
+      }
+    }
+    ```
+    (Self-correction: The `unit` parameter is optional in the definition, so just providing the location is sufficient to proceed.)
+
+8.  **Final Output Generation:** Present the tool call to the user/system.
+
+=== Tool Calls ===
+[{'type': 'function', 'function': {'name': 'get_current_weather', 'arguments': {'location': 'Seoul'} } }]
+
+ +

Process the tool call and get the final answer.

+
calls = extract_tool_calls(output)
+if calls:
+    # Call the function and get the result
+    #####################################
+    # WARNING: This is a demonstration. #
+    #####################################
+    # Using globals() to call functions dynamically can be dangerous in
+    # production. In a real application, you should implement a secure way to
+    # map function names to actual function calls, such as a predefined
+    # dictionary of allowed tools and their implementations.
+    results = [
+        {"name": c['name'], "response": globals()[c['name']](**c['arguments'])}
+        for c in calls
+    ]
+
+    message.append({
+        "role": "assistant",
+        "tool_calls": [
+            {"function": call} for call in calls
+        ],
+        "tool_responses": results
+    })
+
+text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
+inputs = processor(text=text, return_tensors="pt").to(model.device)
+out = model.generate(**inputs, max_new_tokens=128)
+generated_tokens = out[0][len(inputs["input_ids"][0]):]
+output = processor.decode(generated_tokens, skip_special_tokens=True)
+print(f"Output: {output}")
+message[-1]["content"] = output
+
+print("-"*80)
+print("Full History")
+print("-"*80)
+print(json.dumps(message, indent=2))
+
+
+Output: The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!
+--------------------------------------------------------------------------------
+Full History
+--------------------------------------------------------------------------------
+[
+  {
+    "role": "system",
+    "content": "You are a helpful assistant."
+  },
+  {
+    "role": "user",
+    "content": "Hey, I'm in Seoul. Is it good for running now?"
+  },
+  {
+    "role": "assistant",
+    "tool_calls": [
+      {
+        "function": {
+          "name": "get_current_weather",
+          "arguments": {
+            "location": "Seoul"
+          }
+        }
+      }
+    ],
+    "tool_responses": [
+      {
+        "name": "get_current_weather",
+        "response": {
+          "temperature": 15,
+          "weather": "sunny"
+        }
+      }
+    ],
+    "content": "The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!"
+  }
+]
+
+ +

Important Caveat: Automatic vs. Manual Schemas

+ +

When relying on automatic conversion from Python functions to JSON schema, the generated output may not always meet specific expectations regarding complex parameters.

+ +

If a function uses a custom object (like a Config class) as an argument, the automatic converter may describe it simply as a generic "object" without detailing its internal properties.

+ +

In these cases, manually defining the JSON schema is preferred to ensure nested properties (such as theme or font_size within a config object) are explicitly defined for the model.

+
import json
+from transformers.utils import get_json_schema
+
+class Config:
+    def __init__(self):
+        self.theme = "light"
+        self.font_size = 14
+
+def update_config(config: Config):
+    """
+    Updates the configuration of the system.
+
+    Args:
+        config: A Config object
+
+    Returns:
+        True if the configuration was successfully updated, False otherwise.
+    """
+
+update_config_schema = {
+    "type": "function",
+    "function": {
+        "name": "update_config",
+        "description": "Updates the configuration of the system.",
+        "parameters": {
+            "type": "object",
+            "properties": {
+                "config": {
+                    "type": "object",
+                    "description": "A Config object",
+                    "properties": {"theme": {"type": "string"}, "font_size": {"type": "number"} },
+                    },
+                },
+            "required": ["config"],
+            },
+        },
+    }
+
+print(f"--- [Automatic] ---")
+print(json.dumps(get_json_schema(update_config), indent=2))
+
+print(f"\n--- [Manual Schemas] ---")
+print(json.dumps(update_config_schema, indent=2))
+
+
+--- [Automatic] ---
+{
+  "type": "function",
+  "function": {
+    "name": "update_config",
+    "description": "Updates the configuration of the system.",
+    "parameters": {
+      "type": "object",
+      "properties": {
+        "config": {
+          "type": "object",
+          "description": "A Config object"
+        }
+      },
+      "required": [
+        "config"
+      ]
+    }
+  }
+}
+
+--- [Manual Schemas] ---
+{
+  "type": "function",
+  "function": {
+    "name": "update_config",
+    "description": "Updates the configuration of the system.",
+    "parameters": {
+      "type": "object",
+      "properties": {
+        "config": {
+          "type": "object",
+          "description": "A Config object",
+          "properties": {
+            "theme": {
+              "type": "string"
+            },
+            "font_size": {
+              "type": "number"
+            }
+          }
+        }
+      },
+      "required": [
+        "config"
+      ]
+    }
+  }
+}
+
+ +

Summary and next steps

+ +

You have established how to build an application that can call functions with Gemma 4. The workflow is established through a four-stage cycle:

+ +
    +
  1. Define Tools: Create the functions your model can use, specifying arguments and descriptions (e.g., a weather lookup function).
  2. +
  3. Model's Turn: The model receives the user's prompt and a list of available tools, returning a structured function call object instead of plain text.
  4. +
  5. Developer's Turn: The developer parses this output using regular expressions to extract function names and arguments, executes the actual Python code, and appends the results to the chat history using the specific tool role.
  6. +
  7. Final Response: The model processes the tool's execution result to generate a final, natural language answer for the user.
  8. +
+ +

Check out the following documentation for further reading.

+ + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tooling/google-official/docs/ai-google-dev_model_card_4.html b/tooling/google-official/docs/ai-google-dev_model_card_4.html new file mode 100644 index 0000000..c459b9a --- /dev/null +++ b/tooling/google-official/docs/ai-google-dev_model_card_4.html @@ -0,0 +1,5283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gemma 4 model card  |  Google AI for Developers + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+ + +
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + +

+ Gemma 4 model card + + +

+
+ + + + + + +
+ + + + +

+ +

+ + + +

Gemma 4 Banner

+ +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +

Gemma is a family of open models built by Google DeepMind. Gemma 4 models are +multimodal, handling text and image input (with audio supported on small models) +and generating text output. This release includes open-weights models in both +pre-trained and instruction-tuned variants. Gemma 4 features a context window of +up to 256K tokens and maintains multilingual support in over 140 languages.

+ +

Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is +well-suited for tasks like text generation, coding, and reasoning. The models +are available in four distinct sizes: E2B, E4B, 26B A4B, and +31B. Their diverse sizes make them deployable in environments ranging from +high-end phones to laptops and servers, democratizing access to state-of-the-art +AI.

+ +

Gemma 4 introduces key capability and architectural advancements:

+ +
    +
  • Reasoning – All models in the family are designed as highly capable +reasoners, with configurable thinking modes.

  • +
  • Extended Multimodalities – Processes Text, Image with variable aspect +ratio and resolution support (all models), Video, and Audio (featured +natively on the E2B and E4B models).

  • +
  • Diverse & Efficient Architectures – Offers Dense and Mixture-of-Experts +(MoE) variants of different sizes for scalable deployment.

  • +
  • Optimized for On-Device – Smaller models are specifically designed for +efficient local execution on laptops and mobile devices.

  • +
  • Increased Context Window – The small models feature a 128K context +window, while the medium models support 256K.

  • +
  • Enhanced Coding & Agentic Capabilities – Achieves notable improvements +in coding benchmarks alongside native function-calling support, powering +highly capable autonomous agents.

  • +
  • Native System Prompt Support – Gemma 4 introduces native support for the +system role, enabling more structured and controllable conversations.

  • +
+ +

Models Overview

+ +

Gemma 4 models are designed to deliver frontier-level performance at each size, +targeting deployment scenarios from mobile and edge devices (E2B, E4B) to +consumer GPUs and workstations (26B A4B, 31B). They are well-suited for +reasoning, agentic workflows, coding, and multimodal understanding.

+ +

The models employ a hybrid attention mechanism that interleaves local sliding +window attention with full global attention, ensuring the final layer is always +global. This hybrid design delivers the processing speed and low memory +footprint of a lightweight model without sacrificing the deep awareness required +for complex, long-context tasks. To optimize memory for long contexts, global +layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE).

+ +

Dense Models

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyE2BE4B31B Dense
Total Parameters2.3B effective (5.1B with embeddings)4.5B effective (8B with embeddings)30.7B
Layers354260
Sliding Window512 tokens512 tokens1024 tokens
Context Length128K tokens128K tokens256K tokens
Vocabulary Size262K262K262K
Supported ModalitiesText, Image, AudioText, Image, AudioText, Image
Vision Encoder Parameters~150M~150M~550M
Audio Encoder Parameters~300M~300MNo Audio
+ +

The "E" in E2B and E4B stands for "effective" parameters. The smaller models +incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in +on-device deployments. Rather than adding more layers or parameters to the +model, PLE gives each decoder layer its own small embedding for every token. +These embedding tables are large but are only used for quick lookups, which is +why the effective parameter count is much smaller than the total.

+ +

Mixture-of-Experts (MoE) Model

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property26B A4B MoE
Total Parameters25.2B
Active Parameters3.8B
Layers30
Sliding Window1024 tokens
Context Length256K tokens
Vocabulary Size262K
Expert Count8 active / 128 total and 1 shared
Supported ModalitiesText, Image
Vision Encoder Parameters~550M
+ +

The "A" in 26B A4B stands for "active parameters" in contrast to the total +number of parameters the model contains. By only activating a 4B subset of +parameters during inference, the Mixture-of-Experts model runs much faster than +its 26B total might suggest. This makes it an excellent choice for fast +inference compared to the dense 31B model since it runs almost as fast as a +4B-parameter model.

+ +

Benchmark Results

+ +

These models were evaluated against a large collection of different datasets and +metrics to cover different aspects of text generation. Evaluation results marked +in the table are for instruction-tuned models.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Gemma 4 31BGemma 4 26B A4BGemma 4 E4BGemma 4 E2BGemma 3 27B (no think)
MMLU Pro85.2%82.6%69.4%60.0%67.6%
AIME 2026 no tools89.2%88.3%42.5%37.5%20.8%
LiveCodeBench v680.0%77.1%52.0%44.0%29.1%
Codeforces ELO21501718940633110
GPQA Diamond84.3%82.3%58.6%43.4%42.4%
Tau2 (average over 3)76.9%68.2%42.2%24.5%16.2%
HLE no tools19.5%8.7%---
HLE with search26.5%17.2%---
BigBench Extra Hard74.4%64.8%33.1%21.9%19.3%
MMMLU88.4%86.3%76.6%67.4%70.7%
Vision
MMMU Pro76.9%73.8%52.6%44.2%49.7%
OmniDocBench 1.5 (average edit distance, lower is better)0.1310.1490.1810.2900.365
MATH-Vision85.6%82.4%59.5%52.4%46.0%
MedXPertQA MM61.3%58.1%28.7%23.5%-
Audio
CoVoST--35.5433.47-
FLEURS (lower is better)--0.080.09-
Long Context
MRCR v2 8 needle 128k (average)66.4%44.1%25.4%19.1%13.5%
+ +

Core Capabilities

+ +

Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key +capabilities include:

+ +
    +
  • Thinking – Built-in reasoning mode that lets the model think +step-by-step before answering.
  • +
  • Long Context – Context windows of up to 128K tokens (E2B/E4B) and 256K +tokens (26B A4B/31B).
  • +
  • Image Understanding – Object detection, Document/PDF parsing, screen and +UI understanding, chart comprehension, OCR (including multilingual), +handwriting recognition, and pointing. Images can be processed at variable +aspect ratios and resolutions.
  • +
  • Video Understanding – Analyze video by processing sequences of frames.
  • +
  • Interleaved Multimodal Input – Freely mix text and images in any order +within a single prompt.
  • +
  • Function Calling – Native support for structured tool use, enabling +agentic workflows.
  • +
  • Coding – Code generation, completion, and correction.
  • +
  • Multilingual – Out-of-the-box support for 35+ languages, pre-trained on +140+ languages.
  • +
  • Audio (E2B and E4B only) – Automatic speech recognition (ASR) and +speech-to-translated-text translation across multiple languages.
  • +
+ +

Best Practices

+ +

For the best performance, use these configurations and best practices:

+ +

1. Sampling Parameters

+ +

Use the following standardized sampling configuration across all use cases:

+ +
    +
  • temperature=1.0
  • +
  • top_p=0.95
  • +
  • top_k=64
  • +
+ +

2. Thinking Mode Configuration

+ +

Compared to Gemma 3, the models use standard system, assistant, and user +roles. To properly manage the thinking process, use the following control +tokens:

+ +
    +
  • Trigger Thinking: Thinking is enabled by including the <|think|> token +at the start of the system prompt. To disable thinking, remove the token.
  • +
  • Standard Generation: When thinking is enabled, the model will output its +internal reasoning followed by the final answer using this structure: +<|channel>thought\n[Internal reasoning]<channel|>
  • +
  • Disabled Thinking Behavior: For all models except for the E2B and E4B +variants, if thinking is disabled, the model will still generate the tags +but with an empty thought block: <|channel>thought\n<channel|>[Final +answer]
  • +
+ +
+

Note that many libraries like Transformers and llama.cpp handle the +complexities of the chat template for you.

+
+ +

3. Multi-Turn Conversations

+ +
    +
  • No Thinking Content in History: In multi-turn conversations, the +historical model output should only include the final response. Thoughts +from previous model turns must not be added before the next user turn +begins.
  • +
+ +

4. Modality order

+ +
    +
  • For optimal performance with multimodal inputs, place image and/or audio +content before the text in your prompt.
  • +
+ +

5. Variable Image Resolution

+ +

Aside from variable aspect ratios, Gemma 4 supports variable image resolution +through a configurable visual token budget, which controls how many tokens are +used to represent an image. A higher token budget preserves more visual detail +at the cost of additional compute, while a lower budget enables faster inference +for tasks that don't require fine-grained understanding.

+ +
    +
  • The supported token budgets are: 70, 140, 280, 560, and +1120. +
      +
    • Use lower budgets for classification, captioning, or video +understanding, where faster inference and processing many frames +outweigh fine-grained detail.
    • +
    • Use higher budgets for tasks like OCR, document parsing, or reading +small text.
    • +
  • +
+ +

6. Audio

+ +

Use the following prompt structures for audio processing:

+ +
    +
  • Audio Speech Recognition (ASR)
  • +
+
Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text.
+
+Follow these specific instructions for formatting the answer:
+*   Only output the transcription, with no newlines.
+*   When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three.
+
+
    +
  • Automatic Speech Translation (AST)
  • +
+
Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}.
+When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}.
+
+

7. Audio and Video Length

+ +

All models support image inputs and can process videos as frames whereas the E2B +and E4B models also support audio inputs. Audio supports a maximum length of 30 +seconds. Video supports a maximum of 60 seconds assuming the images are +processed at one frame per second.

+ +

Model Data

+ +

Data used for model training and how the data was processed.

+ +

Training Dataset

+ +

Our pre-training dataset is a large-scale, diverse collection of data +encompassing a wide range of domains and modalities, which includes web +documents, code, images, audio, with a cutoff date of January 2025. Here are the +key components:

+ +
    +
  • Web Documents: A diverse collection of web text ensures the model is +exposed to a broad range of linguistic styles, topics, and vocabulary. The +training dataset includes content in over 140 languages.
  • +
  • Code: Exposing the model to code helps it to learn the syntax and +patterns of programming languages, which improves its ability to generate +code and understand code-related questions.
  • +
  • Mathematics: Training on mathematical text helps the model learn logical +reasoning, symbolic representation, and to address mathematical queries.
  • +
  • Images: A wide range of images enables the model to perform image +analysis and visual data extraction tasks.
  • +
+ +

The combination of these diverse data sources is crucial for training a powerful +multimodal model that can handle a wide variety of different tasks and data +formats.

+ +

Data Preprocessing

+ +

Here are the key data cleaning and filtering methods applied to the training +data:

+ +
    +
  • CSAM Filtering: Rigorous CSAM (Child Sexual Abuse Material) filtering +was applied at multiple stages in the data preparation process to ensure the +exclusion of harmful and illegal content.
  • +
  • Sensitive Data Filtering: As part of making Gemma pre-trained models +safe and reliable, automated techniques were used to filter out certain +personal information and other sensitive data from training sets.
  • +
  • Additional methods: Filtering based on content quality and safety in +line with our +policies.
  • +
+ +

Ethics and Safety

+ +

As open models become central to enterprise infrastructure, provenance and +security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same +rigorous safety evaluations as our proprietary Gemini models.

+ +

Evaluation Approach

+ +

Gemma 4 models were developed in partnership with internal safety and +responsible AI teams. A range of automated as well as human evaluations were +conducted to help improve model safety. These evaluations align with Google's +AI principles, as well as safety policies, which +aim to prevent our generative AI models from generating harmful content, +including:

+ +
    +
  • Content related to child sexual abuse material and exploitation
  • +
  • Dangerous content (e.g., promoting suicide, or instructing in activities +that could cause real-world harm)
  • +
  • Sexually explicit content
  • +
  • Hate speech (e.g., dehumanizing members of protected groups)
  • +
  • Harassment (e.g., encouraging violence against people)
  • +
+ +

Evaluation Results

+ +

For all areas of safety testing, we saw major improvements in all categories of +content safety relative to previous Gemma models. Overall, Gemma 4 models +significantly outperform Gemma 3 and 3n models in improving safety, while +keeping unjustified refusals low. All testing was conducted without safety +filters to evaluate the model capabilities and behaviors. For both text-to-text +and image-to-text, and across all model sizes, the model produced minimal policy +violations, and showed significant improvements over previous Gemma models' +performance.

+ +

Usage and Limitations

+ +

These models have certain limitations that users should be aware of.

+ +

Intended Usage

+ +

Multimodal models (capable of processing vision, language, and/or audio) have a +wide range of applications across various industries and domains. The following +list of potential uses is not comprehensive. The purpose of this list is to +provide contextual information about the possible use-cases that the model +creators considered as part of model training and development.

+ +
    +
  • Content Creation and Communication +
      +
    • Text Generation: These models can be used to generate creative text +formats such as poems, scripts, code, marketing copy, and email drafts.
    • +
    • Chatbots and Conversational AI: Power conversational interfaces for +customer service, virtual assistants, or interactive applications.
    • +
    • Text Summarization: Generate concise summaries of a text corpus, +research papers, or reports.
    • +
    • Image Data Extraction: These models can be used to extract, +interpret, and summarize visual data for text communications.
    • +
    • Audio Processing and Interaction: The smaller models (E2B and E4B) +can analyze and interpret audio inputs, enabling voice-driven +interactions and transcriptions.
    • +
  • +
  • Research and Education +
      +
    • Natural Language Processing (NLP) and VLM Research: These models can +serve as a foundation for researchers to experiment with VLM and NLP +techniques, develop algorithms, and contribute to the advancement of the +field.
    • +
    • Language Learning Tools: Support interactive language learning +experiences, aiding in grammar correction or providing writing practice. +
        +
      • Knowledge Exploration: Assist researchers in exploring large +bodies of text by generating summaries or answering questions about +specific topics.
      • +
    • +
  • +
+ +

Limitations

+ +
    +
  • Training Data +
      +
    • The quality and diversity of the training data significantly influence +the model's capabilities. Biases or gaps in the training data can lead +to limitations in the model's responses.
    • +
    • The scope of the training dataset determines the subject areas the model +can handle effectively.
    • +
  • +
  • Context and Task Complexity +
      +
    • Models perform well on tasks that can be framed with clear prompts and +instructions. Open-ended or highly complex tasks might be challenging.
    • +
    • A model's performance can be influenced by the amount of context +provided (longer context generally leads to better outputs, up to a +certain point).
    • +
  • +
  • Language Ambiguity and Nuance +
      +
    • Natural language is inherently complex. Models might struggle to grasp +subtle nuances, sarcasm, or figurative language.
    • +
  • +
  • Factual Accuracy +
      +
    • Models generate responses based on information they learned from their +training datasets, but they are not knowledge bases. They may generate +incorrect or outdated factual statements.
    • +
  • +
  • Common Sense +
      +
    • Models rely on statistical patterns in language. They might lack the +ability to apply common sense reasoning in certain situations.
    • +
  • +
+ +

Ethical Considerations and Risks

+ +

The development of vision-language models (VLMs) raises several ethical +concerns. In creating an open model, we have carefully considered the following:

+ +
    +
  • Bias and Fairness +
      +
    • VLMs trained on large-scale, real-world text and image data can reflect +socio-cultural biases embedded in the training material. Gemma 4 models +underwent careful scrutiny, input data pre-processing, and post-training +evaluations as reported in this card to help mitigate the risk of these +biases.
    • +
  • +
  • Misinformation and Misuse +
      +
    • VLMs can be misused to generate text that is false, misleading, or +harmful.
    • +
    • Guidelines are provided for responsible use with the model, see the +Responsible Generative AI Toolkit.
    • +
  • +
  • Transparency and Accountability +
      +
    • This model card summarizes details on the models' architecture, +capabilities, limitations, and evaluation processes.
    • +
    • A responsibly developed open model offers the opportunity to share +innovation by making VLM technology accessible to developers and +researchers across the AI ecosystem.
    • +
  • +
+ +

Risks identified and mitigations:

+ +
    +
  • Generation of harmful content: Mechanisms and guidelines for content +safety are essential. Developers are encouraged to exercise caution and +implement appropriate content safety safeguards based on their specific +product policies and application use cases.
  • +
  • Misuse for malicious purposes: Technical limitations and developer and +end-user education can help mitigate against malicious applications of VLMs. +Educational resources and reporting mechanisms for users to flag misuse are +provided.
  • +
  • Privacy violations: Models were trained on data filtered for removal of +certain personal information and other sensitive data. Developers are +encouraged to adhere to privacy regulations with privacy-preserving +techniques.
  • +
  • Perpetuation of biases: It's encouraged to perform continuous monitoring +(using evaluation metrics, human review) and the exploration of de-biasing +techniques during model training, fine-tuning, and other use cases.
  • +
+ +

Benefits

+ +

At the time of release, this family of models provides high-performance open +vision-language model implementations designed from the ground up for +responsible AI development compared to similarly sized models.

+ + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tooling/google-official/docs/ai-google-dev_prompt_formatting_gemma4.html b/tooling/google-official/docs/ai-google-dev_prompt_formatting_gemma4.html new file mode 100644 index 0000000..3cb3c53 --- /dev/null +++ b/tooling/google-official/docs/ai-google-dev_prompt_formatting_gemma4.html @@ -0,0 +1,4873 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gemma 4 Prompt Formatting  |  Google AI for Developers + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+ + +
+
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + +
+
+ + +
+ + + + +
+ + + +
+ +
+ + + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + +

+ Gemma 4 Prompt Formatting + + +

+
+ + + + + + +
+ + + + +

+ +

+ + + +

Starting with Gemma 4, we introduce new control tokens. For Gemma 3 and lower, +see the previous document.

+ +

The following sections specify the control tokens used by Gemma 4 and their use +cases. Note that the control tokens are reserved in and specific to our +tokenizer.

+ +
    +
  • Token to indicate a system instruction: system
  • +
  • Token to indicate a user turn: user
  • +
  • Token to indicate a model turn: model
  • +
  • Token to indicate the beginning of a dialogue turn: <|turn>
  • +
  • Token to indicate the end of a dialogue turn: <turn|>
  • +
+ +

Here's an example dialogue:

+
<|turn>system
+You are a helpful assistant.<turn|>
+<|turn>user
+Hello.<turn|>
+
+

Multi-modalities

+ + + + + + + + + + + + + + + + + + + + + + + +
Multimodal TokenPurpose
<|image>
<image|>
Indicate image embeddings
<|audio>
<audio|>
Indicate audio embeddings
<|image|>
<|audio|>
Special placeholder tokens
+ +

We use two special placeholder tokens (<|image|> and <|audio|>) to specify +where image and audio tokens should be inserted. After tokenization, these +tokens are replaced by the actual soft embeddings inside the model.

+ +

Here is an example dialogue:

+
prompt = """<|turn>user
+Describe this image: <|image|>
+
+And translate these audio:
+
+a. <|audio|>
+b. <|audio|><turn|>
+<|turn>model"""
+
+

Agentic and Reasoning Control Tokens

+ +

To support agentic workflows, Gemma uses specialized control tokens that +delineate internal reasoning (thinking) from external actions (function +calling). These tokens allow the model to process complex logic before providing +a final response or interacting with outside tools.

+ +

Function Calling

+ +

Gemma 4 is trained on six special tokens to manage the "tool use" lifecycle.

+ + + + + + + + + + + + + + + + + + + + + + + +
Token PairPurpose
<|tool>
<tool|>
Defines a tool
<|tool_call>
<tool_call|>
Indicates a model's request to use a tool.
<|tool_response>
<tool_response|>
Provides a tool's execution result back to the model.
+ +

Delimiter for String Values: <|"|>

+ +

A single token, <|"|>, is used as a delimiter for all string values +within the structured data blocks.

+ +
    +
  • Purpose: This token ensures that any special characters (such as {, +}, ,, or quotes) inside a string are treated as literal text and not as +part of the data structure's underlying syntax.
  • +
  • Usage: All string literals in your function declarations, calls, and +responses must be enclosed using this token (e.g., key:<|"|>string +value<|"|>).
  • +
+ +

Thinking Mode

+ +

To activate thinking mode, include the <|think|> control token within the +system instruction.

+ + + + + + + + + + + + + + + + + + + +
Control TokenPurpose
<|think|>Activates thinking mode
<|channel>
<channel|>
Indicates a model's internal process.
+ +

Here is an example dialogue:

+
<|turn>system
+<|think|><turn|>
+<|turn>user
+What is the water formula?<turn|>
+<|turn>model
+<|channel>thought
+...
+<channel|>The most common interpretation of "the water formula" refers...<turn|>
+
+

Thinking mode is designed to be enabled at the conversation level. This should +be consolidated into a single system turn alongside your other system +instructions, such as tool definitions.

+ +

Reasoning and Function Calling Example

+ +

In an agentic turn, the model may "think" privately before deciding to call a +function. The lifecycle follows this sequence:

+ +
    +
  1. User Inquiry: The user asks a question.
  2. +
  3. Internal Reasoning: The model thinks privately in the thought channel.
  4. +
  5. Tool Request: The model halts generation to request a tool call.
  6. +
  7. Execution & Injection: The application executes the tool and appends the response.
  8. +
  9. Final Response: The model reads the response and generates the final answer.
  10. +
+ +

The following example demonstrates a model using a weather tool:

+
<|turn>system
+<|think|>You are a helpful assistant.<|tool>declaration:get_current_temperature{...}<tool|><turn|>
+<|turn>user
+What's the temperature in London?<turn|>
+<|turn>model
+<|channel>thought
+...
+<channel|><|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
+
+

Your application should parse the model's response to extract the function name +and arguments, execute the function, and then append the tool_calls and +tool_responses to the chat history under the assistant role.

+
<|turn>model
+<|tool_call>call:get_current_weather{location:<|"|>London<|"|>}<tool_call|><|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>}<tool_response|>
+
+

Finally, Gemma reads the tool response and replies to the user.

+
The temperature in London is 15 degrees and it is sunny.<turn|>
+
+

Here is the complete JSON chat history for this example:

+
[
+  {
+    "role": "system",
+    "content": "You are a helpful assistant."
+  },
+  {
+    "role": "user",
+    "content": "What's the temperature in London?"
+  },
+  {
+    "role": "assistant",
+    "tool_calls": [
+      {
+        "function": {
+          "name": "get_current_weather",
+          "arguments": {
+            "location": "London"
+          }
+        }
+      }
+    ],
+    "tool_responses": [
+      {
+        "name": "get_current_weather",
+        "response": {
+          "temperature": 15,
+          "weather": "sunny"
+        }
+      }
+    ],
+    "content": "The temperature in London is 15 degrees and it is sunny."
+  }
+]
+
+

Managing Thought Context Between Turns

+ +

Properly managing the model's generated thoughts is critical for maintaining +performance across multi-turn conversations.

+ +
    +
  • Standard Multi-Turn Conversations: You must remove (strip) the model's +generated thoughts from the previous turn before passing the conversation +history back to the model for the next turn. If you want to disable thinking +mode mid-conversation, you can remove the <|think|> token when you strip +the previous thoughts.
  • +
  • Function Calling (Exception): If a single model turn involves function +or tool calls, thoughts must NOT be removed between the function calls.
  • +
+ +

Agentic Workflows and Long-Running Tasks

+ +

Because raw thoughts are stripped between standard turns, developers building +long-running agents may want to retain reasoning context to prevent the model +from entering cyclical reasoning loops.

+ +
    +
  • Summarizing Thoughts: A highly recommended inference technique is to +extract, summarize, and feed the model's previous thoughts back into the +context window as standard text.
  • +
  • Formatting Constraints: Because Gemma 4 was not explicitly trained with +raw thoughts included in the prompt (outside of the specific tool-call +scenario mentioned above), there is no strict or specific format expected by +the model for these injected thoughts. You have the flexibility to format +summarized reasoning in whatever way best suits your specific agentic +architecture.
  • +
+ +

Integration Notes

+ +
    +
  • Internal State: The <|channel> and <channel|> tokens are typically +used for Chain-of-Thought (CoT) processing. In standard user-facing +applications, this content is usually hidden from the end-user.
  • +
  • Tool Loop: The tool_call and tool_response tokens facilitate a +"handshake" between the model your application environment. The application +intercepts the tool_call, executes the underlying code, and feeds the +result back to the model within the tool_response tokens.
  • +
  • Model Behavior: Larger models (e.g., gemma-4-26B-A4B-it, gemma-4-31B-it) +may occasionally generate a thought channel even when thinking mode is +explicitly turned off. To stabilize model behavior in these edge cases, +consider adding an empty thinking token to the prompt.
  • +
+ +

Tip: Fine-Tuning Big Models with No-Thinking Datasets

+ +

When fine-tuning larger Gemma models with a dataset that does not include +thinking, you can achieve better results by adding the empty channel to your +training prompts:

+
<|turn>model
+<|channel>thought
+<channel|>
+
+

Tip: Adaptive Thought Efficiency using System Instructions

+ +

While "thinking" in Gemma 4 is officially supported as an ON or OFF boolean +feature, the model has exceptionally strong instruction-following capabilities +that allow you to modulate its thinking behavior dynamically.

+ +

Rather than relying on a hardcoded framework parameter for "high" or "low" +thinking, you can use System Instructions (SI) to guide the model into a reduced +thinking mode. By explicitly instructing the model to think efficiently or at a +lower depth (a concept we refer to as a "LOW" thinking instruction), you can +achieve adaptive thought efficiency.

+ +
    +
  • Reduced Cost: Testing has shown that applying a "LOW" thinking System +Instruction can reduce the number of thinking tokens generated by +approximately 20%.
  • +
  • Proof of Concept: Because this behavior is a byproduct of the model's +instructability rather than a specifically trained, there is no single +"perfect" prompt. The "LOW" instruction is a proof of concept.
  • +
  • Customization: We highly encourage developers to play around with their +own custom System Instructions. You can fine-tune the depth, length, and +style of the model's thinking process to perfectly balance latency, cost, +and output quality for your specific use cases.
  • +
+ + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tooling/google-official/docs/blog_announcement.html b/tooling/google-official/docs/blog_announcement.html new file mode 100644 index 0000000..404e76b --- /dev/null +++ b/tooling/google-official/docs/blog_announcement.html @@ -0,0 +1,7466 @@ + + + + + + + + + + + + Gemma 4: Our most capable open models to date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ + + +
+ + + + + + + +
+
+
+ +
+ + +
+ + + + + +
+ + + + + + + + + + + + +
+
Gemma 4: Byte for byte, the most capable open models
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+ +
+ ["How can teachers and students use AI?", "What are the newest features in Chrome?", "How can I learn new AI skills?"] +
+
+ + + + + + + + + + + +
+ + + + + + +
+ + + +
+
+
+ + + +
+ + + + +
+ + + + + +
+
+ +
+ + + + + + + + + + + +
+ +

Gemma 4: Byte for byte, the most capable open models

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ Gemma 4 +
+
+ +
+
+
+ + + + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + Listen to article + +
This content is generated by Google AI. Generative AI is experimental
+ + + + +
+
+
[[duration]] minutes
+
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+
+ +
+
+ + + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Open model performance vs size on Arena.ai’s chat arena as of 4/1.

+
+ + +
+ Open model performance vs size on Arena.ai’s chat arena +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. See additional benchmarks in our model card.

+
+ + +
+ Gemma 4 Table +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ +
+

Let’s stay in touch. Get the latest news from Google in your inbox.

+
+
+ Subscribe + +
+
+
+
+ + + + + + + + +
+ + + + +
+ + + + + +
+
+ + +
+ +
+ + + + + diff --git a/tooling/google-official/gemma-cpp/API_SERVER_README.md b/tooling/google-official/gemma-cpp/API_SERVER_README.md new file mode 100644 index 0000000..f7af504 --- /dev/null +++ b/tooling/google-official/gemma-cpp/API_SERVER_README.md @@ -0,0 +1,250 @@ +# Gemma.cpp API Server + +This is an HTTP API server for gemma.cpp that implements the Google API protocol, allowing you to interact with Gemma models through REST API endpoints compatible with the Google API format. + +## Features + +- **API-compatible**: Implements Google API endpoints +- **Unified client/server**: Single codebase supports both local and public API modes +- **Text generation**: Support for `generateContent` endpoint +- **Streaming support**: Server-Sent Events (SSE) for `streamGenerateContent` +- **Model management**: Support for `/v1beta/models` endpoint +- **Session management**: Maintains conversation context with KV cache +- **JSON responses**: All responses in Google API format +- **Error handling**: Proper HTTP status codes and error messages + +## Building + +The API server is built alongside the main gemma.cpp project: + +```bash +# Configure the build +cmake -B build -DCMAKE_BUILD_TYPE=Release + +# Build the API server and client +cmake --build build --target gemma_api_server gemma_api_client -j 8 +``` + +The binaries will be created at: +- `build/gemma_api_server` - Local API server +- `build/gemma_api_client` - Unified client for both local and public APIs + +## Usage + +### Starting the Local API Server + +```bash +./build/gemma_api_server \ + --tokenizer path/to/tokenizer.spm \ + --weights path/to/model.sbs \ + --port 8080 +``` + +**Required arguments:** +- `--tokenizer`: Path to the tokenizer file (`.spm`) +- `--weights`: Path to the model weights file (`.sbs`) + +**Optional arguments:** +- `--port`: Port to listen on (default: 8080) +- `--model`: Model name for API endpoints (default: gemma3-4b) + +### Using the Unified Client + +#### With Local Server +```bash +# Interactive chat with local server +./build/gemma_api_client --interactive 1 --host localhost --port 8080 + +# Single prompt with local server +./build/gemma_api_client --prompt "Hello, how are you?" +``` + +#### With Public Google API +```bash +# Set API key and use public API +export GOOGLE_API_KEY="your-api-key-here" +./build/gemma_api_client --interactive 1 + +# Or pass API key directly +./build/gemma_api_client --api_key "your-api-key" --interactive 1 +``` + +## API Endpoints + +The server implements Google API endpoints: + +### 1. Generate Content - `POST /v1beta/models/gemma3-4b:generateContent` + +Generate a response for given content (non-streaming). + +**Request:** +```json +{ + "contents": [ + { + "parts": [ + {"text": "Why is the sky blue?"} + ] + } + ], + "generationConfig": { + "temperature": 0.9, + "topK": 1, + "maxOutputTokens": 1024 + } +} +``` + +**Response:** +```json +{ + "candidates": [ + { + "content": { + "parts": [ + {"text": "The sky appears blue because..."} + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0 + } + ], + "promptFeedback": { + "safetyRatings": [] + }, + "usageMetadata": { + "promptTokenCount": 5, + "candidatesTokenCount": 25, + "totalTokenCount": 30 + } +} +``` + +### 2. Stream Generate Content - `POST /v1beta/models/gemma3-4b:streamGenerateContent` + +Generate a response with Server-Sent Events (SSE) streaming. + +**Request:** Same as above + +**Response:** Stream of SSE events: +``` +data: {"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"},"index":0}],"promptFeedback":{"safetyRatings":[]}} + +data: {"candidates":[{"content":{"parts":[{"text":" sky"}],"role":"model"},"index":0}],"promptFeedback":{"safetyRatings":[]}} + +data: [DONE] +``` + +### 3. List Models - `GET /v1beta/models` + +List available models. + +**Response:** +```json +{ + "models": [ + { + "name": "models/gemma3-4b", + "displayName": "Gemma3 4B", + "description": "Gemma3 4B model running locally" + } + ] +} +``` + +## Example Usage + +### Using curl with Local Server + +```bash +# Generate content (non-streaming) +curl -X POST http://localhost:8080/v1beta/models/gemma3-4b:generateContent \ + -H "Content-Type: application/json" \ + -d '{ + "contents": [{"parts": [{"text": "Hello, how are you?"}]}], + "generationConfig": {"temperature": 0.9, "topK": 1, "maxOutputTokens": 1024} + }' + +# Stream generate content (SSE) +curl -X POST http://localhost:8080/v1beta/models/gemma3-4b:streamGenerateContent \ + -H "Content-Type: application/json" \ + -d '{ + "contents": [{"parts": [{"text": "Tell me a story"}]}], + "generationConfig": {"temperature": 0.9, "topK": 1, "maxOutputTokens": 1024} + }' + +# List models +curl http://localhost:8080/v1beta/models +``` + +### Multi-turn Conversation with curl + +```bash +# First message +curl -X POST http://localhost:8080/v1beta/models/gemma3-4b:generateContent \ + -H "Content-Type: application/json" \ + -d '{ + "contents": [ + {"parts": [{"text": "Hi, my name is Alice"}]} + ] + }' + +# Follow-up message with conversation history +curl -X POST http://localhost:8080/v1beta/models/gemma3-4b:generateContent \ + -H "Content-Type: application/json" \ + -d '{ + "contents": [ + {"parts": [{"text": "Hi, my name is Alice"}]}, + {"parts": [{"text": "Hello Alice! Nice to meet you."}]}, + {"parts": [{"text": "What is my name?"}]} + ] + }' +``` + +### Using Python + +```python +import requests + +# Generate content +response = requests.post('http://localhost:8080/v1beta/models/gemma3-4b:generateContent', + json={ + 'contents': [{'parts': [{'text': 'Explain quantum computing in simple terms'}]}], + 'generationConfig': { + 'temperature': 0.9, + 'topK': 1, + 'maxOutputTokens': 1024 + } + } +) + +result = response.json() +if 'candidates' in result and result['candidates']: + text = result['candidates'][0]['content']['parts'][0]['text'] + print(text) +``` + +## Configuration Options + +The Google API supports various generation configuration options: + +- **temperature**: Controls randomness (0.0 to 2.0, default: 1.0) +- **topK**: Top-K sampling parameter (default: 1) +- **maxOutputTokens**: Maximum number of tokens to generate (default: 8192) + +## Key Features + +- **Unified Implementation**: Same codebase handles both local server and public API +- **Session Management**: Maintains conversation context using KV cache +- **Streaming Support**: Real-time token generation via Server-Sent Events +- **Error Handling**: Comprehensive error responses and HTTP status codes +- **Memory Efficient**: Optimized token processing and caching + +## Compatibility + +This implementation is compatible with: +- Google API format and endpoints +- Standard HTTP clients (curl, browsers, Python requests, etc.) +- Server-Sent Events (SSE) for streaming responses +- JSON request/response format diff --git a/tooling/google-official/gemma-cpp/README.md b/tooling/google-official/gemma-cpp/README.md new file mode 100644 index 0000000..6294920 --- /dev/null +++ b/tooling/google-official/gemma-cpp/README.md @@ -0,0 +1,532 @@ +# gemma.cpp + +gemma.cpp is a lightweight, standalone C++ inference engine for the Gemma +foundation models from Google. + +For additional information about Gemma, see +[ai.google.dev/gemma](https://ai.google.dev/gemma). Model weights, including +gemma.cpp specific artifacts, are +[available on kaggle](https://www.kaggle.com/models/google/gemma-2). + +## Who is this project for? + +Modern LLM inference engines are sophisticated systems, often with bespoke +capabilities extending beyond traditional neural network runtimes. With this +comes opportunities for research and innovation through co-design of high level +algorithms and low-level computation. However, there is a gap between +deployment-oriented C++ inference runtimes, which are not designed for +experimentation, and Python-centric ML research frameworks, which abstract away +low-level computation through compilation. + +gemma.cpp provides a minimalist implementation of Gemma-2, Gemma-3, and +PaliGemma-2 models, focusing on simplicity and directness rather than full +generality. This is inspired by vertically-integrated model implementations such +as [ggml](https://github.com/ggerganov/ggml), +[llama.c](https://github.com/karpathy/llama2.c), and +[llama.rs](https://github.com/srush/llama2.rs). + +gemma.cpp targets experimentation and research use cases. It is intended to be +straightforward to embed in other projects with minimal dependencies and also +easily modifiable with a small ~2K LoC core implementation (along with ~4K LoC +of supporting utilities). We use the [Google +Highway](https://github.com/google/highway) Library to take advantage of +portable SIMD for CPU inference. + +For production-oriented edge deployments we recommend standard deployment +pathways using Python frameworks like JAX, Keras, PyTorch, and Transformers +([all model variations here](https://www.kaggle.com/models/google/gemma)). + +## Contributing + +Community contributions large and small are welcome. See +[DEVELOPERS.md](https://github.com/google/gemma.cpp/blob/main/DEVELOPERS.md) +for additional notes contributing developers and [join the discord by following +this invite link](https://discord.gg/H5jCBAWxAe). This project follows +[Google's Open Source Community +Guidelines](https://opensource.google.com/conduct/). + +> [!NOTE] Active development is currently done on the `dev` branch. Please open +> pull requests targeting `dev` branch instead of `main`, which is intended to +> be more stable. + +## What's inside? + +- LLM + + - CPU-only inference for: Gemma 2-3, PaliGemma 2. + - Sampling with TopK and temperature. + - Backward pass (VJP) and Adam optimizer for Gemma research. + +- Optimizations + + - Mixed-precision (fp8, bf16, fp32, fp64 bit) GEMM: + - Designed for BF16 instructions, can efficiently emulate them. + - Automatic runtime autotuning 7 parameters per matrix shape. + - Weight compression integrated directly into GEMM: + - Custom fp8 format with 2..3 mantissa bits; tensor scaling. + - Also bf16, f32 and non-uniform 4-bit (NUQ); easy to add new formats. + +- Infrastructure + + - SIMD: single implementation via Highway. Chooses ISA at runtime. + - Tensor parallelism: CCX-aware, multi-socket thread pool. + - Disk I/O: memory map or parallel read (heuristic with user override). + - Custom format with forward/backward-compatible metadata serialization. + - Model conversion from Safetensors, not yet open sourced. + - Portability: Linux, Windows/OS X supported. CMake/Bazel. 'Any' CPU. + +- Frontends + + - C++ APIs with streaming for single query and batched inference. + - Basic interactive command-line app. + - Basic Python bindings (pybind11). + +## Quick Start + +### System requirements + +Before starting, you should have installed: + +- [CMake](https://cmake.org/) +- [Clang C++ compiler](https://clang.llvm.org/get_started.html), supporting at + least C++17. +- `tar` for extracting archives from Kaggle. + +Building natively on Windows requires the Visual Studio 2012 Build Tools with the +optional Clang/LLVM C++ frontend (`clang-cl`). This can be installed from the +command line with +[`winget`](https://learn.microsoft.com/en-us/windows/package-manager/winget/): + +```sh +winget install --id Kitware.CMake +winget install --id Microsoft.VisualStudio.2022.BuildTools --force --override "--passive --wait --add Microsoft.VisualStudio.Workload.VCTools;installRecommended --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset" +``` + +### Step 1: Obtain model weights and tokenizer from Kaggle or Hugging Face Hub + +Visit the +[Kaggle page for Gemma-2](https://www.kaggle.com/models/google/gemma-2/gemmaCpp) +and select `Model Variations |> Gemma C++`. + +On this tab, the `Variation` dropdown includes the options below. Note bfloat16 +weights are higher fidelity, while 8-bit switched floating point weights enable +faster inference. In general, we recommend starting with the `-sfp` checkpoints. + +> [!NOTE] **Important**: We strongly recommend starting off with the +> `gemma2-2b-it-sfp` model to get up and running. + +Gemma 2 models are named `gemma2-2b-it` for 2B and `9b-it` or `27b-it`. See the +`ModelPrefix` function in `configs.cc`. + +### Step 2: Extract Files + +After filling out the consent form, the download should proceed to retrieve a +tar archive file `archive.tar.gz`. Extract files from `archive.tar.gz` (this can +take a few minutes): + +``` +tar -xf archive.tar.gz +``` + +This should produce a file containing model weights such as `2b-it-sfp.sbs` and +a tokenizer file (`tokenizer.spm`). You may want to move these files to a +convenient directory location (e.g. the `build/` directory in this repo). + +### Step 3: Build + +The build system uses [CMake](https://cmake.org/). To build the gemma inference +runtime, create a build directory and generate the build files using `cmake` +from the top-level project directory. Note if you previous ran `cmake` and are +re-running with a different setting, be sure to delete all files in the `build/` +directory with `rm -rf build/*`. + +#### Unix-like Platforms +```sh +cmake -B build +``` + +After running `cmake`, you can enter the `build/` directory and run `make` to +build the `./gemma` executable: + +```sh +# Configure `build` directory +cmake --preset make + +# Build project using make +cmake --build --preset make -j [number of parallel threads to use] +``` + +Replace `[number of parallel threads to use]` with a number - the number of +cores available on your system is a reasonable heuristic. For example, `make -j4 +gemma` will build using 4 threads. If the `nproc` command is available, you can +use `make -j$(nproc) gemma` as a reasonable default for the number of threads. + +If you aren't sure of the right value for the `-j` flag, you can simply run +`make gemma` instead and it should still build the `./gemma` executable. + +> [!NOTE] +> On Windows Subsystem for Linux (WSL) users should set the number of +> parallel threads to 1. Using a larger number may result in errors. + +If the build is successful, you should now have a `gemma` executable in the +`build/` directory. + +#### Windows + +```sh +# Configure `build` directory +cmake --preset windows + +# Build project using Visual Studio Build Tools +cmake --build --preset windows -j [number of parallel threads to use] +``` + +If the build is successful, you should now have a `gemma.exe` executable in the +`build/` directory. + +#### Bazel + +```sh +bazel build -c opt --cxxopt=-std=c++20 :gemma +``` + +If the build is successful, you should now have a `gemma` executable in the +`bazel-bin/` directory. + +#### Make + +If you prefer Makefiles, @jart has made one available here: + +https://github.com/jart/gemma3/blob/main/Makefile + +### Step 4: Run + +You can now run `gemma` from inside the `build/` directory. + +`gemma` has the following required arguments: + +Argument | Description | Example value +------------- | ---------------------------- | --------------- +`--weights` | The compressed weights file. | `2b-it-sfp.sbs` +`--tokenizer` | The tokenizer file. | `tokenizer.spm` + +Example invocation for the following configuration: + +- weights file `gemma2-2b-it-sfp.sbs` (Gemma2 2B instruction-tuned model, + 8-bit switched floating point). +- Tokenizer file `tokenizer.spm` (can omit for single-format weights files + created after 2025-05-06, or output by migrate_weights.cc). + +```sh +./gemma \ +--tokenizer tokenizer.spm --weights gemma2-2b-it-sfp.sbs +``` + +### PaliGemma Vision-Language Model + +This repository includes a version of the PaliGemma 2 VLM +([paper](https://arxiv.org/abs/2412.03555)). We provide a C++ implementation of +the PaliGemma 2 model here. + +To use the version of PaliGemma included in this repository, build the gemma +binary as noted above in Step 3. Download the compressed weights and tokenizer +from +[Kaggle](https://www.kaggle.com/models/google/paligemma-2/gemmaCpp/paligemma2-3b-mix-224) +and run the binary as follows: + +```sh +./gemma \ +--tokenizer paligemma_tokenizer.model \ +--weights paligemma2-3b-mix-224-sfp.sbs \ +--image_file paligemma/testdata/image.ppm +``` + +Note that the image reading code is very basic to avoid depending on an image +processing library for now. We currently only support reading binary PPMs (P6). +So use a tool like `convert` to first convert your images into that format, e.g. + +`convert image.jpeg -resize 224x224^ image.ppm` + +(As the image will be resized for processing anyway, we can already resize at +this stage for slightly faster loading.) + +The interaction with the image (using the mix-224 checkpoint) may then look +something like this: + +``` +> Describe the image briefly +A large building with two towers in the middle of a city. +> What type of building is it? +church +> What color is the church? +gray +> caption image +A large building with two towers stands tall on the water's edge. The building +has a brown roof and a window on the side. A tree stands in front of the +building, and a flag waves proudly from its top. The water is calm and blue, +reflecting the sky above. A bridge crosses the water, and a red and white boat +rests on its surface. The building has a window on the side, and a flag on top. +A tall tree stands in front of the building, and a window on the building is +visible from the water. The water is green, and the sky is blue. +``` + +### Migrating to single-file format + +There is now a new format for the weights file, which is a single file that +allows to contain the tokenizer (and the model type) directly. A tool to migrate +from the multi-file format to the single-file format is available. + +```sh +io/migrate_weights \ + --tokenizer .../tokenizer.spm --weights .../gemma2-2b-it-sfp.sbs \ + --output_weights .../gemma2-2b-it-sfp-single.sbs +``` + +After migration, you can omit the tokenizer argument like this: + +```sh +./gemma --weights .../gemma2-2b-it-sfp-single.sbs +``` + +### Troubleshooting and FAQs + +**Problems building in Windows / Visual Studio** + +Currently if you're using Windows, we recommend building in WSL (Windows +Subsystem for Linux). We are exploring options to enable other build +configurations, see issues for active discussion. + +**Model does not respond to instructions and produces strange output** + +A common issue is that you are using a pre-trained model, which is not +instruction-tuned and thus does not respond to instructions. Make sure you are +using an instruction-tuned model (`gemma2-2b-it-sfp`) and not a pre-trained +model (any model with a `-pt` suffix). + +**What sequence lengths are supported?** + +See `max_seq_len` in `configs.cc` and `InferenceArgs.seq_len`. For the Gemma 3 +models larger than 1B, this is typically 32K but 128K would also work given +enough RAM. Note that long sequences will be slow due to the quadratic cost of +attention. + +**How do I convert my fine-tune to a `.sbs` compressed model file?** + +For PaliGemma 2 checkpoints, you can use python/convert_from_safetensors.py to +convert from safetensors format (tested with building via bazel). For an adapter +model, you will likely need to call merge_and_unload() to convert the adapter +model to a single-file format before converting it. + +Here is how to use it using a bazel build of the compression library assuming +locally installed (venv) torch, numpy, safetensors, absl-py, etc.: + +```sh +bazel build //compression/python:compression +BAZEL_OUTPUT_DIR="${PWD}/bazel-bin/compression" +python3 -c "import site; print(site.getsitepackages())" +# Use your sites-packages file here: +ln -s $BAZEL_OUTPUT_DIR [...]/site-packages/compression +python3 python/convert_from_safetensors.py --load_path [...].safetensors.index.json +``` + +**What are some easy ways to make the model run faster?** + +1. Make sure you are using the 8-bit switched floating point `-sfp` models. + These are half the size of bf16 and thus use less memory bandwidth and cache + space. +2. Due to auto-tuning, the second and especially third query will be faster. +3. If you're on a laptop, make sure power mode is set to maximize performance + and saving mode is **off**. For most laptops, the power saving modes get + activated automatically if the computer is not plugged in. +4. Close other unused cpu-intensive applications. +5. On macs, anecdotally we observe a "warm-up" ramp-up in speed as performance + cores get engaged. + +We're also working on algorithmic and optimization approaches for faster +inference, stay tuned. + +## Usage + +`gemma` has different usage modes, controlled by the verbosity flag. + +All usage modes are currently interactive, triggering text generation upon +newline input. + +| Verbosity | Usage mode | Details | +| --------------- | ---------- | --------------------------------------------- | +| `--verbosity 0` | Minimal | Only prints generation output. Suitable as a CLI tool. | +| `--verbosity 1` | Default | Standard user-facing terminal UI. | +| `--verbosity 2` | Detailed | Shows additional developer and debug info. | + +### Interactive Terminal App + +By default, verbosity is set to 1, bringing up a terminal-based interactive +interface when `gemma` is invoked: + +```sh +$ ./gemma [...] + __ _ ___ _ __ ___ _ __ ___ __ _ ___ _ __ _ __ + / _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \ +| (_| | __/ | | | | | | | | | | (_| || (__| |_) | |_) | + \__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/ + __/ | | | | | + |___/ |_| |_| + +... + +*Usage* + Enter an instruction and press enter (%C reset conversation, %Q quits). + +*Examples* + - Write an email to grandma thanking her for the cookies. + - What are some historical attractions to visit around Massachusetts? + - Compute the nth fibonacci number in javascript. + - Write a standup comedy bit about WebGPU programming. + +> What are some outdoorsy places to visit around Boston? + +[ Reading prompt ] ..................... + + +**Boston Harbor and Islands:** + +* **Boston Harbor Islands National and State Park:** Explore pristine beaches, wildlife, and maritime history. +* **Charles River Esplanade:** Enjoy scenic views of the harbor and city skyline. +* **Boston Harbor Cruise Company:** Take a relaxing harbor cruise and admire the city from a different perspective. +* **Seaport Village:** Visit a charming waterfront area with shops, restaurants, and a seaport museum. + +**Forest and Nature:** + +* **Forest Park:** Hike through a scenic forest with diverse wildlife. +* **Quabbin Reservoir:** Enjoy boating, fishing, and hiking in a scenic setting. +* **Mount Forest:** Explore a mountain with breathtaking views of the city and surrounding landscape. + +... +``` + +### Usage as a Command Line Tool + +For using the `gemma` executable as a command line tool, it may be useful to +create an alias for gemma.cpp with arguments fully specified: + +```sh +alias gemma2b="~/gemma.cpp/build/gemma -- --tokenizer ~/gemma.cpp/build/tokenizer.spm --weights ~/gemma.cpp/build/gemma2-2b-it-sfp.sbs --verbosity 0" +``` + +Replace the above paths with your own paths to the model and tokenizer paths +from the download. + +Here is an example of prompting `gemma` with a truncated input +file (using a `gemma2b` alias like defined above): + +```sh +cat configs.h | tail -n 35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b +``` + +> [!NOTE] +> CLI usage of gemma.cpp is experimental and should take context length +> limitations into account. + +The output of the above command should look like: + +```sh +[ Reading prompt ] [...] +This C++ code snippet defines a set of **constants** used in a large language model (LLM) implementation, likely related to the **attention mechanism**. + +Let's break down the code: +[...] +``` + +### Incorporating gemma.cpp as a Library in your Project + +The easiest way to incorporate gemma.cpp in your own project is to pull in +gemma.cpp and dependencies using `FetchContent`. You can add the following to +your CMakeLists.txt: + +``` +include(FetchContent) + +FetchContent_Declare(sentencepiece GIT_REPOSITORY https://github.com/google/sentencepiece GIT_TAG 53de76561cfc149d3c01037f0595669ad32a5e7c) +FetchContent_MakeAvailable(sentencepiece) + +FetchContent_Declare(gemma GIT_REPOSITORY https://github.com/google/gemma.cpp GIT_TAG origin/main) +FetchContent_MakeAvailable(gemma) + +FetchContent_Declare(highway GIT_REPOSITORY https://github.com/google/highway.git GIT_TAG 2a16a50ff61071bb25ddef0ce35d92b0e2b9c579) +FetchContent_MakeAvailable(highway) +``` + +Note for the gemma.cpp `GIT_TAG`, you may replace `origin/main` for a specific +commit hash if you would like to pin the library version. + +After your executable is defined (substitute your executable name for +`[Executable Name]` below): + +``` +target_link_libraries([Executable Name] libgemma hwy hwy_contrib sentencepiece) +FetchContent_GetProperties(gemma) +FetchContent_GetProperties(sentencepiece) +target_include_directories([Executable Name] PRIVATE ${gemma_SOURCE_DIR}) +target_include_directories([Executable Name] PRIVATE ${sentencepiece_SOURCE_DIR}) +``` + +### Building gemma.cpp as a Library + +gemma.cpp can also be used as a library dependency in your own project. The +shared library artifact can be built by modifying the make invocation to build +the `libgemma` target instead of `gemma`. + +> [!NOTE] +> If you are using gemma.cpp in your own project with the `FetchContent` steps +> in the previous section, building the library is done automatically by `cmake` +> and this section can be skipped. + +First, run `cmake`: + +```sh +cmake -B build +``` + +Then, run `make` with the `libgemma` target: + +```sh +cd build +make -j [number of parallel threads to use] libgemma +``` + +If this is successful, you should now have a `libgemma` library file in the +`build/` directory. On Unix platforms, the filename is `libgemma.a`. + +## Independent Projects Using gemma.cpp + +Some independent projects using gemma.cpp: + +- [gemma-cpp-python - Python bindings](https://github.com/namtranase/gemma-cpp-python) +- [lua-cgemma - Lua bindings](https://github.com/ufownl/lua-cgemma) +- [Godot engine demo project](https://github.com/Rliop913/Gemma-godot-demo-project) + +If you would like to have your project included, feel free to get in touch or +submit a PR with a `README.md` edit. + +## Acknowledgements and Contacts + +gemma.cpp was started in fall 2023 by +[Austin Huang](mailto:austinvhuang@google.com) and +[Jan Wassenberg](mailto:janwas@google.com), and subsequently released February +2024 thanks to contributions from Phil Culliton, Paul Chang, and Dan Zheng. + +Griffin support was implemented in April 2024 thanks to contributions by Andrey +Mikhaylov, Eugene Kliuchnikov, Jan Wassenberg, Jyrki Alakuijala, Lode +Vandevenne, Luca Versari, Martin Bruse, Phil Culliton, Sami Boukortt, Thomas +Fischbacher and Zoltan Szabadka. It was removed in 2025-09. + +Gemma-2 support was implemented in June/July 2024 with the help of several +people. + +PaliGemma support was implemented in September 2024 with contributions from +Daniel Keysers. + +[Jan Wassenberg](mailto:janwas@google.com) has continued to contribute many +improvements, including major gains in efficiency, since the initial release. + +This is not an officially supported Google product. diff --git a/tooling/google-official/gemma-cpp/examples_README.md b/tooling/google-official/gemma-cpp/examples_README.md new file mode 100644 index 0000000..87eb54d --- /dev/null +++ b/tooling/google-official/gemma-cpp/examples_README.md @@ -0,0 +1,7 @@ +# Examples + +In this directory are some simple examples illustrating usage of `gemma.cpp` as +a library beyond the interactive `gemma` app implemented in `run.cc`. + +- `hello_world/` - minimal/template project for using `gemma.cpp` as a library. + It sets up the model state and generates text for a single hard coded prompt. diff --git a/tooling/google-official/gemma-pytorch/README.md b/tooling/google-official/gemma-pytorch/README.md new file mode 100644 index 0000000..20344c5 --- /dev/null +++ b/tooling/google-official/gemma-pytorch/README.md @@ -0,0 +1,186 @@ +# Gemma in PyTorch + +**Gemma** is a family of lightweight, state-of-the art open models built from research and technology used to create Google Gemini models. They include both text-only and multimodal decoder-only large language models, with open weights, pre-trained variants, and instruction-tuned variants. For more details, please check out the following links: + + * [Gemma on Google AI](https://ai.google.dev/gemma) + * [Gemma on Kaggle](https://www.kaggle.com/models/google/gemma-3) + * [Gemma on Vertex AI Model Garden](https://pantheon.corp.google.com/vertex-ai/publishers/google/model-garden/gemma3) + +This is the official PyTorch implementation of Gemma models. We provide model and inference implementations using both PyTorch and PyTorch/XLA, and support running inference on CPU, GPU and TPU. + +## Updates + + * [March 12th, 2025 🔥] Support Gemma v3. You can find the checkpoints [on Kaggle](https://www.kaggle.com/models/google/gemma-3/pytorch) and [Hugging Face](https://huggingface.co/models?other=gemma_torch) + + * [June 26th, 2024] Support Gemma v2. You can find the checkpoints [on Kaggle](https://www.kaggle.com/models/google/gemma-2/pytorch) and Hugging Face + + * [April 9th, 2024] Support CodeGemma. You can find the checkpoints [on Kaggle](https://www.kaggle.com/models/google/codegemma/pytorch) and [Hugging Face](https://huggingface.co/collections/google/codegemma-release-66152ac7b683e2667abdee11) + + * [April 5, 2024] Support Gemma v1.1. You can find the v1.1 checkpoints [on Kaggle](https://www.kaggle.com/models/google/gemma/frameworks/pyTorch) and [Hugging Face](https://huggingface.co/collections/google/gemma-release-65d5efbccdbb8c4202ec078b). + +## Download Gemma model checkpoint + +You can find the model checkpoints on Kaggle: + +- [Gemma 3](https://www.kaggle.com/models/google/gemma-3/pyTorch) +- [Gemma 2](https://www.kaggle.com/models/google/gemma-2/pyTorch) +- [Gemma](https://www.kaggle.com/models/google/gemma/pyTorch) + +Alternatively, you can find the model checkpoints on the Hugging Face Hub [here](https://huggingface.co/models?other=gemma_torch). To download the models, go the the model repository of the model of interest and click the `Files and versions` tab, and download the model and tokenizer files. For programmatic downloading, if you have `huggingface_hub` installed, you can also run: + +``` +huggingface-cli download google/gemma-3-4b-it-pytorch +``` + +The following model sizes are available: + +- **Gemma 3**: + - **Text only**: 1b + - **Multimodal**: 4b, 12b, 27b_v3 +- **Gemma 2**: + - **Text only**: 2b-v2, 9b, 27b +- **Gemma**: + - **Text only**: 2b, 7b + + +Note that you can choose between the 1B, 4B, 12B, and 27B variants. + +``` +VARIANT=<1b, 2b, 2b-v2, 4b, 7b, 9b, 12b, 27b, 27b_v3> +CKPT_PATH= +``` + +## Try it free on Colab + +Follow the steps at +[https://ai.google.dev/gemma/docs/pytorch_gemma](https://ai.google.dev/gemma/docs/pytorch_gemma). + +## Try it out with PyTorch + +Prerequisite: make sure you have setup docker permission properly as a non-root user. + +```bash +sudo usermod -aG docker $USER +newgrp docker +``` + +### Build the docker image. + +```bash +DOCKER_URI=gemma:${USER} + +docker build -f docker/Dockerfile ./ -t ${DOCKER_URI} +``` + +### Run Gemma inference on CPU. + +> NOTE: This is a multimodal example. Use a multimodal variant. + +```bash +docker run -t --rm \ + -v ${CKPT_PATH}:/tmp/ckpt \ + ${DOCKER_URI} \ + python scripts/run_multimodal.py \ + --ckpt=/tmp/ckpt \ + --variant="${VARIANT}" \ + # add `--quant` for the int8 quantized model. +``` + +### Run Gemma inference on GPU. + +> NOTE: This is a multimodal example. Use a multimodal variant. + +```bash +docker run -t --rm \ + --gpus all \ + -v ${CKPT_PATH}:/tmp/ckpt \ + ${DOCKER_URI} \ + python scripts/run_multimodal.py \ + --device=cuda \ + --ckpt=/tmp/ckpt \ + --variant="${VARIANT}" + # add `--quant` for the int8 quantized model. +``` + +## Try It out with PyTorch/XLA + +### Build the docker image (CPU, TPU). + +```bash +DOCKER_URI=gemma_xla:${USER} + +docker build -f docker/xla.Dockerfile ./ -t ${DOCKER_URI} +``` + +### Build the docker image (GPU). + +```bash +DOCKER_URI=gemma_xla_gpu:${USER} + +docker build -f docker/xla_gpu.Dockerfile ./ -t ${DOCKER_URI} +``` + +### Run Gemma inference on CPU. + +> NOTE: This is a multimodal example. Use a multimodal variant. + +```bash +docker run -t --rm \ + --shm-size 4gb \ + -e PJRT_DEVICE=CPU \ + -v ${CKPT_PATH}:/tmp/ckpt \ + ${DOCKER_URI} \ + python scripts/run_xla.py \ + --ckpt=/tmp/ckpt \ + --variant="${VARIANT}" \ + # add `--quant` for the int8 quantized model. +``` + +### Run Gemma inference on TPU. + +Note: be sure to use the docker container built from `xla.Dockerfile`. + +```bash +docker run -t --rm \ + --shm-size 4gb \ + -e PJRT_DEVICE=TPU \ + -v ${CKPT_PATH}:/tmp/ckpt \ + ${DOCKER_URI} \ + python scripts/run_xla.py \ + --ckpt=/tmp/ckpt \ + --variant="${VARIANT}" \ + # add `--quant` for the int8 quantized model. +``` + +### Run Gemma inference on GPU. + +Note: be sure to use the docker container built from `xla_gpu.Dockerfile`. + +```bash +docker run -t --rm --privileged \ + --shm-size=16g --net=host --gpus all \ + -e USE_CUDA=1 \ + -e PJRT_DEVICE=CUDA \ + -v ${CKPT_PATH}:/tmp/ckpt \ + ${DOCKER_URI} \ + python scripts/run_xla.py \ + --ckpt=/tmp/ckpt \ + --variant="${VARIANT}" \ + # add `--quant` for the int8 quantized model. +``` + +### Tokenizer Notes + +99 unused tokens are reserved in the pretrained tokenizer model to assist with more efficient training/fine-tuning. Unused tokens are in the string format of `` with token id range of `[7-104]`. + +``` +"": 7, +"": 8, +"": 9, +... +"": 104, +``` + +## Disclaimer + +This is not an officially supported Google product. diff --git a/tooling/google-official/gemma-pytorch/run.py b/tooling/google-official/gemma-pytorch/run.py new file mode 100644 index 0000000..e1f93e5 --- /dev/null +++ b/tooling/google-official/gemma-pytorch/run.py @@ -0,0 +1,107 @@ +# Copyright 2024 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. + + +import contextlib +import random + +import numpy as np +import torch +from absl import app, flags + +from gemma import config +from gemma import model as gemma_model + +# Define flags +FLAGS = flags.FLAGS + +flags.DEFINE_string('ckpt', None, 'Path to the checkpoint file.', required=True) +flags.DEFINE_string('variant', '4b', 'Model variant.') +flags.DEFINE_string('device', 'cpu', 'Device to run the model on.') +flags.DEFINE_integer('output_len', 10, 'Length of the output sequence.') +flags.DEFINE_integer('seed', 12345, 'Random seed.') +flags.DEFINE_boolean('quant', False, 'Whether to use quantization.') +flags.DEFINE_string('prompt', 'What are large language models?', 'Input prompt for the model.') + +# Define valid text only model variants +_VALID_MODEL_VARIANTS = ['2b', '2b-v2', '7b', '9b', '27b', '1b'] + +# Define valid devices +_VALID_DEVICES = ['cpu', 'cuda'] + +# Validator function for the 'variant' flag +def validate_variant(variant): + if variant not in _VALID_MODEL_VARIANTS: + raise ValueError(f'Invalid variant: {variant}. Valid variants are: {_VALID_MODEL_VARIANTS}') + return True + +# Validator function for the 'device' flag +def validate_device(device): + if device not in _VALID_DEVICES: + raise ValueError(f'Invalid device: {device}. Valid devices are: {_VALID_DEVICES}') + return True + +# Register the validator for the 'variant' flag +flags.register_validator('variant', validate_variant, message='Invalid model variant.') + +# Register the validator for the 'device' flag +flags.register_validator('device', validate_device, message='Invalid device.') + +@contextlib.contextmanager +def _set_default_tensor_type(dtype: torch.dtype): + """Sets the default torch dtype to the given dtype.""" + torch.set_default_dtype(dtype) + yield + torch.set_default_dtype(torch.float) + +def main(_): + # Construct the model config. + model_config = config.get_model_config(FLAGS.variant) + model_config.dtype = "float32" + model_config.quant = FLAGS.quant + + # Seed random. + random.seed(FLAGS.seed) + np.random.seed(FLAGS.seed) + torch.manual_seed(FLAGS.seed) + + # Create the model and load the weights. + device = torch.device(FLAGS.device) + with _set_default_tensor_type(model_config.get_dtype()): + model = gemma_model.GemmaForCausalLM(model_config) + model.load_weights(FLAGS.ckpt) + model = model.to(device).eval() + print("Model loading done") + + # Generate the response. + result = model.generate(FLAGS.prompt, device, output_len=FLAGS.output_len) + + # Print the prompts and results. + print('======================================') + print(f'PROMPT: {FLAGS.prompt}') + print(f'RESULT: {result}') + print('======================================') + +if __name__ == "__main__": + app.run(main) + + +# How to run this script: + +# Example command (replace with your actual paths and values): +# python scripts/run.py --device=cpu --ckpt=/path/to/your/pytorch_checkpoint/model.ckpt --output_len=2 --prompt="The name of the capital of Italy is" +# Important: +# - Replace '/path/to/your/pytorch_checkpoint/model.ckpt' with the actual path to your checkpoint file. +# - Choose the correct --variant (model size). +# - Use --device=cuda if you have a GPU; otherwise, use --device=cpu. \ No newline at end of file diff --git a/tooling/google-official/gemma-pytorch/run_multimodal.py b/tooling/google-official/gemma-pytorch/run_multimodal.py new file mode 100644 index 0000000..231e340 --- /dev/null +++ b/tooling/google-official/gemma-pytorch/run_multimodal.py @@ -0,0 +1,197 @@ +# Copyright 2024 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. + + +import contextlib +import random + +from absl import app +from absl import flags +import numpy as np +from PIL import Image +import torch + +from gemma import config +from gemma import gemma3_model + +# Define flags +FLAGS = flags.FLAGS + +_CKPT = flags.DEFINE_string( + 'ckpt', None, 'Path to the checkpoint file.', required=True +) +_VARIANT = flags.DEFINE_string('variant', '4b', 'Model variant.') +_DEVICE = flags.DEFINE_string('device', 'cpu', 'Device to run the model on.') +_OUTPUT_LEN = flags.DEFINE_integer( + 'output_len', 10, 'Length of the output sequence.' +) +_SEED = flags.DEFINE_integer('seed', 12345, 'Random seed.') +_QUANT = flags.DEFINE_boolean('quant', False, 'Whether to use quantization.') + +# Define valid multimodal model variants +_VALID_MODEL_VARIANTS = ['4b', '12b', '27b_v3'] + +# Define valid devices +_VALID_DEVICES = ['cpu', 'cuda'] + + +# Validator function for the 'variant' flag +def validate_variant(variant): + if variant not in _VALID_MODEL_VARIANTS: + raise ValueError( + f'Invalid variant: {variant}. Valid variants are:' + f' {_VALID_MODEL_VARIANTS}' + ) + return True + + +# Validator function for the 'device' flag +def validate_device(device): + if device not in _VALID_DEVICES: + raise ValueError( + f'Invalid device: {device}. Valid devices are: {_VALID_DEVICES}' + ) + return True + + +# Register the validator for the 'variant' flag +flags.register_validator( + 'variant', validate_variant, message='Invalid model variant.' +) + +# Register the validator for the 'device' flag +flags.register_validator('device', validate_device, message='Invalid device.') + + +@contextlib.contextmanager +def _set_default_tensor_type(dtype: torch.dtype): + """Sets the default torch dtype to the given dtype.""" + torch.set_default_dtype(dtype) + yield + torch.set_default_dtype(torch.float) + + +def main(_): + # Construct the model config. + model_config = config.get_model_config(_VARIANT.value) + model_config.dtype = 'float32' + model_config.quant = _QUANT.value + image_paths = {"cow_in_beach": "scripts/images/cow_in_beach.jpg", + "lilly": "scripts/images/lilly.jpg", + "sunflower": "scripts/images/sunflower.JPG", + 'golden_test_image': ( + 'scripts/images/test_image.jpg' + ), + } + + image = {} + for key in image_paths: + try: + image[key] = Image.open(image_paths[key]) # Open local file + image[key].show() + except IOError as e: + print(f"Error loading image: {e}") + exit() + + # Seed random. + random.seed(_SEED.value) + np.random.seed(_SEED.value) + torch.manual_seed(_SEED.value) + + # Create the model and load the weights. + device = torch.device(_DEVICE.value) + with _set_default_tensor_type(model_config.get_dtype()): + model = gemma3_model.Gemma3ForMultimodalLM(model_config) + model.load_state_dict(torch.load(_CKPT.value)['model_state_dict']) + # model.load_weights(_CKPT.value) + model = model.to(device).eval() + print('Model loading done') + + # Generate text only. + result = model.generate( + [ + [ + 'user The capital of Italy' + ' is?\nmodel' + ], + [ + 'user What is your' + ' purpose?\nmodel' + ], + ], + device, + output_len=_OUTPUT_LEN.value, + ) + + # Print the results. + print('======================================') + print(f'Text only RESULT: {result}') + print('======================================') + + # Generate golden Gemax test image. + result = model.generate( + [[ + 'user\n', + image['golden_test_image'], + 'Caption this image. \nmodel', + ]], + device, + output_len=_OUTPUT_LEN.value, + ) + + # Print the result. + print('======================================') + print(f'Golden test image RESULT: {result}') + print('======================================') + + # Generate text and image. + result = model.generate( + [[ + 'user\n', + image['cow_in_beach'], + ( + 'The name of the animal in the image is' + ' \nmodel' + ), + ]], + device, + output_len=_OUTPUT_LEN.value, + ) + + # Print the result. + print('======================================') + print(f'Single image RESULT: {result}') + print('======================================') + + # Generate interleave text and multiple images. + result = model.generate( + [[ + 'user\nThis image', + image['lilly'], + 'and this image', + image['sunflower'], + 'are similar because? \nmodel', + ]], + device, + output_len=_OUTPUT_LEN.value, + ) + + # Print the result. + print('======================================') + print(f'Interleave images RESULT: {result}') + print('======================================') + + +if __name__ == '__main__': + app.run(main) diff --git a/tooling/google-official/gemma-pytorch/run_xla.py b/tooling/google-official/gemma-pytorch/run_xla.py new file mode 100644 index 0000000..1881e63 --- /dev/null +++ b/tooling/google-official/gemma-pytorch/run_xla.py @@ -0,0 +1,267 @@ +# Copyright 2024 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. +import argparse +import contextlib +import os +import random +import socket +import sys +from typing import List, Union + +import numpy as np +import torch +import torch.multiprocessing + +from gemma.config import GemmaConfig, get_model_config +from gemma.model_xla import GemmaForCausalLM +from gemma.tokenizer import Tokenizer +import gemma.xla_model_parallel as xla_model_parallel + +USE_CUDA = os.environ.get('USE_CUDA', False) +if not USE_CUDA: + import torch_xla.core.xla_model as xm + import torch_xla.distributed.xla_multiprocessing as xmp +else: + # Choose an available port. + with contextlib.closing(socket.socket(socket.AF_INET, + socket.SOCK_STREAM)) as s: + s.bind(('', 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + MASTER_PORT = str(s.getsockname()[1]) + + +@contextlib.contextmanager +def _set_default_tensor_type(dtype: torch.dtype): + """Sets the default torch dtype to the given dtype.""" + torch.set_default_dtype(dtype) + yield + torch.set_default_dtype(torch.float) + + +def generate( + i: int, + model_config: GemmaConfig, + ckpt_path: str, + prompts: List[str], + output_lens: List[int], + temperatures: Union[List[float], None], + top_ps: List[float], + top_ks: List[int], + seed: int +): + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + if USE_CUDA: + os.environ['MASTER_ADDR'] = '127.0.0.1' + os.environ['MASTER_PORT'] = MASTER_PORT + if not torch.distributed.is_initialized(): + torch.distributed.init_process_group( + "nccl", + rank=int(os.environ.get("RANK", 0)), + world_size=int(os.environ.get("WORLD_SIZE", 1))) + xla_model_parallel.set_g_group() + local_rank = int(os.environ.get("LOCAL_RANK", 0)) + device = torch.device("cuda", local_rank) + torch.cuda.set_device(local_rank) + else: + device = xm.xla_device() + xm.set_rng_state(seed, device) + + rank = xla_model_parallel.get_model_parallel_rank() + world_size = xla_model_parallel.get_model_parallel_world_size() + if rank > 0: + sys.stdout = open(os.devnull, 'w') + + # build, load and compile model. + with _set_default_tensor_type(model_config.get_dtype()): + model = GemmaForCausalLM(model_config, world_size, rank, device) + model.load_weights(ckpt_path) + model = model.to(device).eval() + + # create tokenizer. + tokenizer = Tokenizer(model_config.tokenizer) + + prompt_tokens = [tokenizer.encode(prompt) for prompt in prompts] + min_prompt_len = min(len(p) for p in prompt_tokens) + + batch_size = len(prompts) + if temperatures is not None: + assert batch_size == len(temperatures) + assert batch_size == len(top_ps) + assert batch_size == len(top_ks) + max_seq_len = max([len(p) + o for p, o in zip(prompt_tokens, output_lens)]) + assert max_seq_len <= model_config.max_position_embeddings + if model_config.num_key_value_heads < world_size: + assert world_size % model_config.num_key_value_heads == 0 + n_local_heads = 1 + else: + assert model_config.num_key_value_heads % world_size == 0 + n_local_heads = model_config.num_key_value_heads // world_size + + # build KV caches + kv_caches = [] + for _ in range(model_config.num_hidden_layers): + k_cache = torch.zeros( + size=(batch_size, max_seq_len, n_local_heads, + model_config.head_dim), + dtype=model_config.get_dtype(), + device=device, + ) + v_cache = torch.zeros( + size=(batch_size, max_seq_len, n_local_heads, + model_config.head_dim), + dtype=model_config.get_dtype(), + device=device, + ) + kv_caches.append((k_cache, v_cache)) + + # prepare inputs + token_ids_tensor = torch.full((batch_size, max_seq_len), + tokenizer.pad_id, + dtype=torch.int64) + input_token_ids_tensor = torch.full((batch_size, min_prompt_len), + tokenizer.pad_id, + dtype=torch.int64) + for i, p in enumerate(prompt_tokens): + token_ids_tensor[i, :len(p)] = torch.tensor(p) + input_token_ids_tensor[i, :min_prompt_len] = torch.tensor( + p[:min_prompt_len]) + token_ids_tensor = token_ids_tensor.to(device) + prompt_mask_tensor = token_ids_tensor != tokenizer.pad_id + input_token_ids_tensor = input_token_ids_tensor.to(device) + input_positions_tensor = torch.arange(0, min_prompt_len, + dtype=torch.int64).to(device) + mask_tensor = torch.full((1, 1, max_seq_len, max_seq_len), + -2.3819763e38).to(torch.float) + mask_tensor = torch.triu(mask_tensor, diagonal=1).to(device) + curr_mask_tensor = mask_tensor.index_select(2, input_positions_tensor) + output_positions_tensor = torch.LongTensor([min_prompt_len - 1]).to(device) + temperatures_tensor = None if not temperatures else torch.FloatTensor(temperatures).to(device) + top_ps_tensor = torch.FloatTensor(top_ps).to(device) + top_ks_tensor = torch.LongTensor(top_ks).to(device) + output_index = torch.tensor(min_prompt_len, dtype=torch.int64).to(device) + if not USE_CUDA: + xm.mark_step() + + # Prefill up to min_prompt_len tokens, then treat other prefill as decode and ignore output. + for i in range(max_seq_len - min_prompt_len): + next_token_ids, _ = model( + input_token_ids=input_token_ids_tensor, + input_positions=input_positions_tensor, + kv_write_indices=None, + kv_caches=kv_caches, + mask=curr_mask_tensor, + output_positions=output_positions_tensor, + temperatures=temperatures_tensor, + top_ps=top_ps_tensor, + top_ks=top_ks_tensor, + ) + curr_prompt_mask = prompt_mask_tensor.index_select( + 1, output_index).squeeze(dim=1) + curr_token_ids = token_ids_tensor.index_select( + 1, output_index).squeeze(dim=1) + output_token_ids = torch.where(curr_prompt_mask, curr_token_ids, + next_token_ids).unsqueeze(dim=1) + token_ids_tensor.index_copy_(1, output_index, output_token_ids) + + input_token_ids_tensor = output_token_ids + input_positions_tensor = output_index.unsqueeze(dim=-1) + curr_mask_tensor = mask_tensor.index_select(2, input_positions_tensor) + output_positions_tensor = torch.tensor(0, dtype=torch.int64).to(device) + output_index = output_index + 1 + if not USE_CUDA: + xm.mark_step() + + # Detokenization. + token_ids = token_ids_tensor.tolist() + results = [] + for i, tokens in enumerate(token_ids): + trimmed_output = tokens[len(prompt_tokens[i]):len(prompt_tokens[i]) + + output_lens[i]] + if tokenizer.eos_id in trimmed_output: + eos_index = trimmed_output.index(tokenizer.eos_id) + trimmed_output = trimmed_output[:eos_index] + results.append(tokenizer.decode(trimmed_output)) + + for prompt, result in zip(prompts, results): + print('======================================') + print(f'PROMPT: {prompt}') + print(f'RESULT: {result}') + print('======================================') + + +def main(args): + model_config = get_model_config(args.variant) + model_config.quant = args.quant + + prompts = [args.prompt] + n = len(prompts) + output_lengths = [args.output_len] * n + temperatures = [0.95] * n + top_ps = [1.0] * n + top_ks = [100] * n + + if USE_CUDA: + os.environ['MASTER_ADDR'] = '127.0.0.1' + os.environ['MASTER_PORT'] = MASTER_PORT + if not torch.distributed.is_initialized(): + torch.distributed.init_process_group( + "nccl", + rank=int(os.environ.get("RANK", 0)), + world_size=int(os.environ.get("WORLD_SIZE", 1))) + xla_model_parallel.set_g_group() + torch.multiprocessing.spawn( + generate, + args=( + model_config, + args.ckpt, + prompts, + output_lengths, + temperatures, + top_ps, + top_ks, + args.seed, + ), + ) + else: + xmp.spawn( + generate, + args=( + model_config, + args.ckpt, + prompts, + output_lengths, + temperatures, + top_ps, + top_ks, + args.seed, + ), + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--ckpt", type=str, required=True) + parser.add_argument("--variant", + type=str, + default="2b", + choices=["2b", "2b-v2", "7b", "9b", "27b"]) + parser.add_argument("--output_len", type=int, default=4) + parser.add_argument("--seed", type=int, default=12345) + parser.add_argument("--quant", action='store_true') + parser.add_argument("--prompt", type=str, default="The meaning of life is") + args = parser.parse_args() + + main(args) diff --git a/tooling/google-official/tech-report/Gemma3Report.pdf b/tooling/google-official/tech-report/Gemma3Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2339e4429c018fa5bec48c32211844ff9ae166d2 GIT binary patch literal 3699196 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 Y`WZf$ktE;`nu<21Y2wb5!?DuG|5wML4czovm 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

FXFX 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 fL*8DOd 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

-CO7TcRF+Cjm2E@U%&h~`e}99 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±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

b2Ji`(WZA&#z=V)&dDRsAHd+9>T42sp=?rqQCr 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%0DY#oZEPC0<7sRkek(hC;#aHU&sQ&(?ohS+ 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

&yPlMZa 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 z

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 @K2-g&~DKIVS*FZoP6wjkK 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

L1rvy7z&@Br)I+HQ3FOss{z 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%0ASd6^B+HG2IrHmz9&N+@$w5G&2a&JsJ4t%q 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

rR9|COKdkH@TK9k;B8@d9a^`oErO!@ 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

VTXx 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ξ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


xl>(hyinE{WE+o=^yStkne5};1jy>NM5OE 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 z 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�Q5b9v@XF8fW-{~^#aE$2YrJso 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%0D4LMe5IF&8+7t4sv|W9R+S9K6n75VxQI5#Y&3o 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

=~iPtfsJ<6bgl%JME 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

?7vDnJ0M@z z$2w3Y1uyFLcPQHWF{%zxj$ku6jneUKEZewZ%7a+m{d@NKC%6R>KhPikX1>d>sYw^I zt~W2M_poUpPW67A!nN^{vDRA@)S)wLUd@uun$^W2XFLeCPc4DTIfG0l_v{GKhlI3AD%2U5G(J9nZ1CyQk_L^krqggQTE=_8aiu5y{&T$-BRj zckuXtlXIY00FB;jr(#o*WGjp!krUM>|{8+p)W9V~Bs;pc* zmVja1WH{&ER?kWe16KIYUjAT_UBd9vZ?yq~JjqGsuj+(dXmAL01>Kz_iw~bw4zRjo z;i5TKhF@LzWYCN-dV{q>;8}k8Z_}TYrk1w0E3hwQR32UWm5xz3a%p_syWDsm<$u?H zm<(${oD&MRZ+V*1`$K2M@O5NQSUTBn1WO;;3NtzYRJ$0at0IZ?!B2d$|Cu|1{_*9N zgR6z0H$xZrg)qV1&EfPF9r<$H3-TYbKC)AVmLyM<>X7t_-^o(698?cb9A~f7#Hfh!ylX7RJqA_ncqD*6)3<6hm8ukwzT#Q5O$JU;>q-%vJ`dq`zgg zDI*&rW?KM=V^XoX2DkGy$JDn}6QQ40R@_Do2U!NSK4_A{o+mKEVdB0NpDfpR(#${H z_3g|W=b{suSoZ1-sc(aa#C&~xfba|jNg4`087tM-dirmZOVFZ~mzR*3mc-73*_EUg)PDE^lE`Yv?Y{(MY4MWpIV$xx4~ijs}Hp zm{*0}NmRE=zx~*ZOA&UMsHb-HPO0SK>&h7pTfU>z9E;v40JFic)Bbgf-{sNbVAOwS zdtgy#1hQW=+$J_Q>_TPmYb!_oH7@;aA_m7wNngGPUvu8FzXSSa9ibw_2AEkaF4EPo z+6a$Zukk?3+f=#(FmA*!ph-mLt5ya-hFAU#uzhKqrrd)4*Pu?jVnE9Q}-ibtPeDpqZykem6! zo9{Uj0ZyO3mg&ZpG>-5@#f(Ex(5{C6ez#yrG5PLM_MsZXETDbk_d$ zk6K(54ag=`1o*Hn{Q~^_Zh#{s820Z#5mbp$(a_ch(;0{`03!xQkRgFk1BLU&6d_Bp zZM_dYqSjjWdePK!x%U9oF(2Fwe0YH)NoeVwSJhULpF%agK2&7i&cG5+Sb`D9Nrdr6 zASp_Ofcixo4WmQq)$bnDrl7mW%n9ASMO$Q9@+ownO4;Z%S5Jl1*jaEbVjMfMo%8#+ zA17;1Q0hEgJvev^5I&GbtG#=edEOJc|MzZwlp%}#0TNE;EVsUnZ9P5AFpl}vtHQCf z9pSD()I_|?+IhpAo%esJx(c=`yQXWQBA_S&5+WttDV>6}(%s$Np&}yPUDDFsCDJ0@ z-Cc@=fWS9^&wE|p`2pwbv+sS+UbAM+8ns|Tya6dWd4jgBqFzOn&$Y3pt|Le;#=pd^ z7uesd&jEbyZ=ud2KHLtIA{1^FJn3$6b75oK$08Ef4zDJkY7yOZYgy{27ZZ_Ic8|-t zN!oKQTXy{Dmk6!Uaz59n?CVpqyDqn3CL`AZAj$-jlCjqhFE{Zmxv;bIF{sQwcz`Rv zxX*~Vm}h8pV8wm%(UHe4v=vN-g&w|1y86xx*56wtHQT9J6zOK3IBO4-%05)88%1g| z9!d#O8I0?K2dx>^`f69SJui;fnnQ`b4Z^2OPRG%Jxby7+Y(iGS(irx{_|o76(xOpk zt8wJ;$K%sPtfia3^Ivl4T4AMm;6HKEKqPSGPFk*m9&9oyDnaV2=bS+Xs_ms;j;b`Q zl$1FQ4IbIGrphGEdZAtudQ^UXKd%5T(!u(@(fUQ7zy2f<4;$aL;!&r?Re5-%Aw<=A z?a#4?COiOK%bvAI%n_t|>bp7m3Zs6R5{dP%!{UNNM}(iaBwlKT_b4J?MsHBev;cHO zew&@-?a;JSlVB1uHPUQ|YV+R=*dT79P5>!cZ_me0pG5!X^zrD?f!+YnbnLAd>B zfJh$QMZ@GgKg1~ww)1PYh*&>EM>>-3?-SkWPKcRn7Sjg=RqhewWLiIx*__^vp4<~% zZ>7SjO~Va{Y{X)qOZt?W6xUSyaIK|%atbpp4yF6E1h%mGE(JLVt&>G|fL!?a@#AZ_ z(&6)#JU~82t;{&W;4^qX{tkCJy=S&FT!MXo-gc5i?q^Kz*Yk`aB=N`OEXGkC3^9=0?g^8Tb`rfU? zR~fxTFM9v9iCeK9%~I3)7d$WNNZ=6Edz*@M^xE#;x4E#ewvJ;~kx>h`rFohJf%}{K zDJjtumgN888eXabNK#(?Z?+y%V1JpmN@V% z>J>Z$0THm%?SC&{aNhPpJD9SN)H7#kn8E?VXY`r(1I(^GEesZv6Gj#fRj~7|#BaYR zxW*kN)cG^iy7lpeSslCM*Xj%C$W`~~-AX^G1A?*z~f8t=R8)Cn_A|M}yXC(n^S z<0m`yyAP38=&KoLdSpBMo8cqp8v+t_`r@Z}J?Jo+{OZyI~wXgErP zWSIfjDT?S2Bj^!%avW^q7kD2*Xg?=mbMO^Gr|%-kMJVfECLMXtu0)xif2`po7c~4# zuDB;^)zhe+$?Fk+fY3sbO%$z0{>Vni*5wq-x531a(g59c;~hRZc~(h@jc7wuvX+Ch zk4_cq1e1roN~XDhL$JkAzdl;pr?$aer4duSqNKx_Hmv1tGzo-K}%HzxAmD@ z3d^@XuTT8Kf@6!{pBFFPWH?9HsH%L}K&rwLY@*Sp6G6}Q&B5Lu@;7(u?dUKMcPr}r z)gvW%z+Q#|e@M#JY1|ge1Z5O@9(N+1oSc*t7r(&0AJjHcW`fD!dbv*2@x6lsZoDrl zGBRk`7T+)6+j7fvm&tt=A5q-O(}7Hfso@Ugw!!_;8QkM#qPFQaOUK24yR_ovb{4^l zkm(M**~JJA7pi|D#_jC=!>t2|y!Q$n`4T_2RK!IPbhcWf_Ka5kepem}3&X&U9Y@7& zP=8Z)D4eMhwY{sYOCyoACqEJ{_IJ|U0qh|l(}nu-;LJ=A^0Uk3ec-gNas^2}(;Z2e zU20;26muv?zO!qrIC%x$?(se=M_hXjDg^qjW54ICR0N)JSi4-Vk51wbSPOy}Z5Hdx$!cF} zu#<+TfH_~H8REuvI2%s7!S;qq0NJS9^PH|24b>Cf1$kidyQ+Ix|5SGg?H*+kZ&sM9 zRTg4)^m(RbJPb7dlBFy(|ET>J(c;z;_vH9yz+G!c9yH9hL1y~<;>%hSu_|(z&b#*h zDGcOAhXma2G6}^lhhF*z>f5`ooQy-<3`eNe9jTv0#HuLcioap&1O?;vZ{U1V^&D&^Q-${^q#CZx7sv>#7)mV}|W4*}u-f=0x<{ zx^BI~Kac<$4R?y1=vWIqGOWg-<7`UT=>x3LK|Yv~G#YYBlm)9$6&s-5h5WG(W=PUb zA4pUA*|(3bunAkNi~F01X4-ptdO}+rbgwYEB`}*{w65H^*u}SNKI#P;g__s9d{a|W zj7?0Y%pE?}@f`>HZm>_YFSaOF)kUdbGjWljyXoE-WGVfugz4P6(6+2QKi^SoNn2a9 zZxOmD{-U~(vMl72UwgoY?jc68V`Kre_3l_O#4d{&978c6J7R+}#EluX2YCCE8e(>2q-<*@<`j{lZ<F&`!Ru_A=-3BNcpQ?W%_R zGvK{{JOk4PzbUH(nqEkmSl!QS3N-jui1pJ#7n<%z6E%wKT>9SK4FMNMfI!>dGdw(@ z>3=z@4jz~D9#D5q_9B$Dv=8dk`dephQD&ryeoR1#UeI^6-!edl0TuI}_&L)C$W;@veQxT^aXx8*f^GiDjfy4Bkg#OGTpT6%*rd0J9goo) z%ON34urcYX+y%80yU*kmDO^lK%iQ{oj+K>_qm0~#U|NZ?b<%#dV~#Aq=tGs+s2djz zjVP)!vq`1=0$B|g(MHK{n}~m}Xq4hDp?T~t95O9QlXz$@Zn9`Et$tH@#00aV^8I9u zF!z|ibo7bgu<1ILA#Y9Bk2GPqEw(tglE#N3>_C_mKwJ<#St~+V5t44> zsyFxXG_tngqpQ_Nkse)T>KD;B37w1ca^;elSzlk}?c5tUpT2ZYjxcT|vr*-gl`#_# zydy~m-M@&I7D2J?)lQMj`q9>Z3Jipo5s(TLePL-2P-+Hzw>pV%#ztPZS!^&llYW=F zcyyU7IVy;PTdoy07%)hePX)w(azpMWSFkD zLpox+S{vGeea%Hj)+L~4U}Q{?T-kHl`H%ZT$=$IDpF)rAVkr%hJVR-aV%d;hLLYjP zH}&a3^Y=l!%INUYkfWTL~kAjIn8nQY6<1gSUwteK0wXOb(@r!4riUZC&G)Z z%o&B@^bWI%D7Uew)T)jmq!R5IZ94m6H||7;a@18T7;ZIYyk8e4s9oZdk_vi7Jb(HQ zx<~QZ?p!@y6qw=&S~uU8vY+3$>$!RBgH6}4I7fOQbFS%dlN>+9>N+c%xCBX;xmg(K9b{wk*O5)J4|JubEP zL&`}q#c4vl-Oh255Ld}ek3}SH5=8U|+u54Ly&{Z?e<3vOW~1wz7o<8l(q#A~<_lRy z^}8Y+p{{VO65a?6RTDzGX}3vCv#YFK%SEL(KA<0|@3yePr-?YGIbgXGr+PuXWK=N` z5_WmZUz<%xS5m4nn_!830}ZubhSrUqylW(=!0##7jf!_GvpaZKKXi9NyV&8>yoe-y zN$2j(z1sSGafySiy>G$(f4JB@KDNi!O$+9}lD1rZb+oM(nlQ1(BO*?9+R@%~b7Nj! zR74z?&G}QV+mr$Z&CvIw#Z^8Mf)JzE^sDJf?{zSw1re~RJ^%c1)}>+fc4~_2JFTH* zVa3U4d7KL~q%WYJYdy%lt*dayUR-Tw&oznc0<{{U-^ScY7G=tr2B_@ScR)nZ#8OOM zgRv9-GF^$D6_RWkXER@3foSUsODpz$@0P`?!q{BzYpSPW?$YXdAujDnQSu5$P z3Hq?D>5FZk8SK2#pW8hhSd=GE?Q37MHX3(=UfS^R$BT1Ui{)gzb07DWxcK7lBO@at zVC@H3?o$h`B>GW9%Z)=IS#!h|nHsF|o{-GQblcqzL{n*-5}joQXnebW;xhW4kyy58 zx0rgMyAiwn)!l4hNh~rYMo3>gFe`RwYwx`|Q&qW>N4O%%XhfLN@`1>hLc(k)y6tJn z>(|oW^houQwN)!&1+~%r4UU=qaZSj`_oc!FH~LbAA@D%@26-IJXKMd?Mb$at0XYJC z3qiEa4<9~&JKWjXnGw#tiU~EHb@DHF2kjB|^t9bF;4D%X-d>D+hnHe^PZ8>~?= zBrfT;+_J5?7vg;wW_OTvP->h+_LaFK^#3Q} znKMLeq(?%beo`_E==m2kK~Gs9jJ!Ye7|Ukfm#A2N2Z9g~)x;XtAFt2J8nh7jd*j!h>5NIyu9?a=MoIS%4*U*3D&(t(AVgEps5y*!`^>+0;nhEp07$=HlsrcLxVZQ0Bi&=!vKUmePi0vX(>B~+vN zYkX07M3WTHE;(F4s6~6c&PI}$E};4=HKPxNx+oGSh}*Pp!tKJmsrkWr*5-l z^EAC?=^N+7Y_BaYb1w|j#KaUH=xlFqFD_xt zc78jfzTL!g+{$UK3n^UBAmtNe3dE|As-u=Nsl*5L`i&3zV~^`UF?_Jlj(gNAtiBLk z?R-1a;E^6n+>vYjYci<$l6299$X#vREYaaEc%&=>rahIEkTA2b5Ekcrq1JRLL-o77 zcxsPWTkK}uEb=WHU!IS2%{DLfA_6dQRBb<%6_`N9&F$rK!zPc+;V|{?PXe~upxUZl zZx6jLX-GklrM@zieH%s+iHS*+_Mr+43#3Oni)xvEmSC<{+zDkX?*gNJ`H|ADgiU)F zFbU_ypS64ex3>@j;^n5j-FX5IbA_7kNKe5(U}|dWQ-@CO!P!EE-KJPo#0hrTuGvpH z5`}enhHcc__jzn|2beg@zj!L1RAb*f+AM7FrW3E8202H(rgZ=6M56)rx8m`5bms4Z z?yX@44YF?tTB-ghkA)soJfN(N{U)2b8rw}SV_;z5>|C8Gq6vaQ0Re$mL{}&NCrJFb zt}bVA@NVz!-rm>{5EmknJ9M?>Z>i6nuoa~au}i^CoP77CU+5_h+o6boXH>Wh?Z~&6 z-nB2{v(t1Zyk$E6zv|*v(yZ+h4w;GGZ|M3wPOZQ#Es1hzuY^4 zF&*mdKYsjZZWfFchs(Hg$(q3B*5y8ZeE{knEJpoaPEHmU7Ft>hP0efcSSWde{k~hJ z#yUzfU1MZi?kbsmIsz#o_H4%M%((8$VKl-}SV;YTE$ZejaQ{?A7MbJRnS_v?&5$Y- z(9QF=js^yq9^=L^c&P^yy6;l8q3aH@l%k5iI!IUc?`AyQ*UA-M1|Ge#h1G#0(}gh` zuzgq8{^rL6AR`@YZSgJst~RjO@^7!KKo8N}AaY*|hrOz1j< zQR(B{`zi9&)Nq5kz}R;su*67NS-+?n{i#2y$>EP>;=Vq<#rbXzug%Hk$@-4RVoyvk zxj(Ow=#@N|ll`+8L;a34`^y_;vq~_liby|q_topWk99IUsZ(J~ay#M6xr3!;AxMWv zNIsGTgPyM(1}k12v1{%^Bw=~b`n|jewVsHG2=fXYdZ$NqLv}xnDNj-?x*AE|_}tt| z4WmR`Bd3YtHgbEd=kr{-?k2%|#h7Yoy|-%rPq(01(y%s;J+9x`4!%aF7;Pf75$!*a z%XxmAX)vj!j^LSUH{^P_N>j_}47_{z(c8Q8`**|sS2Arc{V<@$+8Ait~oW%@W!{apAwncJ3r*&&KX3wd}G25GQy8>IN4sn zqY|(&NgXnN7>u~OidTzkfUKj2PBTsJCt9MsS!he5v@RbS`G#rx?)T#FLVv1z{{(Jt z#nm%g^SH)|Na_tbf567xT8b3aUATV}Q!mQ66q$c{Y&TE&YG-#3u+KI3+MWn%|0jUfg#*au{DhpMJp8hG_Kf&}@3 zNW+Uk0;aN9q5Zo_dm{5yDf8Ck=2{>BPNsHF)_CI!q~2+H968)()t|&Eoc`(FV`H@A z3b#5T=rvS$`cqqXJCYIGN$f#rJpJmvGhUFeOf!eWwktT}{I`Ne&xx(+ax)ce?G#@8 zSE8cDW2T=vScP&cuLN-E^V6NwDA;>}lI~sVq$W$xmpIpAnn^Msp_#SUZ?~|qUE2{3 zCZNch{#BYh^LKIbV+M<3RlU4duFY>F<`V?x{dXCYzV`k<+#cl&fsWtE`Uwt>3-|%u z`gbxlbsQc4bg|9=^n+S5HFaKU>P`A1q2oIr7Z~oIOt3YviqW=Uk5i34H41&X=_Y4K zai8b6kq$*1$bb;F(?n<3t5HO6IaT+V3^6R+KhBuHR}9gpd5%Bal|oKs$DqO%xF3WG z?3Dgox6`IqMv2XHmKV)eKY}}#>cKK%ln3+jNxYqHUb60rVQgc3%}PX+T2X;XujN^% zGrM_{>*UyK49`iMMF4lTFIHE{tUH?>T_Kt)KOr6!O&ARHw zJ58u=0h#yT>%u2yV6Z}2P)qpu9{5kd=~bn{)c*G9k^@3H;kRzGlCx5~V{EChw*j;_ z0{OgEUPP&XicrM$`t3a~&V!x3h}0Sn(r+AGb*eG^NrV(n4nKs2N79-NCex0r%$Nu_ zK>lK_L3Hxm@gm*z?i`kCS+ms#gCSz#-Vc_bpQ&uVDiHAg)G1R2rNT>_KVY8s{{0PG zy~4IF`xW`phN>AqH^uvE0~DooU)r=vc-`6Qn!W0=tAZ6i{FG$G>|<_hNriin2Jc8X zegEkNv!G!QQH$b>`-kf{(4Z8CkKqTMM@AHXfT;mV%zqJ!oDa&4AaOS$d4`S-JR%FH z|Bm0&tT zsWu|KWzXLJV=r8R`S~tmA)=0^USV}U2{uuAVVyO0`5R|~@!8ep_DKs(M@L1%klyB? z3=c~ATtj2y3pwz`C)yek`yAQPw>DlbJaUSkf5Tqq@R=w15 zSN8VcRFIV=X^FsZ$STaxX|kfF3C-t7AAcyWj7j?A;o+>S{z0f;f|>1-GGz_}?v7RwkS8S9 zeGxw{?c`GBlh@0;7gllVpx~9hV;vuIy5CzU(NAgB8o14uhO16Y>dckYlgS1?Glx)0 z^!~RmsMsL3dcghXZPOeS?O@!rU(5Sw&Ieaq$)?-X)0H@r$7)|T+^TKd%ml0NpI zzFeeY%Ii4IJn!W{UIH#jR`xU>sXvUrl~+jp9vmWbQ2LwK_seI=VUUP?ikJ~vZZ!xU zap)YQjXG&C9f~~;)_3%3)C5@?Q=?x{&`g~R>qptEhlDDMeE)tvz@4@QCvml$A>U|D z1y1it*CMkH8n%;+)RG5#c|yq7e{Ovhm-AyLZJ0N5zfVh^nIdFVYEL9ja8LzFd9gjY z3a!JIGzr&DE2QT@bb)GERqLQqd3eKFK%^9bXW78 zaJlv*7GDAudTQ1N>16t*X+(03kvZ*M-}bWv-Nu{+oT|N*6Nf%vI|x;iOEzN0!xKoI z#$V#*Gbse0eL1YB81tFHFv1I5jo zH!lVOoIm(Fm_P+MmkYD*i~0;(3aUbR>iXdkO2a|Da}^7KPNoXsV8Z-t87-5v*EUC+ zZsMNOu73qP-rdwYAzb6Z(qcG8^mN%0FwtrD#ePmpzG5`9UHW4lF5DZ3(+&Si&uXyy zuhKI*hC?N~xGp@7D7fiB3=hHXzwkyN4*sJMT%W~NBRAob^aM?8(d2J9ZUn!tE2!DA z_7lHJ+xM*BFs3#o_J!neW%q;As>;uzW2Sta=43{D!v2OIWM%SOmG%KG*F@-XLi8;YNASv)(Kf4_XEO^(@@W)Zo^f5>=$w2BkY z0wxpKhY0oK0{^sJ`AW z#p4NLmQ~7OP^?C!xsXi{>8}UNQj%1nqP2AP>SYZ4e4f(3SsqpW$_q)8q!O_>vgj09AW1<^C-d6KHa9t&K|-Pwwds6Yu4h zYRHBgCL4n?*7_z3!^p4)PfM|(xBqFs{bpo$v!?F$Z|#yXyooA!)|OSM(*OQGEhOKN zHyxPfUzZudyx;~xsi7iPnCrSmRA3`6^qzYBlp?2#+-y*9IZ~<@ExNsjj4aDD;<2LJ zVb8hojnnyO9*nJhb$^HIe3Ev@<6Ax%f2GYOi=&3MAl7E8EBZ)?cRmu+y~lN$O{jhS zZ<^rqz_L4amExdxE0diH5T89Nn%IH~ub?F(F@5;(Au#3ty&ePc;EOn-?jk|<*cqnA zX#7NwcRBwx!G0k3^SfJs2m;Fs@3W}BaW%C9Npy5c&8^)~>+ckckiyNqPetMi;u_7a z2-ROP+Z||VK#P6dBTumnXg_X+edl^2Zo=vE4z-I?|4x$FqUoE zAO1TT*U~{P0>*(s9Cljk$9J=;Pg2n+4$yyP$gJN}B8~s>_LYGlZI0<8>5AkmGibXN zhO{1(U3*de%zRQtdirM?g>kr)jct&tz58V5plIAfIUX^K?X)CWxCfebte+40vY=)7 z-BAZ&a`RLqiVvWLc{;%{QYn|k8Ex`{qSf0d0+ZDyEr5SHpP z`_m}W#`YOU^@w>3zVo|N3g!({;C(vQ(6FlDBDAUs=YFJ-{&|!y)N1NsET;J(BrhE` zX7YE+H+Fr%1#?@~_NuUb?OI|Q_-;{AZ5CyLMiCWF!)u()*3;xN_g7PXJtI*ZZT2J| zr;;lUH=iWpjp}RWMm*!hcgO%#?v)`s_(0t>1ogwu#FN^Sbesm?mekJ9PTW`V$(w#mBI6-AZ>Wh{pdH(+^S@c)1Y1P z@Fr(RvjQ*YNdhxdnN~x|=TN~*negd&=`pX2`OBJ#fRL&%upLM?iY9%gQfe3ijR*fw z;x)A1i3uD$ytC24=O6G%xYPNk%g(-px^2}ixY`8V@Ko{Cdr$`1fKQ%U&#)u}5s+w^ zbK*|*Zm$onKSgI2jnwdsbwQ7&DWrX(xx)Xm-t_qvnySVQEgf|kfYM81N`vLO;=;iXlw=I)Mw-D@$ z_zPwOnI1<|96J_bJrsPLq0sw@b3C8tg8io#fa)Gvz+7a(Z>ZgAEblyznGs+c}D33XyqQFY1GPK zB$$_t_Z_gc2*G5ST}C(u3|`aP8!sml8~dIrlzfY%7|h6It6o?SklWcn-ukr82;d(2 zQ$Y)LYnoNHefC}ny()Vp*O5C2X_o4R3e3^ptT`7MpWI08gVj{2ZfDEoX#VfyHV&#) z+mZ*h{f@5IFTtY!brZ@Q+kRb}lp7A*a=w&WA_!AkD_!j10H$N@eAcY5V5$wY6}?*; zNQ&R2nC>+_J2h=tM^VV1&a|Q=%L25^yrjL?qA7JoZP3HJjlt4idE=#Gr zZ;yWJCrxa$~B(ib)(5U%SRb<8T1(+N?#l^j7rn~&~@B)_DUFzh@ z$bU`7gdOn7=h^2LYb&!m)bV2qV<$8f?M#&+Y){fz9iYO)0~0(Lj4;{hdQ~E z?q#DIaI)IBVH{v&kCt)~l}lK6Ip4Bal{q^s&=9vG-L>A%b0ND z75&_dS6G;s9Hnz1r-uQFC=XH}UNy^Hqhsqm*6vBVs<@@{v$M0cfe)~@12a0E zwm^c}t7G<7WCf@*&{$^J2}6I8AYr50yR#4SPHdqEtcR>c1#J&BMu3C(NuLp4(<#-h zx3-<3hY=Od+H0_eytNwkcYgP&#nY*$F5C(7fizsNN}Yx4R8>@I+-_rH4p?P=(e2{8 zQ*Wx*U{5vnd}WE@re~%3h6=znQ86(i{+9#UV3;&hX?2tS3O8Q+b643Jm(99aXB`6_ zeg6Veoi(pv*GHMgR77n36*z9+zzqwjoHY`!IvuRFcF2N69H2T-cWx>2JJBC+?|8=% zavi{U&G7V84v#*H9vR(xZl9+0c6JpjU+PIaJN9~hSemYc>jwJ?!1H{R2ud1@`Oc2MM_FaP~H9Ha~_gi!^1w;^14|fa}d2)^2t+~sj0ju zlR7(xXE?Pl_0F|^K57d$od{e=Q!(o%^^lzDi~qEgXg(n^albc-(|w`l(2XTOZt4re z--&aluHWG@EBPPadZ{QXCq=#y6j&U3cO8?J7&69ExD!v;d7r5gw6SlKva_>8OFE}Y za#s>h0}Rak-{VB_;-_~xFjWpBhKBphOb+0on$NE=&L%5OQpua+qo)Z%J0BJvVsGcG zX3^#Z8!U#yby3UW$mk2THIsGbdjVBlgY?g19X);pH5{$=oFAojxmb84@XpxriKsy^ zPflHNKk)PT zeT0j$Nh9;&PfqL7RE~G@xznGAINl#Hraya^-J(3v%g^)pxDPZoiracD%8;vl@=_Ta z{lf5sN-etnQTA2lTBvb%6@b5l8rPGU4IXh4G>OPRuJye5(eygEo9O;S=J@!f6%{?P z%wj+9Kpa(3!O?z1wij71mG4{>cXUO-Y$l+xI#S|*N+zjscAxAWsVF+SFH%ltPAn*T zmB&p%D1B`P(~bTP4;Q?7*&fGHGpGAfXTN&RCxXt~G|uNo&JT70d7x!12e>aTR1_Y5 zT?x4p*ppbZ8P#xn*l_&oJVoj#r{U;i=I_am2dpobmlbaJ2n*eu$So1Uv11wpWbpXS zI|U-kHpNOMZA7ZcH6p({9*VANsB;k6K$ybLrOAyuODiiIT3Fh3tc9i^|C}q@?b4WDN11h%^}_*U(UYi5u%glh~}EHEEeZ&T7}?!Q~5ca zCOWR1w9jez#q!WA3XTTs0yQneII`UYfO2o_^7Zl>?cc{{!mjqk)^oQqQ`Z0W+k;R^ zTf|9DChYqszIy{(ISFdhX9rpcCpKr0FPHh6=SG}0Z`o5m_J!JD^6Ti};6j*Scy{Lg z;UC9>Y6;T6iy;~yJyFhs$_5PUQEtGex_&&zsn&~D4<_>9B1 zXR?_?pM{o(E$Xa%^6z&DhNnyW)_MFo!|PA=GunFGEk5I_9kWQJdDrV5x2{cO@{v)5 z^}p>c?45Pw_-%hfIKkaAqAZ&vqR+4eJ;o?oS?@3(sS9YkrH}xlmj}sOx!vx1AiK-Y zr@5%gy#nu>(JC9#Q^aroHuvr$kQIYV8<-ruG{I1=0;la%eMG8%a1dt<;{+NxQU;)l zz`QpxgMpDNvF5Ck0w?Kr{&{BC8k9cL^d2uQDm;!5fh3Au$t3mr=iX>$WuY90)vkm+ zW>jy=7f;oWzpZwr(uUT{9=~7fjHKM(qwZyuhOm@CnrsnJ-)InR!|`hn>6ouKsEKj^ zy*ux_1n27rKFY}51BVme6oY;QfGSZ%bKB~^mfjvCP&SWzh}qd=GlVWoF>IER^Bt}P zN!Q*7gQwX#beWV|`}q2T_YDqib0p>UjIr5Cw?03T{7X1Fp%u*=q~gTIVG|L~%K5un zwP*I!`cDj$X`q`Mk^{ho@qc}RMQu3-z5mHhs$PX*~9&rqLQ!)!VlRkxBiC4X> z9c41GL46IuXPGN2d)N20659qy`!hQq6XjE#dW9MzoG$H2_3{Xw6flI@x zUrhM)xX;U*VofKG2JFYuo|XpeWOtXT4?%$miZC4yc^-Q)18q76)@uOK9%EvgtJ5AdI9|k(QD9FA3)jCc^Low|S|YXh26G^SQ`}iD&m7Ah+oUBTS6h+k06= zss}QbE75_hLc51HA$h7~ML{nw8xkJX*AaFx=$BAXQgDf=9?KX!vO~20b?g_(~}q+e3*#^h9I1ANB~)jb90gZ+X-<*P;i57 z+58w8HI%0=ie!klO@nTOjIyKx;U7kPdk2B*d}_W9_Cn6DEIA9Vay5z&AEX?RkAq5B z_DwP!a}ebZ$yuNGliBJ29nuWi#Cn8dq1A~H^1XF={+Z81%gqKT5-Cj1D?T-5Hi}Y$ zNfl*t>cuT%-XT@jQ|s!~h#y^4h#r%1a@H0VJ^bGi2|&SfQ6!?ozV96t83}`2P{Z)~ z`o@9O!rW4ShO2-+V)s?~-QR%?lQK4mw9Kx-zU+z|6(4>xY_6?xSwa`iEf&U#cnYFS z@o+U!*uv0ACC(K8ls-wSQ>mVwwVRwlX;Qy99VQX$_ImnwM9-PruJ7sfVhU`!t>$_C zr9xY%rlzAET?WBfn8QSFpnI;>bx7QSv#_pGjs5#0nqHt_OL?^^Z(n z4NYAX?pV=S5~LN{*|om$TG|q2fy%b`7kpFGP!4|s??IZFn zFp5g#Ywn|MFL7e-cWpb;kGLNt=y`+x6$s(^`EN*=f>Ci?NXWbBe;dO8C`*6Dtm3J?d!K5~=0~-gu=vkbP)n>Ar4usM z;$UDkP2J-M!x^8Dsz!d$|Gjw=Vqm!q&eot+4sh%Jw=)C2;OYmO{lOAeTS-Yt0|Qd+ zM<0;yS2?Ja}j0_Qf$w6<)TsesbXXJ?meR`0>3rjJ?v+*KciZ z?j3y2z_1HKivQ4lFJT^n&XM%I7>4c!Ce@{Y>RfC@TA4KqY+q050 zWIR~NCsxu}b)wDaA~T;L6*2!^m<}3kt9wf$a;sLpMydZG)+iS1?$o<|o1TI7(`T4f zCxaH%xxYxkWJLc2`R+g3PBV63Xs8UP%3dNH@G6o~Q{!S{`cQbwOiM*};zGjd;;B8e zgb|Z*r}aLZ#8`Rbl07wF<{wj&U)^=PqJFgonj`C>&_HrX{K&_kpC2Z{f#%Z1#pNN! zzfJ#){NTYecH32ODc$oQ0@<}CJ3S|z=CE6TY)^^}v-QAm_Jre`>;)A@eS2@@k+Q+2_V zCFIp(aKsx3b(nEuWn;toFO0vn%7U(#2M;obVD}_MMd98N5Py&R(qspuBnJmA01#oo zaiJS*{p(Nvl8-apKgZ@y()DJBce#=pUx8Jj#7jp`yi@4AXI!%Wuc&!??O4FT^ggTWQSu2|@kd7TPX1;%lnr z*hdD3JmIugrJ#(AjF1u&JJQfVF3@TIzqjey&wxtRe5l*=xc=#7l&{FmH3i|C7NYf4 z*ac3;{3esd#-~gzVwzDt_zgqf@7g;-q9rtA&kxs~BOBMhg+44@6SlG{f_DidLNH~@ zckdtKx;6^f1I&3H=bI6OvcR8qVrnX&@D|Ti)ZOd~xX=&YGZp8!3+|iJFM@(^US}8jQt-;Z zeEpd2-WRHt`kj+{S-v-&wLOXkjwY5JFW->=b?>&}yj!tdw?7$h{A=eGwzf=emxuF^ii2YUT5?>!?KXhKaY~n=kJ>G%PxpR6 zR$QU@dRKeXO1kL**>~!`hZudYY>nK?m!j6oUC{l0M>I1|d_lktdh5%Q5aP!_Q>Tm- zfE^%|Cx2&>*nJ6_{nJz~-mqD2W)>EhelWfp{m8;%2h_xQ@?sUEALR4;B-Ch5-|;=8 zlH|fuRC*(3rH1W8lNS{6BX7v%ww(JPx$M2is+rJ@7zmk!w(zQjX$kVoUdkj zq^A6gJjP|&y6y$72#-(KL~K~-Kx;=s5G6G=49kHg|9J&J@M(fxpy)2y){Ad{tB!$& zrUL`evc7(XiG|n!eeHRtX`M@CKxw7 z;LzY0R$4dfJdh;kkP3esS%F4*vGotCmLgYKTpo+i#&9?%w^CM0kMN}**5_AM9ewjc ziWEhfp8>l;aOv&4bXoYx8`HH6T7-P{I%QW38M4R8$;segXzPb!WJ+K8CwyG2TZCIV zl!Qk{PEPpY?Tde)Rk|A+n0g&u2V?)U?)LCP%g}!KkFs|&&tN!%06#xf#1YsfZfTJ zAk2X;hFQD9!fnID^3|8i#*-snU0z<^+@#`8C6D+X92^YZjMXjWtKfHFkkdvL>FoKt z{V4V{^Sdu4dA=A?U;4geCr!V(C2eTplJD;bs@!Y=sSeeNKU~S5KjYKU^^S}v{LQ9w z*q#K};ohsgZwH+#3Km1N^|N&8tXivukBypeD8vsnrBqB~;zXy9Jz`^a#e%iLVdWC5o0}jvF65LLnwjzF{mciGKWs1W#=VE& z#RZ3Fe|NW7R`Z3&8D~&_`O6rDaRd(Q^p)xoR=qY7<`B_~o#!$e+CP5#W!#6dKRwAZ z{%}zbQ-)zgA9`N_-6&E}SJu>cfX0wLA<+DSFn!B?QB4AM5gVINk2x4)0RDu0PWDA9 z8%Y=&Lw>R_eJ6Xxw;%k}i0A==Q6xoblIF2B&sB~^^uM#l^s&ZPeje@Jxd{{V=0~nY zh(33JZfR=^*6jb*tptO??CtHZU%x&tFbU&9!On`Eql#7xN>4=r={RB9dSk854aF<7BW*i?K`Dh>l{=Is+ zRu{m(5u67&IXS7&pTHb6Y;5dR3>6Rq%s8gq38IXxB;;C^R+G5dVkcrNVrw*|A|h9l zQ!IWw z(r0lQjYIU{+~Wi}`PKKmFwu$JqZ+YtTRtT3`isz84v5v`{PYmK=H{&n`Iz!}PBuFmQdejy^E&#f5m%vo5R5;MTwJ`oJowy8kl!ep zw}N(I#E|K>=R5PFH_s!savC=HL>ZkVg#H}vKOTABm(InVS6MvOl4-l>+VR{bL0UCJ zPa;nh(^MR`1w!W1cN&^s&)olLfpOJUNH`UG^QI4cFXSj9^a{;&b%{Og%#>A)fA8&c zRfdf_NvUhgQ;J~14dPLe&3>9yGW5)2$}_YoM-9oBVw^2&JRbfjIORCGxcGHeOJ}*l zs5=S@ihn1@0Qq(kjQ)+J)iBR0S=rf1ijDoQsfIKCS*Qg5a#43yzxUi0=NoCoX~}hX zs2fpR{QLqzXT6NSCvrcOVsxjoWJ2358{60pi4`C8aleB(*nNg+1{Zt&xdA2;mcgtA zqvqjoixjFJVHMcj0M@9yy z%R8@Pta=y$*NB=GJ`Zz6fVjV46i9W7C3l`GKd;;NHQboICziwhLS;N9Ha7Otr@NiK zsu~(I1Ogv*4GadZBH)wt%}p3>@!J=j@=5N5#ecz7GJ;!k=WAARD24AvD8QABA*R(H zwY;Qi78&PA4g(u|ZGB3ES1P)6PjbDNX_QM1;drTLT`rV9Dm0VO)gpZ#^Z zy)j-r-rBvT{=9!6@t4?uYzXtv)#2LTw z^Zlk+u^cciFE^L!>Pq;j!Fp%Ie7y9+C3>DQRW$wH-Mg>E#B}Zk=XH|x(u{^savjCg zk#n$Q`82~`46~}ZXPMV1{Icu_;=?WDU3mDqFJnR6JPfXTm})uFI|)Dq79O|3aCrc5 zZf_j$K=35Y*P8d;!;>5TK{Xhf2ruxlWX_kZpUByNf9AloIOUl3B}Kl6tyf6tBykGJH6HB*&Y{GsV!o`8)5G^ooxxmeIoPnhtAl{;}RJG|b&B~8qQ`Ts(q zQBa1On1xa$V})?rW>pRfiRkipuDO5>OtuIQ3E{gug4c-qH}-K@Och};p{LzR%;M%S zTU<%H0SqHwY0hK`%ez>KekXOG*#TLoI)lR=e}IBzdVW(gdAE=qN>|xmYP*im=O7e$ zJahGyT;qxe4~OGpaP)TV|JZx$s4Um5T^wVHB7y>3bc=YH;c&TC%tnsY+a zXb^9_dUc_st{YEs^4*6Lc)O&p1pk3W19Fjn9zmTobN`kMquygou}L!?byYQR%eNIE z(SV0%h!>tFn*tN;KftJtlNB$9L5qb-mjkHihQsb79gg0;fU2A?#BRNFks>9f1Jzf~ zA5}r2OI9^hAapZUZ1RFys@2n8upt2I^l%I~B6{iEt7AJ1;AAes=*GBX(V&}pz=sb8 zux@)9-@?Kz=y{B^s39(~2|3RB#xK^-8?J`GSzek0Bms6~(B?_!d>*avZou}=?3>G% z{PdW?nm&cG_c}TW66Cr2)d-l2gZ}LpsI1eKt5-sT96}@&UdP?NJxFQ-qZbuDgE}f3 zk(|{Q7){Qx)F|F$MCJ)7Wze;m3Q)>YHOb|A8mVBfC)U%HVa7EGPBmz%yi0B&3Sx#C zXk(2RevBaO9>7RHMuT=@@X@>;O*%R4?d@e{+(F(Z)suK{^eWd_wWAUhmhx=H0F5Mk zE{hU)3$EBaBd?@JQtj~Yk>9#c_h@XI@$9&hZfWfV6J!)gNd@RaeVaeYrr>kiJy%w~ z#d92u*~M~lals(Msp;u^ynYwXpWoiz77!GC>=EZ`aB2yII8~QFk{PZtKY3z}qe%>q zEA~mx+_`uoKDFqfk1tkw>%ifg!jyGr3RuW}Msj;RNE$rlC-Gy+yPW}8a+p1B38e}? z4C{RMi6vx?YYF<2CjbbTTzqnGID;0#k|o6E=KCN?Fj%VOVNIOu=g$Q(M)}p zmqsF0+mksij*oqxRhntgZ?Q}RC|O5G{;82`U<45s7GW?0G4Z1NcDvZMS1$a+hN~PZ zJbKw(qa`F$#u$-Q)G6^rbnsVQSuJFWs6cJ;PMN94MZJmF-jJW!zbVJGFhmKI%nZ6G zl!Y_wT^$s;!W!G3c>LPkn8VSWCNjFsRp=NjLiF@LzyzwCq!NgDz<(dn{R4bl%WEOy ztCXk@t532HR$5+L%YCo(fmvV5)Rgw*Jxv?K)HJx{0M#`lO=`)7PBpMGhK$NMj$tnkDVQgb4c~GpOvnBf;V@`f*SF! z^)OfnmaKaiMX6}&#f9kj3v5{!r`VfPW8#YN$wK@wX#7f7c4_*!4D5~}op%a%@X4CzBr z4kS!W(xajX;O!(TWURbPb@B-6l9_X_OQ}CcO>KlUQpPnIpUa%L8nI?d4;prk)Z~=$ zX`qo$UxqI3kn`4{hsXJod(uu1;|<}}E8oy80?iimSn6$go`3kK-K+Kq>e2CV)sVJO z!%~Yd4z_k!YEMN1sjW?GGta~)1d(JW;YIRLa`#y8cxlTwK}-_P>s$iRXPDfPJ zp6kUOZ!--ub|w`Fmqgnv`IMpwZHk8sMhVaNcel3_(>)#KOjJm#`(q9YP{QM4%g9qBa)pf~TF40}vbN_1U7OZG1r8G@my zpM{2;QFN4)qN;DCqBzOuB#iR=pvbhj**EY+50B_D%I_~U2kPnK#fw*oVkRu@MMOmO z^z?w4j?$iM(X(3jOKLP`O3>G$#vD(c%)dqvIL+G^Sge_C9psQR%xT)(F>dMm!W8>P z6iocFIFp0(2UchT^zyL-{0VJB5GT2e!qluR4Vb?GqgSMc$HDtUHPimS(<{M^bGuSO z`w|;B8?_09TYK>DKT(hsgab7w+>Z5K8F#TIIC?@#HNa)j$lW`zxIjYHz|ztZ+8Wm; z)>~c)hpxxq>nWFyKcotiik9{OMsKp24H)1Nfo+1o5Ww0!wV#+>Y&K?FQ~`wVC7*^Q zy-iQaOa?o!$Zu3kR`QKd@VofrTlG&I*HlyH7%UL|bU}^sFae&BaB*S5v{+gPAR~yS zKc%N9SRr2x$~!s|67Bu%6==bVLzD^g4`J8f7l5-XHgo-1gpAM~7*H%XCy{2=!;iEC zGcULYfq&)G&D>95Zwl>k6?-5)f8~8y3>vIMclkQ9uYnUV+uRXmbi%af(>>cFrvp7n zdmK!b9(6B>iHXU|GB+_Xfr3#U?Kuf@tJ)v0kO6jy4( zc$kll4p^tK)@Jd3P`7DBy zv%VWRz+<2)yJw>7(4JTlegPRi3@IKX9{TqcV}44JRG4YA?Z}-237lG`3lA~zgA{q? zLjeG1Q&UsI0>@CH>Rf!!9H^QgPqMJIM9=%Cd17^BWCSKBtT@Bxkm=^P4!x)4QIDwP zq2SF3dm1RPMW}3O?G=%_f8Z&L>V+8-iZl^wauoF`3r6PV(vSl}N6#Br{53VD5B%n@ zUz!Xzr}2+Z0%0CpVZYn#AY@V|)PWAdFzy~2<#BQ~s+dFo#p<1MyOKrHp|xP*sfC&M z+t+~tidt!zJ$o9T4iNU3X!q%RgF@9L0MaJ)%rP@DLEEOoKF)8VlhsW#79us1Wu7~?D&j3`1?HtF?!%YPf)ZV^* z3siW%lX7UIPIYy4V`HN-t@f;m3ZyNJdR`KGn*SQ^kpl$1Rd9llAg&?Udy=}UnqLtF zS2Ptm2r)7;-n%D47pjtp0TBdvCo?4_yr^TS_(0=bKma4m+<`Dhg}2z(e;L>($n2Y& znI&17C`TsQ@9xsfJd6b1H6dLA3oJpVg6t0$na6BKFS-JYH`io08^vL&P=-+&w8q88 z!m9PGlBH)SCVmFd21NhJky9tvblTX*#|Jrz1xU-3EXUa{$`wHvR0j7aO1l*O&#+$> zn+U;AA=8xDg7|NOw_>KS?E_a|S^8 zD|9@q;!EIB+v@9)vQHQqO^)5hog=E3%dsoeInIjrouo7vbyaSyPXw{&Or2?ByFy98 z$S3IV0z*+(NsbyKApZ^n8t`tfUju#`tu;#tH`dp;-QTtV`s?WUv!2bNUvO8YBf9@Q zc6*+lcN=<6`nDayC4gPV=8JbV38?5K<&*m>tTv+PSP0EXm0GeYa2V)8TD`vf*iZ3M z{Ed?c8=J}T@kky=g~&GAL~E(Y`*)<4z+)S*d_QScx=ukJM0xKXveN?$-3#%Wgn4Q) z99HDi)V_>rY^h0cR;Bvc>sQUc4-NVPX;p2D%McPMwi|GEA0()H{^& z#Z&iOKTJ>~ z|M&Lxt3*WR_Tym_ELXuA|V-r;#|w(vN_WI zUtUCJy*Y_-aW4)}9?KSrS98pVD}X$E+QgZ>>vGFEMfdwvtQ{YgFc+W z0KaqMCIkwl^Y>*3ZQ8W5tx3)5!S@m-Q|B$fXI;_DEe1W^ojcXCG(DCd0h&@=fNlVT zw!^Ugl9MI|BAQHL0FZ?I3Cpdfq{O||JRgDQvYq*!2qWr027GSN%QN!xlAria6t_`5 zD&H2{)TGSgy+~qyJ)b~Jc{WI=mnrJL2 z6Z71RT$R+@4tBUro7soD)>Yy> zJvK@x<*g=c!h(W+M0|(P0W}}TalM=pG|TMlp~=a;9#Zb21WL@1%JbWY(6m%K1X6iH z)4U!ba_NKfk4ejQ7NXK0f{r5(Q2_YFCpn=i3YN zZ`2b4cv);C^erTTy5D25U`kI($>!dWh$N+Ty(mW&yi|E~2rL59U)??V9ESYDLI6gZ zHLnO@q^RZIXW10_v>!Lu4w`37 zj0Rl%hYue@OrzGNZ#^x!`Z<-+HxajofJ4LT!DE0IQt^&$v}q!x)#Wk{A=CwL_a*Xw z%Fbsx2dQVZH8+<&|MgNiLxCzd#A*b_cf%lNo?=x9qoi&eKcX8iH5BKAxC8-Nu(Tf` zcS=L3N>^4^CMG6?J_gXuMi|}VEOf*bZ@WoBBQ7W0E#ET-=($TQjcY)DVu}8}GL!9g z*?Tn#@!9b02oViZDFaC2Li<=)F;kdCD76h;I8gZ|b91tDDZdr5E3F6=Mxd^*SAXtg;pPL8EU2@=F5*SO8j z38bskkye+=emj_xbuBpyjv3_FJzl+Pny?hF#;gAJ&2*&d1%w{Tw4QHI9#fJj;u}2H z+Eg16jN^gCUP&q=q=W%;0f=B_XYUku_WRS_V7{!k_PU(wlSf)&YnUx6nai#(zVw}P zSm!G#+lrTeh0P;l6B7wZNgl_|bO>t{t^X)i<#kw}238%a7QTxgAJSOY_PGr}pcoh! z@FDr~+7P2cn~>3A=tvkDi68a$#cOBZ%t1Tu&z4F@795ui^MYy>6?@~p_EKn^$b_@f_G zb`1Z;&l#AB9vYSH&1A4Y69T5wzhtcwQ%_jxfLYz*I!%0`J}D)SrfDN z*Nk^uaTrTC&rQ%TemlpUWfb1qM#PbQ$;ikE3mdzXXK5a=6l8w^_BS*(#+`f^3fOWv z&}Big=&L_bmdw2p9)4OLo+$lK8-HXdkKK8Kr010;fS!kp2et8rzi50!cz?m_gNk(; z+krrq%C-CpBua}PAykEFjNneePiMr~PL7SOfwzU3zzlSBZ_7?vsE$ajJ2=b8w1aPq zii|9Yj?+tdW)F>A1_o54<2Dqk-a*Uge z7n5-Svs&FIvmzp!n~G8*>@u()>P=V5C6|uIhl#LC=Eo-lWd;&s+&ny>jwk@1n2Cx7 z=o$6G1@#Ii4n95@6#iY@U*{S(<-DR`SH!Atv|7SjFPQ#(^Kh*KrgJ zaxe2xnVOnH+z$mgqv?00DAoK8R6*(V>G4M$CM6JWm7nzHdEN%&QXm=2^Q_8^-wQ)& z@l^pgzogT(>(_$=0y^5;t9Uy61(K^1-lpTtMN%;~B6)phB(GmSOjz8lPJ$*TlITZztU<8l^2)*dE=j4WQs$lBW|lT{ z-<|Eh=MEsT?8mt`?^~RUAcY121Qgu?oP-z$uAy#K<#ta^jW*2Wf@&pbnHB%>WRD5) zgBlSFefidN-B)fhJcIhT5U!+iXV1PDON5D5mo9;Fm70pm$b2eu(~GK5pioB|6RY*a zU-fCltH>nvTj$iOua5l^YV85jP-wKHQd9G>a|T32S?cAt@bPJa8cPUmCa0zfVaBfQ zki9-QCD6FPSvZM*>>5B9gQOH6e-xrs%Bclz1gr0pJQX-FXk14?5CzT92L>d})}Ft1 zd0WxJVlVk>UDbA?`ej}jn~ErcdTyP9KQ%!S8WA4+`jRt?vFYcPy9a71AlN{-_89+g zl=PW>UVN-P6`WPx?U8e~wp$>&+&vjiG7gST-HLHJ{I1rwbhxBp9x;s@%x2PO z^K9fDBmL3tR$ImL9J|ZbRQ6c%Cd+(=VY`<`%4vqyR@_Dl7xSmX$QvPTfJQ*KK@rFO zpA(kFx&sv>6BDdprlI=WJFCC1Z<_k}J-P8V7_h+HDKL*t;59%>p~lL5o!#@*D{@j& zSSIwk+MRuoYB)Wxs6@ka6bV8J0ww4nu{0>aewS*|ukdiJpwmC*etDVl_vMk>VYID0 zl=oH|SJyu`ZwO(N)DXqO7L1NUo7!#A@_?=O{@8E%83M$m;YwF&SLlpSjMHl?+kC9bYLL#u)O!sCNUJC@aG&HiU!(ht~>1E2@apYQ1aBse3u zeW;A__6GNAUqH!U6#PvP8eP5mOil42eh;XcaO(3P#Tl5GBxIf3yj{F4;ju z$S5eLaDVwyYOu??s-(CW-XvT+QYxy{+}xnW6Hht4)uNXx^syH@cmU1=mBj4SRL=$j zEAW?zvZ5t>#PVIU>_s<3rN#JE!U*xz6gy+LxHL!(o@{m3-i0h0Hj-FwSZKVZC!lJ| z@R+HP9g$cBlogy0Q2pS)QLC|l<|JSJZlj{#{H$G%Ve!m|{{!JMdxc`h{X|~g&fZ=! zhS&M$XHD>_WpX7EVPT>r{nV!sV{~}yaJ1EvPHub2ukOB9buG-7``HL+Pjcknyhp^; zP%(!}==na3mJ}7C6L2EB)0N}+oK-5r1`L%$%G z74zjhlhWwG=+S6y`sX82ib}zoDfRN$ytTsYyl$-%ABD$c+4UeCpTc(4Ut$1*BWAyqs7vt#lS_Fb5j89 zrlD-DVK_mL{^mEDEy!T4GXEfO5Su()?uhH0frM~ELea_8sf5mxQ@h*__pYq03|Y6t zHn_2}0{jQii@$#T0z4h!rkLE>VQ%}~kRgS{_$z1fW)#gokT+*9r!D9ClDh+7OMqZe zm|wOm-tWe-1^yjsjki`;@7A3-#0MJBL~VJvxgi;?Wp3^Y-_Jz!U>RBeQ3g|_%N;h1 zz_vrCOe%Sd?$GR(3i{r7V$BrK?tRz7DJ!JNp(4Q3uwD5S%jX6p%-j##Pjz&826DV2ssSbz{g}kU6drJ_+Hn zHq|rH!tNifOust-{v0}Ffif=17{{#e;ugG-&Lqj(Fd8zDOuY8|KR)BJ&__nl0{8dt z!QkT@XmA3ti>)oJV(_ebHP*6vv8AWmR;8JqcW5TNlycMxL+(JfM&fRCT8C{o;gs2u z&-2QoLq~BB>YzqQELj_SfOi@Pg2U-xqepA$TT>HL*ge*hmoJz=hy6UwJ|M=CaLcfX0H!*_3w}`ydPrTLs$mqbt z-rD7+J|eGZmYe91-hc&YWnpv4A`p4-@-{aYaet-CQ;BQUb03-lOEiBMhV4$OOgSr%oe`3I8goY|Uc>+nB zZhGy)k&$PTQfvDQ9OV%coSAK9sfLT8?lE;{?R|a9N=lSA=-G~{fH-0D<2-{_;WaKm zQ~o~#YJ0k`Wu~RgQN%dGA+5BW5L+3Bbeqqm6C;N59fsS(DidXkwd#DJ1k)d4KR{kE zc_1&-fC@>y?(R03p+OxW8XBkTp%c*N%F4DvLO)Kkasn^D~O7qVp za6BfxITIiKd2cal)k0^EE+gxQ56@hqJK4Q;cB!JLUDGC})7Qqpl~q}7wD2D&PUgs-j5%+Ke=u^&!Gm>*8Na_@At zxomBD^6P6<7Sh;GN8Wb-x+K{>{&Si)wg*Ns%+(3CfTCDLqY1oVX?wLh{^RRdsb2h&V`u-_n2} z2LhsVs2IRT^Ez#R214IDhoS;N9S~%&Xkg0JJnf%hs(_{WjZA}+F^#>6`zx8q@UK{`%qxZWd~I=pC(9>K;E-A)5ZrlXAZC?TiJ;_Zy^ejGNa2@i$0f*L`}z6Bs|ZZJ zro$otW)4_XvJN<*4?|iM$b*!kV8; zv-#nX7_1LtgWrp-M(fnTt>OlU3(kHoEfsPR8(SR7Au>y zVHwj`#iw4o3JMRBvE9H1>9{%AYe?6-1JewEdMd`X0?M`2N^QK~mIIOU6j#^$#EYX0 z2#Sk~D=2isN~NPX^P%t!W>iW=bMJt+zs>NhD$lSJ+4!!;3lo?}vp>$H=ZaMi4{J!o z%BDa-_rZUkd?}*##%S^jg_rK`ZIK+<*REN>%ZGwr;4k6690DYxq@;vGG(ewW?B4lJ z6_m`>duzeBC@nHS(5y}R=9uNQ2)D?zD72{3Jfabyk)n~O*@b)pSgw#+RJHy6eHwlv zU3TwaIJ={g-i72Yq(iSK4u%Sd1TbIE2-;?Vda&s|u1fHB&nzp7+DLEq4&<~ z2}ma86%^$3oIb4G)jVZWb#--6+hk=eK@}ddSw4)iH8($kq0`#H--0+n6?_g1r>gZI z7#x(2yswFuoC?nW*VIhuteE@3{yvE2?cyHA-QVDII`mSd8~)5LFBVTtj*V?w{@GYT zt3Yd#??aP~3cI+3DP9cCP`I5t9Ua~1Hy7}-FhyW{`lCP6A_kBMO934Hk@^IwNWg|5 z49P$wcV-)jg7%|LD3<&JMi`f1|Z^FUtaz^9s^lQTT9DuPV3ovB3J0H zxm-BxvIk560jp8hdrCQ6D6(=n*oE?|(&A!!2Ztsdrjm?e^)w~D@DeLWBSwX_&NB8Mxi(6M6jS1$F$UfyM!n1z=V7 z>m@fgH?=lklgJgU>wK<9u$$vjyTV}TY+iV20Ln)*CMG9+3VXpF3Py}-PXIXtn6gGlNH}_V zMPo&Bg@o~iE={Jc$7efxAe3Q0KE!=MCV6Y`0zFVS3OW60r_&AmKmUa=2XZ<@N?4~3&}}$dyS_U^1tLq>yzJ%WWk}aS&@7ym5l!9-oIdqrZdY+|kmH&TK6ypkje0}2jwdgewBrN? zLlZhc{&1N1N)*9CIU1yi#h?0*5k_`+7b;eL>_c|oxbUFeKd;58hjPZ|>S|x1c}!4H zCuC9%I%5vs3*0z;6v7Gs*|yD=N1KI}QGBjLCTznqWXc)cP!a>?u#J1IgMUexqjLq9$X$W_>e*XvqacxDJ~`k#|WYbAh>dYc>)C-Fl9*z3DX<9sO1Jx zQb;f0`N(3V>P)r)%mIUbTkyl`sseIyazK@U6$VSbxiq{qHWm~X)=O>G+SqsraFomb zHdKuknhzhs-SU-oe~7r}VCK7Un6 zUP2yZ2xOl$@6Pz()KO36VSY)8vP0!{9Go|heyis@%&v9WTZ=i`cVBzoJYjpuE2Dh< zySP|lV9g0ZiZV?y33HO8Mtb}E`CcaiIk^w#>EJQuppC-TyJ-+u?Rir~Pj|#uZjWAe zuYMkCZzGP7B<}ALM+o1Fz}h|2v5ddIxU?sKoq$-2Q!7boA=f_yms$*6Ud z2O7^uYrV}@24SllZLa~0vYQOkFQJ`)vBJpA$Xfy~;Dw=x#mlQ6EGY;zp3b4H6Mm$qs&Dx=yq8f~;hTso%^S*{81La1XY> zErNXs0vA985N2x>nDnZcm;W%G1WDRhx4CQ}32&0sQVFzP|MUR-IkWx(Q@G9rowxnIHZ(Md29fjZj0Y7) z#R_|yJ$T@@QG2xCcH}hP5CEoKC7C7So7QNkhD)!*E=UWwzV&i;93;E$Qiwk}ztRm^ z5QjPbCQy%OkZ3$CD=p=71`W$n-3^UAmqzHdZVBL%%MX8Xdits{mtM=wj(*$lsS4-4 zbbVxh@)Y^heqLEgn!1{rF<{T~UHm~vG-Y>cC3) zb->fzoxc$0F%Z}GnhzgVn^w~EbYx^^y8QCIQIfO|S4%@#8T?wv`}eO|^ISMT^qN#G zyzlll>uJ~Mcx)TC0|9n=@-U<`)W}_?qHNPC4#Av}c1wy?dLI@qY=I%ji0L7p9Pa8u zY$j}3 zCi2E=>5)TxDYW~^Y;-wXivgXRc-Rp1v71C-vGX-XCp^-ngV)txr z@BG5TLDtc37GL1JANvpliMCr>&)))Xwx;ybf7pbTqp%uTkRe3a6@_JFjVN~OA zLL>b~KtzP&+PM*a?> zs;UDSYlTt>zy})Qsyo0%DYq%@Z*?2$wM8Ge2je*iWc3_<+7fZ4JDC!T;#NV-&Al(} zx+_;0yEGB1v8WKWF$b--tI^JFJ%DF|E0R~p)Y3nh+3md;VO~LLF_B1G(k(5G4O)(+ z+?^C<3fbW;D*&LOe0@H@&G1vi*mydtOjfF_sL zW{ZH|1_nv=6e56j8io~sNu-`jHwP!)jm`aq5uD2m()x!_LU)hFjY4yNZNz0Xv~+za zz-<{iy$js0z;){pT<`1cRXRcdBjW%0?IOL)iZ4uwSPiXQ-*t3-4na4El|$iMGjVa> z4fJ}y+x40M_-(-R*7Dm+M~6$@d^|4uMH|w{ z&dzSBVhc5NI-0}kt3x;_NrsR5FrXmWAsV{+&6l6-Vb$2z{{DVW3Md#|Vygy&`hBAl zE>%HF%FN*nD#i|=f8nqrgSFv3cX5P@ib{;bEahAnSoS^Dei&W&6dJ+z<^S`~=>eka z=J@2<9$9O{L8da!~-#c|n7w7KC&LP?r5h8+*_OLq19X@a5xG5ERd!FAfVH8UYhS9Pv~QD+x3tS z(`axC3!+z{i$jD|@?3_CW30Csbf4VNsoedM1?Okc%9C$*nqcC=mBr^nDl0Bcwq%2c5qe<`m3lcnQ2P#)>Y`~FAU{y^L8%@l&#bPk~g z713o2^17P5&?W~pYTBo8$5&(ji^Hg*y8T2$0Ew-#6=Zg>uvQ^+?!#`EY!7`k z3i}oIfLp@C$2Wnyv>pf}^&r>lf0OaccRv7(_{TMlC@57VT^U^&b+G#?sHk2biy-7g zh@{8^ICikJOIIu11RigeZT81#ZX0iD^WDI}z-Y(CVl#UC!<{K)8zYdT0W{55M#5ES zaO%DERKKn;O2r>bO%qxe7iKQQ`Mf(c0tk#;rWnfNG% z@Pt0)hvO7{GX<0M004m}uj_->>1pz*ABFv)Z|kBvCa)bB-h}j)8yZd)#^z-!UvG~t zK+lJ#lavJ;nQBOHx)EBrU$={A`e$@hMPl18P$--v9b*QdyaLBhXbmXCO+;&9)DvlJ zwO`;7yQM|v0)*lAB`vYZZlMl3>$d2vfxSRRM~-t>u+&bj+(-wKGyqJA#LSKjTP|Cr z!w{y5s>(n`H57Fv>U$%X4ImiPd(m|epMo1aC1H6fSoU4G9XHaP`|)@q1%Q3$eX$5r z+um37LAbPu*~&~sHOqIj#^=~|8=&4k1Sg3-gMWr&BS0`hdnZl6slZA)LNalQaIt)~ zi5iNQE?vG{D$d%+1!_E~25SYI?2;T-x%}lagikWiQ@#AKz^bTFpyw_fU28|jN`8-e zX>+L~0ET3#CkZ!D* zn^xBg(jXZMY1W(sUZ>$zJ1VrPfV%;z9rz(+-5?lNfRJDrmw+9@yLRodl2R|VcwoDX*HdadPfTky!4v zCW(rPt*)(c0loTk0XmZd#R;tB_{7BE#Ec%_{WiFQ9XsG(0f=9XsQK~Z33-rOu_aQV zS##S)h9JI=M$d0^xwjft3-7wvS7c6|%g$IXqt#2%*TU%`z1e{I|Uv)=#gz<+k&KRfWB z9r(`<{AUOLvjhKk?!d?oly46GkNzt*1Yq{R$A&`YmZks=ADP<`tH6&l5HoQw(s3}| zXJld}W@KfhV`E}wXC+oc`#mB={`N8IWF-C*5OOfHpwY|73qGX-45=%nX{t+nkB(l` z%1ReuMQ>uRt!bj6Z(^>cX+rm0M~{;DA0=TYg2Ppj*oIg7K%76M*lvoY$yMd;Tp_%?ae*aHkfAUeZ0=h<; z3f6L(W>&POhGy1Q@Y(FgpAGBy*Kb;z88R?)u)w$P|GBi2h5rfDBcl`~s!9Pkx<@LFU%_{@{b&vRSyo=%&8!M&7nWF>hYo3j!TKGk?9H_gBWc2Rr zF7^M|?bO2HQ%zCgQ|6(3>Br3;t4Y#!`6|tL@ndBnTOVxAQIUC_q71Kbdo5DA^LFP!^DIVfRqu|2)xplr?C#;r{Nm=} z&ZSnOkyROsrh#*H1Z+t^4G>J%gU;*8=Vm6%dOraV?9E}o9W2umi{GhR}-vB52d z+f-!y60O2*aS3&WmBj9`YHv*NDYo<64x(8Vh7KOe^=t)~cxVeUsk${@5zsO|%N4=W z>?Rmx%_$hr%qenFw;SK*){`GZdyOP=27Riwgu)ya`L{QD3EK0fkF1HsLM#n}USsHO zQSX?JnhuuoK$DEpIMf`*fzOWh#8+5;VCWc@7)584o8EaSfX;13uoPvW^`-iU<-4D1SsY?SBa+vrMnY0HNVyzpB$ z^;;)Yz&9nnu%a?CH{@hHIEJi2}gw(rUVS!YFyMeZ9vqh42jveWH z<^7k~Nw4mACSf(N>JHw+dO{VM7Uos2EbRWrXwyN1s41&I5z z|5x*VeB1wbq5ogZJ1rvv6C*J#3mY>rBRg0GMkZ$F|JJmh#`nw|NZa)fQ!&QG!XU@M z#`>gTf{C5&Y_4S$4T%*A@nurqXAgCli@u{=Uqf^H&03MB=l}P$va$TzTG<$78JO8* zVXfzLXx`vh7D;HLe^A9xyb$X7@{EjMfM?jt;s7#{*6(MVz|Ea&ns9sKCZBW$CDG`r z!hd}TW~P66h~E+4rS-Vv?EvXu3|o9>_G-m`%}pus+~e+!QYVIt!o9+(y@UsGY3hs6~#tL8rMo)qzY zmbo)?-Ys$EReD!~lq0tYh*p$7kECh zs!rd+60g}2{d#_~a(Oqs!PNB#<+*`=$!|84`R{Hh3;SQ*tmI=+vswo9(!J~ZRVX3p z&>hg{A?CtS78wD~LiJS=an;eqS^-@30-2siUSl;v>X#y3EV*|_Zr{otekb>Yqr$iR5)$2E4QliCIhI_9&wNV#P1bR?h)u% z;mI4a;zu+Qzu;xRgDPP7R^2n9a>BTYRD8;=Zk0EP=cjZ$$ztd{|fN_rvu4$jDG%ciJ4hh6&Ykc=b>OF zB?+NT3WcCizEXX_`#QK;*T4`%Z^BIp_v?cTB6yLSC<)c!R?i$Pi=$ zhIQ*1m8~V_#zyk}h5o>ICW@NvQMVFu8CnANd9KP?wOhRo*eB7jG}deno4j#@HVrRB zSE6HHGu4C^eb(=xZPP}VL*^R8wWYOl!w-3Ne)GskjQ4jQnVI3Q=awf>+zbo>{}!(& z-PNky-srW2dnF%+T>B}=W_<8_aRrS+N+guz2;Z>;dAQCjKhKU@2B)*QrX2n1hKV3Q zrB%R>S&f?3%f=xlxOQT@e-M5gBp1g}=io6^vV2i-sY|ywhUjEj5xP1t4sqd^Ti(6S zyrzVp4z+&J`F>IM*DVv3mpB_@=@e11EYsJTmTlh~J6U5(XJwDef4ignEd%?O&u0_6 zhh2@N*YdCUQiNFDdAyT)JB^d>SrFOiy4yf(u%45Htmriccc=75gO;;w?LnpbH@=38 z6AHdnWcl!!OO$olZELikVvEhff9=M$r|s|&HHLG~SzcEZ@k6x>zuCNhb;JMDU1b7a z_pffB^p^u-FYr7r z7H4#RH)|3{5m$CE#@&S1=(RxTJ^c~y>gs##81uyo`lCY+zv-Sk4Cs30*)-dZ6HQ z=Y~jCdxOB8(95J3wZOt&cyKHJK58bp7xlT83x=MbP_v0={b>E-sIJkxHo2g93njVX zM%I5_5DPLy|9i*(ufUB*hU=}s9rQU4Px@ujRg&j~LTR*mOT(Gx!YO4WTnd;;+poP4 zMrVAVHAa>ZoB5*B_tA>k=$!i(;xv9);#LRD*NFKfwg7BSf=FgQO?K_KRf3EcB4-du zJgDRxdtcBztZwVhD~M2dr`~-#%lwuyn#wW84wq)3flY-XkY}9um#nOJV`9wvCO*@q z_h_7Y9p`DVibr&?CGR(vipsvhd(SjWm}GO;Ii0)VBj>b^WNSJ}SZ}9vf7mwu^Fob2 z9jV}Y1Yyf|WL~Q~$Muq}F>f|hNx#17`7LZiDtg&c0_7+dYpmeGn^QNjLiJtohIL@z z>Y^=H0byx23w(KW5tw(CFZ@0x=Tjq%~#!|{IU*Vwn7-m(0 zO5|B|o;mJ}wzDWx@u$h)JJ?d_*7z98315ngwQ5F{JGlJ@%=U!zbjdxg`0G3xxaszq zc+f5G+t4D){}DkvF}Uj_uZEe@d~x6EhD*;-8Ss}w5ubZoL6=Y z6hfbQc8G60wbStA{g4u7vl#fu;g=-W-4;T$1ST$8>U_uAS+f_re9f}U2aQ|X1X-Bh z_EjT)vx9#Z2ebdxh%hr1$^h(OIfL~ImmFj}B4KzBoe2DRmE zN62%uyV2Fb7f_1zuTcEvWB)Gtg536Bj05ZAQqwvH^m*1lZZHtLkbN5?76~YHjo|7_ z5$P-=dZNw*CGXaaR7#qwiTu_+NlwvvN&6TZ@5Vk5_TDLx>ke_ei5uc=FGi3ZPP6s= zGFt^oIF{Arm92}*)NYTf1Y*rrwlGVSupZpP*~gg`R{h4+*U$=;Fq-P$=-B05!(%dsDotz50M{%E{J1d^C;)>Lyxa^Q(aeZ6t z!=Y_vZhhOgG8o}97uN^R5_=6+33>45w^h-dD-bQU)fU@{)S;|6&xW@7NsgdtS!=#U z!Tjfb{dAMwW0QBm8yzzkO#`vmT7>30aVj|ld+eCG&PQi7@Em^w$XNa^24!MIvUdLr zXL)3b{mw&VrsjF;X_do5iaxHdc+%0j$j;{74qQQ5D%P+-N_y+}WJ+>FoK7LN81}Cw z%yihus08VQK9g;=qpdi5PvUG1{s_tCX9+dnaJkG(m3o_?Q=BdQITdzE>_83k?iEwS zIR!7mY!%}6gl9bk#Fq7#H_@xZuzl~Mi%DKM%Cz*4QTM&gTeHHC6A*|o$$IqkVAbkM zmYhFDfSGy4sCr}y#<^?wf#GE&YEQH2u&x=hK9p>$Ql@n)EmS|eokvoF{$SI))*@W? zZCs`C^Tam#2@1KNzd5ac7qi~~t0xnDQ+lO};i7Mw0B>66X8p`Sj6Ob7#&z zx~2Dv538Vi}Gdo-kXix3#t3+zafBF{w|th z{kQOsEf4H40}BIcpwO!aApzcxkmv-Zwq@ewrOAIqChpW%P=4iI`S6=p_IGg+Bimnt zKEZb!Smziop0_H0Ng<;8ax1+#zk2s51+`l^e&#F-ehIE*lLL+c?@YE(TuHm}G>urG zKs9b4flRXYYp#1D5+d4xA_au*B;ikU)jovDQ{~G3$}_C{QrWBgqd~y$x!=C`%mw*< z=~>nH%aZO{fsDI1<;%F---vFj3l1nVE*uIlWaDjKG8ZKO!^1l}rMIH(*{hZq5-^DKfX6BfYZ``d0hd+}Ag<$fW>~H?^-}UK? zKpFn41r_uc$2foIqQF*U{M)K}qA3fe8BeRD1-B?OY;7J-`4`16<9O(d&qZA)x`S7+ zQkW9*R#1so-a%FYvvI^L{cH1`fmoX5m!ed!?#TFlxD`OFYgXvi&vqpzCs;1=?PuSQ z4E~#WCf5ly;#KZi2lBbsQqd2Ll@K%}c9#yt`&PInoMF85o2U7^h=3XJ^uIn0t1O2Z zSd_T~G-qNrv;L)CaLxObS5kU$&RHO2-*YL;+cbN5%ID7`cJhMzu-M0KbvF!>1NOyO4OE)Opjf8Ychop2jA}P`#p_BsB&A0YG=iak*d-q-6_|Dnq+xO~VIB+Z$ z&h^eY-}ia{^Y?!q1R~8y96yn-c~Y^y=XmPcq*GrAWt?Inm7fQA1TIP=@jhkrP$43{StO8H773(EOyeDBbvs?VoUF~epO4}0;-lZy)73GX79#kPJjlqt>!W?@b}~B@ zj0iX^xZQq_gaNRKO&o-+TI3BYNLSJHY7$FA9%CCKJ3-0m!-to>7QpI?r@|yk9$rI1 z&i6MWei@U+wF>d6;ITb6EXqcGpJ7WNwk+2Bo3TL|&^3K3I8@^T3oW%^< zXM<|Nbdixt{eCJ;T>1AV6jmsY)7hCDTm`vFwg%<R7l+uK*SkVeLO5kDA1 zPz4Xqx4S@2g%C>2}m1m5@8V&mn*pin-`-V4rM(2d&4lkX;tA;D@|M zM5VuxcAFPRw!)^w?5k!xD$l~UccsEy(2;*xFEV;s^~Eumxb^W$9N{lC;@^vl!0&$9 zopNx3DmT~w-!4vq@jWPgtZ-t7R|pTnh4Xaz&y-4R!w(*+DdgG^eIU$YLMJB)$}{@H zj59X}rm57QTw)CfQ*jTc8>18zP7_Hz_c7(c($xkhhGwDg@E6m6xl4tQFr zX0u%EjM-1b3B5?S#Vt1rvL~xHyS~GZt0JzxPRH=#>F7f0{ks58yGL%qMlLP9C z+3Ud6MzZZlQd3%dMv<{H2}~UO37SIAE}*(xP5rVmtX4Gm0xu8-T$6`zZfEW&MNo-) z$_<-+rh;=64<1v3T;M9M_&w&nE?}A+V`dP&(iXCv|Bh7=7#`_73Spirn_R!u?^t_U z52JN`51uQf{^EDz!_M~G_33ZV;+0Ho)!cxD!4IoVk~S``Zlt`d|DXprIC*(VSrkdx zSihN=7svD#5|j^H5{W3vxfHL_^l#0&HWjLi~mVB<4DtI~CnDdxa^i))i zuHbnuC3-OSY(!yipy=4vR4}|KU22HtPOlfvWC;g4G!llnFu1#^utjLov^JJD3w=Ik z+hpm>uf}2mle&msIPd2qce*tnAt##lz*7+EQJS#(A?iOOS_}}#^Q;JA+ZkoMK+))6 z)hvc2Qg*^|1R&5k1&~%wTZfplVIja5l5)MB<3p8(=^t@r)t%oFMllOfi1gQqDYy&d zQshyzt(?sncuO)0!BBr6KS%zcC6rd6{Nb42^C?@qVa^_J^Lc2AhA&qLP6fz2@ z`4>Q$_(hTzQXs(B1@IO^H3XCtCRgrhLtG(UR#EaomI;qQJK2V;P zN$?|lLc@4s=s`E(IR@<+!WpFx8~7;=N3smYVKYQ!{|0-4tA)lXEU*zk+5f@sUDWli z&q_S(Sw(#x+hhNCRcnMZ6W1mSD34_-)vsFb$pcI|Z?O5BM)Yup)Zygn=3ZJ4oKBFa5qId=V8@|ftu z#n*@!P7MgmSh*BviOS>@b#b`DrcIsmrF(mBhc&lDa5;~XG3PdZ<-Dg6B6vfU%3l=~u?I5xt*ejGyF1E7Mp)+IR467gHwFjCxWQ;F3qk)FTz- zL*}QN*M;?fb{79|&D~&NQ8S2(~D$yT5e*7S{f>}(=>UOuehU!l}G(R?1LZA6n|72ec5S)|6&`EebP=Qkk zU4v^Bb$xTbGOU~MaeL!Tqs%)p6*g_k$8K&D$CAk`-_Gu)-ek(59(k;~(>~SUq|%?J z4$!hiulwE_7^YBQ$OYMo)*##B^J0iec#@kG&s8O3wfo9jh0iA^Y__w1$UQk3_9Lrz)Rim56g?66MPjy3d!@ z#tKW{XN_u15SvC*dOWZQz&7z{VTu=g3Z)f_XIshleL-mSiv9pz3MU zV-GchQV7SxGN1T;;I~kfDbVOb>0%yZ&}~~eD|2u`yI4co zu+$8%S?o4(29i_#`j#DSaAmuC4ra_wO^$IeEOOe!mG?;T%_epZvZq$R8-&sx;WuvA`WBhZ2dR)GZML*^cgrp5*(W{Hlu->g^ zIn@u=`^Soh4-i)MVm-A^Mko08ftVUpCpw=EKk)3*!}Ea4#Rz3^#Dt1Zf?Ey=a#bVs z3Wv_qNb|f3<6m1&K^2D0wzzxQ2hMhU#6cK>w=BDgNr-6cgb0I1uPi$c#c$=kE2>Gh z0>0fWh~N6G*)&|^X@lHu;E`yAl{ktiq|71(d0ot$z5t-$MY{sz5EO9{YDD=VpPz2y z7t5ta$74vOQOnJ%^+8Em8`r^ z_!9AQqJm7pQYlRs=kN}i8kT0RRcg>pp?J3n#;|F$GvX|4yh1uJM*}s1-2V=V<}y5Y zUBB$<1pYX(yEpxKb_)Ogi(q^THZ}rJL)@Ill?u-qAW2rsVvYxwc=?PB)m_`VV^uEL zq{IYrJ3RpXPa{b@0qO_fUmGc1S5vZFx<+53hBSGXAjSz7S&z5Bb+Ipr4eVg_&p=&8 z=Nk&4r7M;Sb8|mq7_mU*ol+K8e-R;#w8g|@`1)q%Y0_N$g0E0;`s3zD_+K*)#8Rf-w|X+X%-pl3eHnu7WwmmZ%mbCtTi;VI8CiPzLUZoa=Psm*)^x;z8Sh3to8yVR0 zNT~Ad`>~uI7T&IGYn4g7GIj?nah;U-oqzFM>$qIMU|Gz~BpEm4+-Jg@LtgrNCBp&d zt?d6Uxz593V>jBP4X+h>+rlmX>}q3^^i$qFLBUk!jU?;@J8VBDbmd0mNB4^aMsE8Z z$vPNnA-75j2D+2-4%&Q#ugdI=R~SApN84uwM&#|7xE$F=BGYXzUwV8{Xm~4V;7B8K zepXD>>PKf+=`C1zFlR4#KRvfOGTC@UzyI=p$wkX?sp*SuvvM`Rx{fhhB|6Q_1X}8x zk;%gBS_JKWDtTyY8R|ZCa#XpV;Y2k*eVWg}(wV!Fqu0w$Vz10jV(+9*Kdr8bW7UUx zy*QesXPG%_*8xv(-Et$`_+z!k*siBgfu7@Eg2;2-Akr6i*CV-z#T~f(ZQ3@Io~s^h zN_^d~)p3t5+27O{9nvy;dJT!V#&vj%v=h3If5+kHr;39aWnthOT#y~bqQaQ^_>o@$ zJ2tAfITtprfDYq;yhlILJ0KdOQ*3IPR6Fo=2g(ut;|9V2J1uW`3A;nQDSp$$;pi{{ z)+q4d^4s=XvV%q>!N_1|i%XfT7>3Pw+81AGMA%;$2iSeB$lP5gih}NaiiHUFhAgL- z5%MuS%SS`Z$8fdUPn~SUp;!c(lUdKeni9ehsYifTefL(rn^$*_IR#A$R_d?BR&$%Xl(fU&Dl)aAC7&VSGBHbQxwy2*Xe^Sw6`3!yj<|=cs* z`!EA7AeCz*Ka)Q2fx59}RB%4;xS^iW%N^SmAd!}^EWmwUK&`v|APalTY^R77A_F5N zpFX?%kz9$TNQe4UvPIEw|CzXcON>XV+6zRPPAvRpGG`j{(NGtyX+})f4Dfowj_>N1i`lwzNlTI_ofFlQR2u3j1E+17Wp7M6 z_M0*I7go&adHZ>XF{}z-6PqP&MqbRZObRC{MAc%D^%HL?Uy}85NpCVs}ajUmXbqLu2{vB@S=GdWs z!~o87vZSPj*`64zl(D|)atBF#SyVQ@byTiPs} zkSmMEBsSPY&ck3isddn`Qy;h&?^?Pe$p50cSm0pH&bdnRLc`fl?&9H7O>zN`)wHri z{h+;o9cBf=qC;pwq?LLShwUY2)HvMD)s2)c8BqgMDnpgHb6bV8gjz%Mwn^7Y?!hjG z(#^Z`cJ)rLf@{mMrl+GE89vb~@p8LS$jO^3)I$mRrzyo|4L3KKt1Iu+a$EbPe0EEG zoA@`+#1sd$wPSYu#>$Kd`U$N!Nj$YEH>9`lw{%1jkq^m;+%3UsK{OU zF4Oy3N7ruc6&Grc&Xtoo76sD+Xz$zfLxT<%2;kaD+G)!UVzSzydth`ePd_&b`%V?} z%LY1{0z{Z+yLstdOj6$I+S9R6xS&=NsR@T9BS>7#z#;F#)<7_6JrLw^6DF!k` zC`I07Aqt|=M&RJn9BJns?RQj8cCHgietzEdmx6IMFZp}bpZQjFdk8~o-|0OYFlcBi z30cIPY%HKpv79_OV&;p0AX%kJbnv*F|`sUBcC9<7+JjF1)79KUS%?I#x_18yswdd2-4PZ z%;2yUTRKPO`Pw-Mk!+j!*f^^jV<|{qo3N!ND6hOW53DsurONkuHsTHPbmUynnp>Us z0GH$oY92o6Es>PH5mGGdgFW;}q6Nf;?6pSs6Eb`>fLoh;s_ZhrTOvp*E3<1Og@O)j zXsb$y&dZ)YkMGN7{*$u0?Lp2vb8XE1=NwZ#nFbxJ=T#^(9A%9JH&_%3Wl8T`H!5fy z@{HRAd46VP2Kz zEgYHb;=nyodX$$lHK2SHR_iyUhhR~9DybdF0{bQ;_ELJ1a+HCkD40c~6h?kl)E_44 zwQ^`?k2w>j_B8$FLEbHDyn&tZSZ@xxhv-m1_9T9-+72NVkm@GdrpOS1iP+wbB<+##q5&2e`6y|`T_m5bCH}gJb?^BXlD20`?rr8 zQPsS{aQO7_Zr{Dn3#hJSMDtwdrDZK<$HF`CEwl<@ zOtc6W7@YOW?oPQ)?LhzN1;o=d7ee0tNgsvBrTLd~0T|G68hm^&R7JZBL%_HcRl%Ae z*L~`?;5UX5Zqv={JZ$)wX{gGL*?Sqs6@vXUCk2#`4hO&L^W*v7h)*KJs?(w*e-MZn z1!Eq!_>3Ir8T+UjykXwTgpL1MVMoRX>46WTwvoaP;%;$l&ud=V>|kul@*BFy*L-r; z^*M4*MCGhu*pDolpRC8SPMi@H4ZeP|wME*$nQ=Jr70a#2>&^C8^%M!_d}%SZoJZhA zG40~IM?P^adWvz8?n>mZ_Q5Wp15;HzYNt`4M0NP|_FOguv@|0&2Iv-LJh)X;W$PLT zPn_h&C$^0@R7L2`Cp$77`3n?NKCckJXtV5iJYZit$fX`BT7DF@xOja>;b7oeIx`*6 zM%~)5iTwp>INAHe1G2GhAwQ!mhNXKkg83`duJLEeTK16p&3Y5San$(aY=u&%!lz2W zq#9ZnBoiDvFGC4imneQ^r`LdijPrY=uZtCSUm4OTC@Goj;1fQB4VK_D8b^x1e$~o= zd}%DQeY|jTK);6mtc=3}u#3HcF5L3mHz0B#tK7tQV+3h_MI3+oRk1ui-g{UG4L?Qq z=i|ZwDH8|2K{!wqbf4mxLKJN=IIU5}=Ps6)DxL{ZUDa)YpKc+1NKdvJS~!u{hsoPr zR;Jo?zYm(YLKNC&xzrEKZ?A@)*u-AT>4VI^Wz!xl`-n+M(IPJ*^|{kYeP^U?G|LCi zv=vK?Hj@itZa$6_K!hX^cj|+1zy>SQRc(aH_b^-|tBP>tiNK3m;_AXG`~VpB?R>|4A7+n8!#bNuLKIIxa*~qqfnr zk0)Gko}$G%q5cTsnb4jR&-t=M9E<8JDs^79B^Q!hsHhP|<1A6+s<#QpAqOjukRKrV zl?f$Kr*m#%Qql?O;3CfKb7@7(*PI%2rwK-c^3WcmonPnEYD5`#-+3xXLL2AD&j`S2 zz5Rgd;MOdbsc(Rp=~^^LI2O|*t5WC?c6)mSK8b`C@>!w1t)Yh`cWTm_P@@Ot;?*mX zM4ectp=8;#(Aw7Iz-&qu2DEcdNZrKri9Q5b@9WQI(DI^myoG#K zGGr2y%h}Bv!rBU9+s9jy<4wouHGRp8p*PQDd#^41QOF7wa;L&1rIXm^)+gkPXDP*Y z82!8WS`LSPT3j_;4x4S2#!yPLD1TLbk^Wo1)T$d5UlytS) zG6uSGw*oGQr)9}FKJ$*LgE(|J^RpLYK6)hyWFOOejkD8UZdc@`Ye3__*+R+>ukaeJ zD8qh%HJCT8XIY_2H)Q8di=l`7!gjihe!KFR&#H(>a{RW6Llk3M{QiHbhzFkf5>ZrbRe~8jpchC#gV%gCO?ar4Shf z%h7PF`Z~UF%vZrZf|i^AT9@yJY0}(yE1M9y(4V5|%_^&}-0lb+?=_hoC*^XRm3&Cj z!z|-TAl6QSAO7swEx5ohV$Em#>Oi8u}@aXRPH5Fz$B~fvspcT3)j1xusrXj&v zUnfQF%^8iQQM|F-ce*k$s_ID(-IvQlEhacJU@aUNEJ#zxza%n zp}0q#urBfc{Wb*HXYmg@_ixX?{-bI0A8stav}7TC+i}az%)`dP%gzeq*w{F^nR$6w zxqyAJz!uOSJT(J$;{KrNmY4JIowUGreBX5I>iKJ{?caN9|Iup8^9$Re`uF$!1zT-- zei`k5Q>!h{FT4zJ?EZ^ZTOdUD_e1-x)wW7g!I1#iYI~yfc1kEM1K$sJhpb!=ToTot zkup3lTv$^dK2deZedYcJrKQ3^R#%2g7xIZUNsHs^vjmQp`&UNM3%7mdNRL;`R35mV zszS+m6N8!10h?{*x4e~U9iI$Dx>F`;uWG(0XvtF(pHMVj_PsMGtF}Egl+M|zh*V|X zwH_^iU(~_Ww~UkAByKHNsZ-H&_>hw?sVBCK=YzJe5frx(k~S7`EMx8+^Lm}Q-n86A z)hx0n+9&w|PHO|zYi1UvFkqI~cy^@6u4+(?^Ey2Mt=LE|qWEHuL!W0u?h?6}d#|Ld zRYM|#oNX_?iu3i=BSETw`Mr=q8nNdaI?y3@s8p`)>!ltGmR;tpBg+ug~=unk1*%7mA`^nTg#Rbamca zxV+C~S~j@DAR@Z2AW&g{@iMDF*0|B1YEEIN$dT}Js>P(JC;MwbBEiMW9Cu@GH^NcV z_ZMN?cqRlHVY5TUWD5^r&uy(dm0Y8IPgemP?-hulKYG(Ka|P!o-pEDibiSF|f7H6> z;%<#%nBZZY7%fQO(F6=xqH4fcderb`Fui;-D|FuFJnuattkJXqK1R*wN-X<)9Ts22 zDyT%5w~<@g4kA&FOYa};kR7z>ma4Uv*Nnf8>Wc0$fwJ;WBXSJaVGcARCe-k{Qz^nD zz+Bx=SOnHAw1tYo)6~IUym3%lLwR?GCR_z+cq{MA@Q4s`=xDTU1ohORqy(AB#H$be z;MO&(dZBsW7*&&a_5*=_^2_ziiScV|58rl;2ME%e0gvA=3cpSj|IxDXM~lLL+A#e4 z`gDJtxBlhF`dxeMCi_3PPnQQ|O6R)+`PrxY<33#;P(fq%?>a1g_UZl#!vP_@f5^fg zNV@;@PWe~%>GFa~GXKx%)8+lG9RH(n=lBjn*B&pnIfVNYcz@zj>!!PmSt8g2*oIquQ64 zeOvPiS`#-P-qlQjlA=Vj_|w%qhyEa@8D(h(H03VlMOhHK&7j$KB^4?=q0-sLKy}ks z-A`<1b>+f?Ts?$#G#u+#5>Oks$&}pAxC%rAQ*X6h+a{G&w>sOxladTCQjD!!A1_q1*8U^qWJc}p3yMChR@TinBoa$u3f8)RP1 zPi@z`iFUFo81y`iyDOS0h#{4C&iuNTM1o*9c;h;&g03E$>Q*d8pmyWYL+;wm)yeHW zYz(a*#qZZeUQm&9;1B+m(H4yD`K2QT@o zeKCmR1^AYf{@E}4caobIRFazmIM(0Xr>b%e1Hy1i+gSQ}(?^*T-l`fa?Kh53#8k`Z z+auWqS$*Fmw0x8^z;F&7X)=7JCs6#1Sx-0JJEAQ*mP)8`IrV_7(ZG$lmWN2{7?C}j zUc7Xyd@BD^^hGFag5ps=Vy`dn{U%F5&s+_1^SU6rNDbvDI?+J~75oeg5pq0e6Q4MRSj!N< z{$7$v0A~|%Hn^oOHK#!7_0)uuhVoyWQ}i#R+sJw zDm|jksa3ESz6LuIu~Byn!YVq#x5Mu}dREy+q@8d+!2t921P0QbB5U4fu;D+w3Ln3-rEKC(pJ zY2KiX={#cHO?~d#4SR~(7Ok}dlJzVW{qucXxz8c}KR7#}3g$njvmd|;szm&5-}(R6 z*$-d^RrRp}oz%X$mlF6ffNefvPZjeiE-4^|CM?DkbcHuFGH~P#5!~3G+VT|_e?e>O$bI3^a^;*K!)FZ>8y&e( z_@?YOOJVqBHQvPv!N(*BeCIzn<)8}6pDqUfViyAdE67^)yY}AyH7*7KR#3(0pYCD+ z09t*4wz9GRbTRl%f(3vTROR{KQSa+g;kQCcUz-O*V`vPd{ZQ>%TxBXarHA4{XmKpCgc8q(8!|7tQ5bH~c z?T+;@QwoWyHt`o&S4UaZO!L=kpl3drS_B<@+~ln8jrgLHWYFhy@M6ppZp!+e0O!pI zGwj3wsgha@WE-CDi0&Lio&m!XOkR}k2(#=AMkF(9>Jp#0$nMFU`XZCTA!6OL6IAux zXW_qJZNF)d{iBNHcQgEdYv2H2163-02S8{2|7hR=b+ar0Kr#3y0CvC%%HO{J zVaqqBt)N5+q~vb2F5y&X%~D5=p1TA*%Om|Lj6)Z0hmyGvIA-|>N;>*{ZQC97odI#{ zQ_CbVn6mskC#?>x#!(9vKW*RpCoR`!8~XkanoMD{$1=Qk@Do*y*O)n0UrwQO^em=q z)oZ4(^qwJDzp{8YU~1}uU;V`GRR&2)t4cISns=`it}L|U?I(_7YR6X2C^AUJk&Fj{ps!8{?O7$ zoKMM1)sakVCW}}7yjIA#d9@fcAI?({pfdwdCFz?nJ&PWcyqRH=I-*IhnAY@{QBAtODG-Hrg5@rgM=nBQSYrvoK;(snw$TeOU*V#2b=qDgCg>hu(>EWNShlbjXAnERS$O2q8pn zMi!(iGD4IX>wjHM$qu3T`Vx&dhcRP!i`>bDwxEEfDanm;HCjJwsyL=qLMIGk%pA*x zwp>>noBahF_g<@P-t6U2DGz2)KiuzmBovrEsP_r3qlzTDa7>sD1F8ffR51ljV@Jn-y~8+c#8 z%9}Is`@`X1RNY8E7W5x#?4PrvmB2Ji&BDm}DE1jStmumuUh0de`u^&&%QOYk&)R1P z{CV}_0;+f(!XY&wStt~nC7ZqINdnJD`HPwZtae$cC=J}UHZc65v%k*E6Cug_`7+~0 zDu_7P!7l-Zy2r0VtAi+mF~qKkCZ|SBZrm`Rr>f@R!ReS%!_AJ@bvL;2h^oBOM%odG z79TWQhgxI4!N+L`haMbGU?JQSK|2zNPeeY}k%qqFm^eDR@lxgzYE3j4GYi=E<}nRE z-L~rwcL;+!q`;VWl6e07v*{QxpdW912vJ^Q^yX|+{1fC zy{oGO%QLU?+W3ZXB~8!K6bH?*yG`7?gRRsP&ys2A-O;i9E+8Q(7x>kJ*BMO9aY*TS zY)gjN=-K;N;rB+`8D}*-Cz-J)bsZDkC(AM`%MP?Na)b7&T3Y(b7mJSyS3d+arDDV= zq+o>Ue_*2bd5I(!Y74NxVNU5+@x3r-5HL-I4kFlPE3|hUaTHEX$pH_ym(P7m#AE|) zz4r8oc8b&<^)k=OU^CcfT}9j$usYf}&U;uLg(7g|exYsvPbs8)LL;8~^kSL#S!3Uq zp(FQDSd3N3n}O6OJae0~MlY}AH#OCLhFA z@6~p0tw~M*aE4}Q2UgzMe<44Bw+SqVYm0FZuknjW@B|Y$%AQ9q&BnT}-F&2V%2mAj z`1&?r&IK4&zrUJ5&r|xzvH?9c0YK+n(9RwEPnPY6*$)7Y-&PO)=<5HoxF-MysC7U# z4z6$1ibA{y3eZR!^3XdpSC~}TYeG{4b?L!KZrY4-> zw$)~qkt&@jS(=hlE~^@0ES=}ES$u$VvMpnYwU?pXxI!N;lP4xqQB`UZzGL%2>V;H_ z{c~iA2_{6*IlIIw_CVNYcxh7Zn>Iy5E9Z9A=eJrDKD%3el( zJUzn`V%tTn5Ce4CB_ZY#cEyzrNZs|0lnTMc!^gxPe8<0^azM^R`VI;ae9MawzzPRF znWJ_~5i(4E;Y=9q^`OZ*1w&lnlSjrA+}cyMZv3Xz4f9ZK^Zj5J27IZPtip>{M4y?4 z&Y4c@4{iIOuveq@1a&TzTju`%0l$Ak0^~654%u zW8a5IBbixsfN~K@szjqEHSmRW;Ru!{);Fbs!71DBd`gZL1?o-|Gi@tccpoWna7^uV z3*+DsEGtub3OEdxiKvkOGP5b})L?ZxjHV5rSVgu&Od{cu|;svH3AT8Y?_>l&< zYd5YYk?$nj`&aGc5kaBnc@5XSG=oNA3zQimj7)7Hxdp@uGX`f+_=pa$GCFa|1cr-f z%4iAcWyzDhhBlPGoW&9#P%sb58HylkP8!*PJXF=Ib>9L1f~G-fP>*C*Th;0$XadDK z;Di0?jMXeMQ7TtMZXX;P^K$yi|G?qU!x!9mfYsm!b0VnPkL|naE@%8GGVtSx9cBa} zLQPK82`EM7g}XgGp(=q!N@E?NS-=T?9wR1i{5j2Rol0G)N{Eu8sZ|E(h_1{HrDQFS z#F14f_aSAs(?X!hi??b9Iy+%_MaLc>jz1<4_Oj$Nw&FF5Yf@y$}V&SiiUX~`AAAdlk`c1vK_t<|gJp)oN@LK4OJlt(x#WQ{Y|lN zg+te?E8d1qNG}cZMT{myHzzWMJ{4!&V(S;^4?3*)N=$rJ`F5lpc93Pk6P4k7Cd7hl za{zzQ1bfH?drP~ZL4qR7F zI~nSrFBwIVkXuGBkXJbJmKtFrK8x6e9@1nl~1v6!EhqYF6lasu!aynk3@R!qc4~3#lksB1mznBn z_1Ivgo5C+)7^$hKW%%IV-y9!&<@dV>XLNn$`upn-c-Me7eQ^B5HUFi!CMT#m`u`f& z?q3XX%r~+_;TG#}FSifCaI9>x(f#HN)z-)R;NrYnRPru2g zH%GAi=!CD6L8q+^hEHwzNtrAyjF8z(%{32PSYoi)_)+=eaE4z(3sVv>4u3GMf-D%n zLmK}q=8_X++4!Ab#sANtSpZ;(0kqZZe=E}X+dBnhq>-J6i{y=NdB8_ypwjrJDyMs{XD<{CMF(Z_#b zt`V3?`tRWyv$g)_{&!gYVG8C^1_x!hc>p1K6X%BpSQ^Qv);`i21Fy)Ir0r(Lx(+vG zS3eGCY7heL|8gZc9K%iqUXo}%+}G=O2#w)4j_a>`vzjX&>ARsg z&JkJF3c;QeSMQ&vm^SnZNpvfA7FRx3{7~poCy_#Y1tz(-(oy_VVByw9R zz^X&mOL-ZFv+`&oHXm^^43Vo3KCMccW;G12&Jj6YyT;*3qaG;?>I%)R=O^f8HWfQM zAzTkK$v!(d!05h%^D5Dud{`Fm!+iM8?co8ctFR-=Snj9WhMV1X{(T=5BDO%AaTVQt zCO)fN+IjLaWe@dpOgJ^Dg8D$y7X@&D9mc>9ChS;B<0F0$-ciEzTs%B-QNqFF7zw6H ztWw~Sjyw?Q#@);mMsmy|MTWuS?6eET%G$ES4v!%x)R2tlXy};fV37HS0(cj;LOEb% zZt#cIAJybp4&Z7+Njl96A)r1+Pfb8rbAoBlgn{s7(>6`6E)Rx@5jzVOX3R^%EQ5R^ zOr<{`Cd^xU?I27g|4Q44UDe3KEZElhFu{-6(m)WomBP@KUUj-}cWk+jEbJsK7sZBsgCS9s(H$7ISXE&W@=L|*|cbY>Q zn+^knq~Q{5*5QQCvB zsf2733iG}K&7>delypw;*1d^`QT7Fk>#a6gIGz)c=k8rw7^%1Bx z^w&0g_4aJ<`uqg<QeZdwDzix2x=$mB}S~BT(qOR zd~P+N8I$nDQr?9a!_vM^{4yhf@IbtJ_t2pI{cQtJ%T5}s1rclsI;Y21LyzBW7j6l0 zt)WM^VuWFNh(2e!A~$rSWi^JJom)|!sT+0YDVI*RRbrJ|6rMqz+_rzZ1XbX(6UL-h zpSyfqg6nCWsryjf)p##5kr}<@>>zkM-_zL@bFUwHF`{zx&Z%GJ zjK~-9J*kA5Y}%Ea_5$U*H(!#nGGb5b87O(Vk<(gK7JgjxJ>k8^+c^6cD7#HQ;%ky zuttwf!Xv`CQPYZxt8r-z&HdG*J6!_~yS&r;Q8wepau8d8kmq>-|C1!D5UR2uz{U$(d0nNAxMWv z<@l;&DU^=GkE5*6@9eP!2o{O3(U%(CWql{G1K%Qq=WJG@^U73ue?_&UbM82o{*Bb^ z3S*Pv!i?-nfz@XjeGfw=dmAG>cPwt`=O`rn?XXwmpBS0>o;#dp(uJoKlJPJFkVNLI zPoPwzQ~Oy`dcDa}JbVdgKNop-*6~zC%7NOPzDZeXw4%+X5eFtO!OoE0n~A;yN6e$a2ZMUD3lXCYjcC z@8If!`AI7rPBF8gXwvNh+~KBZiC{VzFTxVha4){|7JWaP*PI^JZOm?^ZxNy&Q+x=# zft=)j#Q1|_19fBYFSJDjaDiIu{kPG=z+`#Q_D|oNvedJx08wf%Qw~=SXjclkP%JTK z3Pg@PVdhk5ZPM`3$w{;~zdEl10MK>vW3lxG^o7PJUI)GXEjsNu1+Zgr_w(_WAcEAlMBOX33J^J`^ z{)ysq}mphYQVt_28$O;f;j*)mSLG_*d3sCm*UEW|@uK)&A-9GVm0Gb}js* zmw#~Kf?9L^NiYA6UIsZ;?a!i@fdvlGF8@D)Ugic}nS5JL{OK(DchHd=RBiIpS@N&q zED7KSRnz@xgf%y)0`Dh~j5>C!pY{87^VgghP+F$`tw8dxX)vH1=0QqRgL< znu46o^4CO7L5@!Oi=w8Wr?LPaTK~3~_E$qqLC<3OiJJb2s42)HEI(1xf2}hpFQ~=I z?-t?z-We3+$e6!`GbqS`EMWj_?;pRaZBc-#Uu(f?DzWD>;L5f}EW4 zzZIkX?OFe?Fj^UV6DuGMD{ABBs%+sR=4kKa=wRXCM#_W0BIao4=%VIiVg`I&+`_}g z%tBR4^oI%Dq%6`FHdfYdKrc~tUIdoEQ&4Qc4HmGUibc!D9LPkm@c?1&-{|$l&nvKA z`kv`5_lT($sT~(4sV>~7iD+<$A&p0{2X%;yAw_o9nMI#_F+`VY0&BWA)JyoB^{1oX zWu@^%X7|@_HeamTx8SzOHd5&%zUQ1y=6HbLK#5|qxwZyeKg&7Ua{f$bwVFP~f2d{U zM?(w?_D}f}R@l^eR#oluzCs8J_zRO0`x|o77NBv#DEWHj49|~KbDd{*mzGw~42dwo zK8PJYdlzo_FpaguKdwvzcD#>W?ImGqiK`EmV2!}?c(bzU{`^X)DK=b*9vzHzd8~_G z=s1P0k&3$l6U>`r9&-jfAdq6Y9|u8710D=-w)lb3J*3Sehz~sBBG4cNQCJ`r?m}#C z3^7PJA1q*fKk~3J&Z$YTND*wy*BEyl0!@jc_sfDQ8yzzktG?jvzzn*>M+kQa(nH8L zINSiQMRW&K{>7OxeXwpPw~HZFsb(qe@?ZaBiDs~Vj!376gBJr;`884CV148Bo<(s^ z1gPJzPVX%DWcUZxCe_@? zW_XhNRa^caKj01g0W4%NJjsms;y5R%E`w|^+Wx=2S0m)XqF=MwP9JkzSd zX@`G#Ew6;4{Ve-%jJ8+7j%oY}@Fy@~Q-Q}ua#_g-t{m~}xYSX!Z|}9F7dO9aBGeEB z%e(#J#pNDyGY`E7B^(Ij;SNT+fX*K4gt>H^{TcxdEV%_4wIt3d_o^278=3=&z=-lo zD8vhD8C92CUnD$&0Q+cn)jWfKkcAF>|2m8Zm|KXsRK!3K@O7vEL)3K#LjC{$v*Lq7 zS!I@ltRj0=DwT}L%BqkRXT+IzMG``p*;IB2*)t>A*>t#^m38N=!ySIFbNc@N?Ct%2 zjpyq*9?!?~`MR!Ty@gyION8BAq=PNkc~GXOQz=0dudg9WHCnu6p|rk+}lnPCB`#AU8QjDSol|v^@FlTbP<;AL_gF z%_;OhNK8iX{$-C>rd7INjHbge27e95wz|=CsFYk&p?KluK5`JR*rZZ@2fWa8_`*g@ zwSdXz%8~Bz+|Q7!Ca2v!7wPabXTkdH4%ZjSPbcB+r_U~eq3UGHxd_p{5Wo+gaMahR z%y^pl@1>&mfzAnHzh>f zLf-($VIyIYx-p$`8S}akk=n={9nLJbIJh>rFaLad6loj+K8i2N(JCtUBODrv|wj*k|7X{6CHgtzP`nf$Z0)(lQ1&%dS`YTns!1;;lM^Mi; zv@GmZEDwb942DnxR4RiF%yQ>Y5_be_mw!sMhX0_91(UqMVejxv4X+pqLGC&ouJVi= zRL4`Kumgyxanlx9I&x{~zZWOD4|Rt6+Uk2Qc59ZYeZ0OY8y`g2eqtqe9r+%?5_vP0 z{@+`^cCFvZO1lrax}fMS@9|1$cZIZ1rbA&~W4>o%8GG{`AxucN;&t*LMu@PAh8(a> zEb$H4Ec$S>&}+=r6<06~DwXA*l+X(h$lafl-azER4e8+2LP+LwHusZKlzFJ5Jq;xN z8+XwgHT?SaDO8A>mjy9`sTJy@$;X0;!2(~RZgaS`Jcs3o4o#*jz`Se(3C5N^dHkSedX>2S!K^mi$ zkf#71b1}*Jc!HNNkxq>?be*uX7`s=%{~m2f1n~cqXxb|hVN2x)PY-n@s6O6KtdkWs zU(DXi0v;ZEiE|%PhQ_+ZvcbP!yyQvmy78$`#&KAAwUJ70;`u<%{ZA(m#xl(}G~JjV=OBG#v(-nw>WB=39v)wR4E%3%K|Y#9cFfOT3ILy5-<~ zprB@4OjGmen24|I#+tW8Fi|QV7D&>PM9-O}ixrrZ&K-w(H8*}=;6iQxXlY$@gDKpq z6gB)J926{V%rk|=7qttwPWa7yHj)QlH3!pi2&;)26%yCg4%YQg_NWm`)d&M>djtCW zQm(}Y`G&Lb$f_Har0`c=U43_IiqTNxZ|Dt_lAAM_yraXX$Q=yx`ac#4-KUF-i#_tw zZ>{rogb-^&4f~r#cr1#KXklYBTLjiTfG&V3|I zvcB>LZx6rct6Z);DV4IZZ{0%{E2K@)f=zW1x7*aT=Msv%T1Dr&lVH0xb6pA1+u1X% z@U`ePR(B>H1#8$uwTIxE%duhsU=~G8U%Icf?hy+*YyW`57WM^$By-EVq~p)#PPav3 zu~AlS5i9<7OWy-&!^)%6b_cVgVE#P{^D#Zmr^h37ktaK@fGAqKO!^o~`k1(EtEPD& z0qfPK^s&zl5r2=UkEU#Auykt|Y#nPB(1@s=5tO_$iPe&uc%aB+`%9_GUlR|USgPI1 z8XDk`bh8kbmu_oWa&;oz&#ycl%(>sr(6G}DmFVHMKLLvA24cLBpoVkBMxY24 zxI32NYJ1Jw$t*YN4$%L=8gE@_6hr=>5PepHX~DAJt2Xq)VMYwco4K8FvJQNhC@ zC7TpwZ?`)t$tM@+)O?<+4~sas))oxbzd&cAQK^EI>0JRTRwn>?p)6l6 z=<&*zKnvVnz{x2}o9Su3123t@+KqnAfvOHkI4*3)Kou9F!}=T#)N_AL@<7TPrbe7% z(p;H}(I!P~ZvF8V&*?Ab0cH?>qgVzI2bkd6AZQ8$jg_@nPaHW<)#W<F28dA09&yecoejS+Ev;)tR1b%a31^1Y-0x@dt7{##e3 zq`!S)XV(QmiMZO1PK&LQ0L&yu!*=V8e~QPjiQu-&-2$MR@8VhUQ?ayEwwx4@lG5Em z5DwmI9*r@ZQCeDxzg!3o@R{OBqO8+HtYgsi49XP?C#MzCh%-FqzAI&#Y*%>^@2 z*W$^Myuw0>UzikMOjWz@&S18x0X@^adbW3~sKxyfo~iat4L2QE{BXGsaDWNkL{l(W zf&RY@o|OzP7#hOlAP;6iQp8F{>?^P5J_Vh zj!u0xBW9#&Z&nhKP#boz*|2Y9YHDh)n%s}2Gk zu(uLie|-Iw1Pkp{WrdXd^Q410Af_FZGW)WH+#orsnL0nLFG_SQSo*x;buD*cNf8VR zRWfRN4079PFbS+c9InK8_3`0Qi$)EKryoUd$w{Q-zvWSq^^P5>-zp0l%}8NsH#zE51&r*iNoAipZ&ra_3m z57h&xC4?ti)^C`rtcn?gR`E4Y)wb47&92)cuqRXL9;lVWG6 z?Swq4tlabmhOroaBvvVXef@PK#HLZZ@;b1p9VmP~DUg=wSVINkVBhj!cLYRlL{#ln zbW=$F2FwxoWE5c%A2s6B%r$wb@eEz7pM3LIf#=UP*5LBan!?NB#~`zk>|vIKM38QF zx`JeaB$pkNdOvUMC%x$Wz6;4~@gZRa#>G!wBy~tMIYFTZr~?8*sAv;)u!jP1`?ZtC zPv20}q0uQYmQ7)Sga_PrC4c&|;~bT)3kXJH1!h%in?;Dd15RBuWxip-nQc!HB>DU| z`X)zySGn7UC?`*ivpjvk-3bl##rE$_+Cg-CBAoB?Ohq7y0FI>wgP4IcjpV$H9s*!w z!QK`vdFmjh@@fZHI{ns?ZZbNNO^sh1u%g*U(s_V7aca=3VKp38K|NZEOnR+Zm_3#6Uct&jwtE%87I z5_1{D~A~B>ph|cX4GGthyNEpKTn|Id_BrqfHi_`#hf@Jnr z-Wer&))~cf9FW&vaab*$Dc*_C+T=Mx(?w5;>xLpH*>L@oFEWJK!z~Gm;N%<&^e7&Y zz`1ZDO0}+xS%h@9Lo^WedyZO*#I4^WEmoH^DH};Sn(n=8%wHx^t6MDI+ODVMmS~Pa z)bDKm0O70v3zDoucpPY_qvgn}KmJ-)NS^9NhE-cB5Jm9*{iAI#7Vef8DrZ%;B`U_U zLSDaSn+AreWBG59$IP#=&s=UTa9GyWgK$zlHH!lImsg77(F$31LS2fIs`M{YJficO z=>#KpM}oZT5Q6vP7A|YLMY>>3^m3yhm#E(omcYWM4F1XH^B1+j5Ajy6pNg+urbvGt zq@+Jz5mHcgE0-+anDn^_7ZB^upV7Yq5x(zHqc>k6SAUjwJ4Nhh{Gmyb0iqi~ z-j_@G(Y`pZH}#Dw6@5ste?^F`F}%nFiAi?SY0W+m+h65CTcL)auWIb0{=NLL`dpvb zi54KEH$MUjhO~h03GFXenn8rcCsuHYPB@<4AMuf4It}vsztn!T)vgE8;a4w~Q5+uO zr5ON6Iu&|+%CRcnwBIp61Pk)Tc^3=;yFy9~)$cP?bBtFg;`w1cThoA&Af+=vv6$fs zHkud_%wFe-obv#oA4>eX9foc`6%C(xP4nLF-emxr8J8C!fcSs~FCu;Ci{~w*C2RQc zaaA>Jr%1^c(4cgInF%?JNi3nbGGwJ+s6zO{(G1sk)d_LZ*BoJ5n&4r} z@EDJQ-oHV;S*gEoh-<8K&P-O>S)ygx*pHTXwVwLg*SV|eyn*AAll5i>hg$+-nK3f3 z(f|*ekFVUNhd>U^g}*^n!N(PhO>4yc;QyDlIT1WOi*p&r+`f0`f1mf6hl#F#KszhC z>HYu1`A>fMc`?2Bt3 z(5fYi@1iKLI{41DXw1j*O>jl$$H;&h4DJx zH-P*#%~61_km4#b%@8E%Bz4)?8gtbI8*4jOitwNIH-oB&-$_wk8uv(jYq=f| zY*z;VZ<$UeGvB7*M2!4MSs&wos+i_dB-pBRxG`LkshZ8}(1ENXIN&g-*g8QFEclN11il48@|;0M824<`pO z#MimhZ|BCnjV>OEdChU{w}44@W!mYQ8DMtH`A!D6ARQ(~j(!^n_BSirD)QLL=do5; zT&EPz#^zIA6aOIf8P@O~q~lkApZ#nF9`W$VRqDzEnrx1D=0ZgT=1ml(?up-A{T%>o#DPHA%mmu zZVrsI^jL)wwyOp1(l`D(6_%LJ@Rs-Eoqlw&y zWH|}f7v8?oaLA41fvPY3NG7JQ=rh-p zv(JMgQC@n3G5aP7Ua2Wc9O&b@Zw$F>q+xX||IaNM8M4YVmJn}&WHot3hMwVS$ivI3 zD+VrDUGbwoR;RQ*q<@dLQ1*`gO{wcvt%R1V6D%NlZY1O#>GR3UuCw2-f3D;huX*T1 zAuN7sUlsg)FbSRUbm&MS7dUZU<=_>8)UmvBNX#q#pO5|<53$s{M4luj(N>O6{6;7N zlRuXu4ha-v@8)mNdiGvIhKj6e|2?e6-?%p1>i7$)0 zkPyus*X%DvdiNlqiwk^D*{3|OX@mzYfKnO{5!xoK&9_VFKem!vPlC&-?} ztrWM~4s4jqc12Ge5^B9O`f?3vd@qQs8@h48K-s5Ows(9HGG*s*!EA&@FyFbcJwLvw zl}eZ>BY9^Xldo(D(ps+5lF4V4?H2!HmOas&kkFjR2)|8poB`|yz9&qQ>k}_o)SMRz zld7Z#SSv)=u6uDs>|!qd3s(VL3RW6fBAB?m3m#NQ9HcI{WsR>5c-UVjG)Q6wNg?wp z3y9dQW8Js9Co`Y_i)*0*VXPJN)VAQ?hX7Le8-P_}=f*9y3Un1AQqpU&lFvqJ7lRH| z*Jih02T%9C$s8w8y&*hnsK<5ykF1bw*gx@jykSvP0U?$hy4VPcq> zGK~jJ>0Ln&-8!K0k^0xkD*5iyuhF6jYb}NpKLfN|zZR`nZ zbNSFEy{j*z2E8tIu5MMOiSm-q;b+ZzX-{j8sr|WJ`XMS|Il`Q60;(`2-HR-xbY{R# z?_M3hS>wpYobJbM5^V!l!rpB?l2Fh9z^jU_6Avdqz)`mlV{bSZFqx|mbv95VuTIx4 zDKfcBvDLh?v$ztXZXy=9*WOwEaER$}Zvl$B+&WHQdK6n#CdYHZ2nL>0PV;w2@&_dP zUpm$?!ANKi$f1@iGxKOKombh7ecOz5+?RrTm306&B1aCO#4VuTIX{Mt;YlNHt;*>yA^mtOq4ouIht;Z~ZCQTJXhDU;V{3_JxREqD{lj3Nily z9eFp5_Mie__y8iz#>E>7az*`hq-jrR@Wa8QT!GO;A*-@G<*^Jkr(dv9t47++M>-gO zJ&*FpQ8qJODC`BO5-$QpkLvM?*+`h${1#;`rpIQvvdJEV7^BrHE?x)*O?XLO)M}_jJ6uviCsMNY_%z66LSp zfpui6(~fZ&1$iBxW9&nb^M*sC8Bq}b9J60gQ117uh5ob(Rq~wV1#c9E3iWqGPnk0R8-kw)ChmF`~U%#7YO8M3y*t_%c zv31)w((FCq!3EqWj(q$re^aCSbK|9wX>~POH^EC8j}gQla#>tcn3U{)t2CPtZQa`z z4ntEmHwVrGP^`U^>OgiW6mIcFtoW!lInfKcb8+J_0P-$s;o_$0kNn)vFeP>jV5gOA zeZ!wn+T_=rogm5<7t~lDxe|ysYdFn;Oy)T}D-7zC|AcbZ9v2Qg(kWH8$eaJ$B`KqK zf9ulV*A@ye|6R)2tQr;gy6Hf;OQg|1S*5$U-E%!4pdKD{jQI!N}gpHq@1lt~SES!w##R z_!Q1ZF_nMcZ+;I$2<{@F7K5lDP$=GDo|1az@mvFBQlwaPhEm<)$*bDEK#<$$?B_dB z=*Afu4%>b!d}w5y&JW7FapO9l#F}XSu%0t}U8*bZGqkZ{f=ExS_;l;|%M7RX?gice zt`oWJ5SypBT8qW9UabF+WYDnkpL}%wOs5rG6g0-%dBs4=l(yR!NAyLtzj@}Kztr-) z3>=?C^|dkx=VG-$F+iD;-hS?w_Qg$U*p@d3Q<1VTXnkS6QTgtYefLzYU(0RE1h0Z((Fm?5!yfD5Sb#3m?_dHq2XS-}9_>vwHYf;k0;$3tu*yFMJ7iJ-9*zIe6S48%63& zB2C$!NOjzsSm}YA(JD4h&$}wJ=%7Wyi;$T|ng#5xZ?2^A)_j)#Z2L2D=*I|VZC^JIzs zLas32XK|-S0E;Coq8oYvA$_Dre_29)q>eq<3->kLtfE_72;k>buxd+)@7~?c38F&S z5%IwzH%oVi5W?I}OQGj6!dRwqrIShD=2j)MpNTv?xBE#$?!0PfZ;rfdW1#r^RoUVc zkFhV+!>SS7g{os`$~jt5ElSo>RGHe{eGZH*_cn!RG!Z z4!g}DB107(vpDG~gj$)5Yf=c#x<%SlXD1us|ER!$D#-1bJ8@T9N}d|_{k9AheMYI$ z?q2Z7@r}*Q_N36$GrV7*y`8qTrgIp~`j%3)z%}Mtrxx%tS+v^UGWEj+jt7>`HP1uM zedfo1v`%?nMbk#0gUa69hp1 z?FTAjlh~1~g{k!_ZG^kyeZ^Tl8JjBdSvw1Ruu=5{KSa+L>I<*z|1VLh(6<1h8@H}d>t(j|AiMm2Vn7bRj zrS^P+cqLL@mXu^Q>W=V)%;KUQ*4*Km!o<}4`P8+d?iBW)H1q;zB8qC%RCl{xo-=#& zb8$Uv)x*TUP3UBJcv6MXfQ~#~Vglv9Sxej{5S5J1ds_Y3`=UB_`S0lk(1k)f+H5Sg z4Xpo|D_+9iO;fRVyL}7ea;5x{?aHH-dC=7u+jHhjNasCd@-@2yurX?NV!j}$FhKqD z0a|?;#%mniwtjcK*u^sK;NhE66lIHPMB9>Q!&jC4mHKt0vnBP5vm&_mvwKWuhlG@l z)t3PmH-qaAFkfz@CA#Ho+o|Fb}H=sujXG{A^)YaFub(xi$V%^^uVe zN9V&4o0wR^n%V+V!bcJM$3>lx-6qk#cWN`hylhWgeyfj*Ve=1m$ATeQNqhRS`4 z$S#KQ3T&%5)v3O`kwQGoBp_@Np8L!4oP~bMx6qD?d!Sk%-cWv zShW2v(FJ{yQ*MyP_i`c-o#^MobbAX}*%QvMK>E@LoN80aUSNr4ki641bQR}z?X!l& zhxb9P*ZdF>LQ2>}eq1P!7{nhR;kMI#%x^TogKI}AZ~g??A+x2TB5$}bQ%w5t;4=(7 zH=PTd?^bb9@lBe%S{du!yHyF3%oSVf*{FJbg!Jj`{|l0=gn68u3j$3AvovdewuiTq zJJI?Ld}&+J+lw`TUKMfE zJ>jE89`3OqI|KcdWwZ716SFkCAn}(oXazr;N_lr2;Ics9#IFn(Q`iAQhdoi_|ecfr>Hu3I}lK%|9kfTSl{u6fL@tL8~$%3Xv zJ_G1mH3A>*=17~IGHcq}#P$l`+oF0UUXQis!Z!oCCbym~d|~_bYgh)rTu^HOl({|z zKMLBN*LcBHfX>vFPu#aH00qwJxs{!+Q9%{_+6rML*|)nEtNb;qq)-M|)MxDSIl~G- zQVrPWDrvvns$*NA3F+G5J|XnQcTIb@y0RQ*X)IjUO{WDccY>WZ5=iAy9o`7F14~?R z12Yz*%PTDMX?_`Fg062_M?Qb1>L!&^lT^A_InP5@1T?+RkC_=+C-+T2`bYExJ+@s| zKy*QU%egH0uy%e^Y1+J@MiRPbg?Tbuz5%Wp7c6j`Cx~$StBaA7Eo@_>fe+U;++rJb zUAeHOEfU1il?A-K{pML6MRLNMBmDOxy}vVHQfz|PU@kkkJ5Fv&C5GPVgRgvf_IJUa zXX*%Pb}M?;hmER`D&w!E()u7K>6Lk&=PoVfJ28x`>DPihXNaTrgwfDN8J zXahj2s7hOd5_=0!Lo+)6aDe-6cC&>GY7t-|ormu7eGW?xuiK}JiLpjxp;{W&8xwXiJy|^5j;sl6^TJT3Rc9D2nIQoZO~) ziJ{Ts5lIa&fDHj9YvzJo+`rWcfH&A^Vr@rwspnAHYh?}Hk7t;&egeg?R|{9V&ZJ#x z2TL8vJQ#i@6C#_~r^@YYr{i5ZJ&)bArXYL#=T`G8BG+H}uDB~jC)CpDu#=PaldNGhL8-zOhH{%Qta!$1vnbR428;{kF}wT{ zY7N|bi5aI~NW~P@!8<_Uk9~g1=q|c7#Nj@+gAY$8fWmGJk2FBgQZU%sLr{6NHuWeK zVmMUdtL=BYT!WGX5xX_vz77x5CXMTS5bBjh1}uOp0=c91!7=}uQ^y8~`2bxr73p1i zUBFKVYRRF9xnHR(!I94LeT&@IWc}*63#?4Vs8{^2{0{Cu18^S3mK4tbs5W=Z$x?V= zGLqP%Rkt2G7V$Ianl8@z*v?8df$i;7Zh@%VLbT~I(ONBMzDmzYfSi?ijz(+;IVnww zpb*Gqd!zOy-oMn=*;>kFOPE~lDri%N=`xD9Nds!K&h$HHY5;#Fddw*>6}9!uqu^{W z9a(fz(G#ym-QVdvvD+J)(V{Y22Be~$9oJvY6q3Sj#`sLNY;ug_KT4NANLyZgb$#+i zwX{-D!t~7P9~YM%=ATiL@Ud?GGgkqGqr!2ts$PJ<%(7ZjGo6=^)!GNygm|7eo29Rv zgt?Cg{4v&_C)}Dt2nPSya@G-@$t#mBC3=qBld<}sd8I{YnCJAD)vbDPVThg_nv#LW zx}E0Ab}H=I;Ej~^*k5ZGx2*HEd3j;XQhN+-AGFMaOg4clEjT*d8k2YVxFV-xK-?1# zJ5}%*bo}>uFv)%6koa8Su&2D@<`7kiLyXKQH}QV-jcxgy)WgZT&r&DD zGreIUn(R~WKF8^fN_RE_+_4XE?Wv+TsFtxi&MFCzaJtdkA$6d{NNUL$GgM71p2_-ew4LhijqSzRh>{~R8|r9&Jw`C2Nw6A#SP9vkXaLS{Q%szDb(VK2q{ih$IITLa1N z6?{$-YkDsU4k`0C@($QgKadtz)w)Tf*5+2Za}wG4**oPMJlLgQM*w!Ep?3THhXw9^ zpKrPDJzI%75f*;y$rB6XoiUpR_LJKms(iUE7|33DnTQN@3}cTwL7W)6{tQ_81}l?j z$jIntnc(#`bVAjpaROh8(k4o}2g=3d6Mla;LdN4MzEB5V_Bo@#v42tBUm~0J6gg3$A+yb{6C1(c9@Hm20JUv@BCjn;DJ&Y5>Mt$^qUin>Q-@gU|4 z-~)$hjOO;W(`r6l=&m7ENYQHtUdXjvuH9{?zW1+B=+KkFBYg(**g|Wh(_%!6-sC25 zz-$r?JSw&o*y6aXmi7L@KJ&^}dQw~NG{XYuLx|~Ru-_j7+Qr4Y=9WoakoTn*+Ti6k z@qPolM`DRkO&=%9QaQ-gP1eDf;|4)=_ao(CS+z_2bo&cEY~Bq^uIpPrp|s{=?1Sa6 z08z;2xVWsqM1ZE|{k*bEino5h%Mbkg)cv8%d>(~JyB+!`xmjY>g$QZ@sAM zXXC`W1+$=SY;=Eakcp>2_xgZfYVLl-lD2Y2NT=Dx&t1SKfnF;j$lW=75KolVDf{XA--bGSkWHNjmD_zCP3C3bj**(faA9@aFNn}JP348aDB{d^9!B5F z7Z1UEO>WyPOzMgyn!uArztG*a{9SVn6qHn5K8l}iKX&bFLG?}zQ-S8ZlN&~6-E-s{ zqaTM5t=|~O)cif$3gVI5Q`ZBf0(jdDK*UwcI%4c3H$#PL1+0fB$sh9UdhB(jsBjRH zxY##f489K3RoTDc-*&pb14weR^OIHzKsqr>r^9Kmbw18G{AyLGmABYtmVnRzaS|5F z75dzkeKG>>TU$1)nKBu`zYQRFRfC2^C3N%q?pAr>Pe|~49Sh&{xB)`nP;eBgL3m@U z;6F#@))z0$c_4rmd*=6Sut{0F8^BA}u-WII0Yupv{oOoorZB(3bwDs>M>Q-rLPV~C zwzu0P7Qv}wk6R4^T{=*zF-*8KXbZAx&~#Tj|Gpkv>FnG}z3p895Fpbqg&SYh;Fbd&S3Bi9Of(rsFFI#?#{8Vq8gdm74P!FP6tO}7zJ2f)Fw3VMQx5aSh z0l6n>7VBxYSr67)qsAWjd}l|Nds%UE4VhhWqN8{NB=_&SmY*Ttt^2I*CYG9rirS@)vA{}S1gsNnrIixorE+D)WvyNkRs00hhW4Em z@V75^7v&!iOIR}UEu&4~$gMV;cS%akq>7>0`JD|8&kirO%pY4AaJ%iKoCk0LfbJ>Z zx~dL4KNsx4a{eN!k7wtHO8&8>6hilZ`2*uam)-H!Fb)#l!AWeHQITV*KDeI@yh>`~ zFq3)w9?NS`7Y%EeCprE^qj6MAPx5Ok9kz70t zx@bqldPq@8kxK_ePi|&fVEKk!&aWFk^qZM0B77nhkHj>nGy_`)!?7 z*u!Z66_}ZDOw%>&69DtTb%q}7@6E=DQ(=vJ<2g=3>o%b7;1X%7F8SQw)X&%3o0*>4uRTU3-dolAYh0aQADuQyvu4#1c)Q^R5!afR7@%EN3S z+7`YuPz@&dJ718u_{U*DMmta&begSAsv8{vP(DcO0lTw@uMn$u9WHEffBre+K~J#< zAQU&+yyk359TL^S9qkBzBCC=CTZOmHHSLD>ReQ|0XLbb^ z#;>C{6NLNt_q_nN_I$y20;CGPX`{-k;(mUEO?LMNnaJUI?GLF_MjFmiuR}@=`_6>{ zAc76Gt(X8hZ?2hBC0$!qyrwzIM&ERQ8Ec!dOP!noxWBW(^VACc@ToqR$i}=K6&8VXEP#ezPGEohP-T> zR$`<-Y!o|q7PU8)HuZ$HxP)$(*TVZ!cN_S>YbRqW4F5_m9j`T4bGJ=w7{5cjlu%kX zXUS)bTyI`gV)|lIo2_j{Lq00+kzuxWpZWx6Q!~5l4QLp>_roE2V66kTQ1T)7HBIgRpf%14*`@g?Yv}i$ z-`_)BB$LX;!=8}1U8%ZHElK$?mb@WyaP;i^_$ZPUZg4@DLP2lS{14lz>z&|UaQvQ> z2-!V8`k*v6nPMgET3eNa(@e8v=;-w9iFN5ubTRv z8-7pu`V7$CwkMWFEtHtv^HndE+hF<(TkceF}40* z;D2IQ=$4#D)w@_)VC447a@PxUKh?M_F(LL+4g4qV<RC&`WV=>m{C5Fts_p5UkLUmoi<=UTT7p-~WG?eRwl z*za+cR8WYaElNTW)~x0*?Ys5$2dmYm3d}8D3ZA120HGE%1{P$vJT&^Ne7a$eYEJ^1 zG^&{7hRVM(Y%9DC)KhR4eqnMO?Clya(+$bB;w;b{!(jfShTX^~p4>nUaqIiA{*j)F zyH(M+MBdR<0w2qm0)7I(J$)+alwlf3*ASc)8*>UZ9N1ja-QtAU$Q`52q;cnzlPD<# z&{#9AW6s&DeGW`sz7P^!%iTv$1aSlc(P<(g2I6I2H%hvJQ}h8xTFO1> z*sDpvl?186Ws!1`Sw5m0@ zbI?{X{)d8|^5VshAJ2JxAwD-Zx<8yofSIq(%!mHX%TeR-*jre1d!u(1LwN9+pN^ig z!yFUm_Kll{J~P?LUZk#Qqf2Ey&DpcGSSz}{>wLobqIoM`|G}tx(Y^Q9+VLwDsIg}` zHlbqHm(C~$RUCx6K-u#(1GYKC^6%Y@y-+%2;Z!1_*|EFb7IU^U(#!vQp?1%GWdwXZ zL>V!krlYNMyUzO8XH|m>j(_H*M-rWCeZUQ+Q3_C?gq*qfW$@{aR_Rb-v#pRy-g=OM zt1Z30M4ag}&l7SpCCIw@iink8*LhU^7M}6p)nHFBTfnK^`@pfB>al1@&{Eh~IgtZIur! zG%vHPU0iE%9cd4Dk@LI#Jy}m8jv&AAj$_?4kKTb6i(j~H_K`rGF};Dm2XI|bjw{jPVZU7H;b z9ZSkJh}aE2{okz2+}%%^#VDH!hKk6yLzk*j>Om#CsQ-V`crh>7-0?;?s=TLy zX!!f&yq+u*^)=&?gMeLFlx5@?W`|=oX2_0h^7l3aCAd8Xe%XVE;_6>!>Z#SBez^PA z#S`k7({tP$z}}A33F(#N z%vFQDpilxg=pg)Jbv0rp;Ctd#_Mt%S*w2JZG;)q=Gz0JW=?2QvHg}J?6{hR;OuiOV zLwguy4n6HS@xQ6943qqS;x%G2E7J;8u2Ezt4YjJyREQqayM!3^FaNn-qj5j8ed&5x ztHFg{C53nQuY;dPIWmj)jm{jZ`=}c_dEsNy2U)L{frKCYP^$jsYw;R zx>mWeCMvX5cTNi)H+srhLVVNLggo)Tm7_Tw#6tDQt6b+r_yc*PK2j=(g@8C zVOK&HE_=*ZgXs5UR7a@8_!tGG@dXdbdqFI%Sq(%qU1=p1tScB;nXg6rH&zfmxAs29 zu3loMzBc;a@Ykx=bV3zDB5qih@89`C`~>L&&7)7B9{en8c=trjL^6{y;nZ0PftbX(AeR#1meg0I`huFXB4%JJV;e5Aj>Z4ZU z1YN-UN9y}Q%5=p+&rJO|hdhIgY`)j?gtec8Ro&G_S4Qksy|fDrwjpqMd?2`|d8DgN zvF#4}(P(F-1fApRdYH?{n~*-pzFCjruTpH@^oWH3RqlKLzuK)QTTd@)yJ{4uiO^BX zFrFT2{T*C!ydo^v&+B$9&6hON^%AlT{7Fb$s9Z<)>NhgK^S#16b>Ks{@?%cqg1CMgcKPOGNK6CBxG+g4oNo0 zCR?R4Lc`u<&+JVp$=>tWd+$Ae*U{_!{rvuV-EO^{$MZ3+$2IQP{kk3w=?8`r5@^cE zW+^D@``;wue$;l5)%r1oWpZ6gCDrix*<{&U&9)r57kknqpm{Pzp(FGE|Lc#`$Of80 z7YWOZ2U?8JS5--TCdzR+YMNyT>QE=KC)y9bAJZPLsmAU&xsqIf643u7;Kxt%LYNRp z;uBwT*CG$fGa{*ta%W>lSY4{n*RvPo4TqIa2wTcpi`{yHY*hZ=VIj2pmoCkW3vxKd zHnS=S7c$wL5dCmJN)00%nYI7PpL&nfXqaLa>9}&mS_Pwf_)_M>KEB{|wFdwH37>E! z8+Q`pQ)>^w2+_HqjHXZ$^AO#j!r}^I>n6^h+A1Og(?Z%OiluU$sGXQcbA~&P+WS{h zKs^7`x1L6g_%Gr2<#;3Jh5czUq-tLurA7MgWp^4JU9auE+G*-{BysdX<(1S&^iGaP zv_s0X5V~yV%HvA+T@D81|BZ9&J(=Gds4ybc3PiD_IHQg8q?QIR{4T}!t@8-lTIi{m zGEvv(^GOr(nJMynFP$(%_ljH9x4U+$H(sE;xwwueH{+Sc=(M5*#n_wTex&; zjSznw*?X;KX0(E`0+@$F&-CPC+_cX2Y=nH(4sDJZW+5YIv~+Sn4LYOCU+Gz*Zt%@i z53Z!_R(zSUne!g3bE5A#qD;I{?egWI{3X3r-v5oeYwDu;IuF^K8=hH&WC|H#Rh#Ta zeQ7dIl~yR!MQs-+G|$iB1Q~Y8#tm_(Mh)jLkH45G_tq6s@?h9X?qyO_?V6ov^4_r- z$-DewQDN=3>6*gFu)Mr%<1@WA|EB;HQd=hzIA zF+%u*-9N9NDE55I!whDsD4=S1uAE*{&lm0O?XnRMOD6*OlI3G{G&Q9}z#zrRzoF)5 zm+ZD1B;wJ_<;`wpqL;aOnTSqSkM?GK_3GOZ89Zw+D5yfDZ>7u5 zRkDYv_6t4ex7zem9fSzsSSJ7LoVM0x%|*gOFCtZ0TCd~RdN*Dused|iqShp&=otCF zqi65IcZ!ju<%RTKu?(NDm!ReZEWH3T8(S=ots!*9nv!oADtBbF|3-@twyHdo{W4Ch zPT(cX|GU9eLvh}xd;E1y?d5|(ZI;CjLVtZsfqfKM9qc;2vX2gSs<#KsECveJqNaGO zR@%SSWoqPy1xZUFJV)n+9Aoo{)!&X-6#Gn();65UU3{}Uk8!`<^Fh2rWj03$DWA+d$ z`cP=8_hBE8cqZ%hp%%Phu5}@9>8OQYf}p{r!$7ft1Pbp;Nl7^$ZS}I1FR~YFWSf0j zhziou(UBVhQ6_lxUej+xd9Z?5h*g?z**Q12kU}Q-q_lrpo_y$6dbM{7w+~6_i|0Mw zFej`OmVqoka9kdAS*cWSNgU*|7&wGxCjG^hRHs`v3O-UvWp>iR+9FC(oQ5)nF z_gPkdGJS1u5%|_GYF_I0FwdsSdbzB{r7)-|GXeU^hNj{UxL6D$!9m2uH#9WtZOn`~ zj<~HeOf8R8$CkAdBB-BtC6?$*9C8v6p~=zhOHY(Z>cF>zr2q8vB#+#3vn0{z@ElKiW@9OjO{8#qS2cc}E=Ly8XCKX)vAU>dn*bnnwuR zmOHLc!VeaDvKGV&(V_MB!@~Q?CY{Na)kj>?%n$+n(EUhKXmHLE54E)rKhhXz#qjYJ z19EI>owRn`_SS>b$-{mbrzR%8obO629&s<9nJmhE)Vud98&yszmug1*uG30@e#Gv%F|(lH@l>cTx;s6%*Q-dY7)`_=7X_{N zh8#zh#th-U+dDh+z5}84)Z9ypq3!hexa-mzPtGqa&4!n;Fim=Jk|7f?kJdIPl9ERS>yIRzDG7E z22EC0zrZs1;XUgbPkeOyLaeTf?}z|{4sQ*%|Hi4BR#Z`WXws30L6Uy&wdPN^MN@fT>aH9~<%2<6-bW0h479y-*= zYOgRLA1jIbm>FWsW&^3NQuTQBH3?mfJUB9HbsidfD;mnX;=-R2C5oLhNb;F)-@jYc zcwHi!dhfjVaOiDQ^_LyIm-E2(84QiJe<$XcqNR7FI>zk@?>?9m2Y8rvCO1b~ zRypmi>TOkby<`VzX)2w87K66bppZtRyIES?+CCg^N7hYgODr~9;&0t3a~|;KMy-^a zOcFU>K~30?olBm8| z=C9BXEnqkUgwDV^?!QIT zCw%)RAYWd&_JAl2W zfEd~uiyOmIy0OmlXeumQA>Afx@RP6t!&E9>5zq-|Szsyd%C-eK53Ab#m;I-!G$q^?BH=Cy42b!RdULqIzr- z%*^yOlKRv5f2Z&c)(gH(!)?*`iOI=Ic<`B7Mf+TEe!mSuk97AAMhuP4e(w^p zJzZuiB?|{I^09ol_;7ob=7FblOGIV^n{9}qO6?dpir6o*i;0PG?iG_;Rw(`waGdL? zEuBf0jZ`{S1Jrw3BkQ0}&Yav}3+cHlXFXGwV*BaeWIS&vvZ71I&g1P2CP|ad#6&(c zd7L(fL{Nv;rpDG<3TQ>V`f00zvF+;lb3FGgxb9IGd=GrHAIvi>+8$3zS_Fv3KDonM4)?3$@Y?tnO1FPA!POb11P2RKX;6B0SH9G={2 z6!(fITc1x|pMn;j9Tm#`_~HPV+BvAq?36ftmb|&lz)58oQtAWId=T2hI``oFE>l!Gq8#$ z4`HKCOiUv}Xb>zi{WLT-t zWBEzji^Qs7m+eJKg_oEj3v45@N7m!9$D1jz%(7**{jwLem#*Ss2lR=hX0G;kVxNrB z$kKS*ZC(8=w1Ee13f37bu}Mxtio#xTmP9F7MC-8*e9ygpS+%>G{{rl zVmv*qDk6{;N2!qL&X;eI!D=vm7wbyv&L}{LCMW)yag2!-WAlo}cc} z7&X(VW-oy1oTSDz0YxP3x(+{XL8EK`Uop23x#{#FDe5^w$4d(tLt| zja*f5l?m)<0nImwz!-LehBxOfyC1IAb#4XwT_UQ8rWOqwBG zv$)qCmX*WGn=1Lq<$iw923%jT2A)<^WMjitzwn5?V6A2PC3j-9$+P8IN1k`xsf{jM z`q<2R8nR+{)7{$&hW3mjFMlBWmAcn>3||kHf{ih_10afhe~%CwUJ*PwXfd-*;t=(J z_X183`$Mk%&AE-fYP=iwJ>S3~AVgl~4Lp>z#@Bsr|L?+JL0^Qh%k@aqSK^(Fp*dpc zzJ)bafGZ+aKm6Xjw#B$CFJW`q$m^eyLyQU;tuuEgmK?N@DvQE2{)^Rrcq}@IOxX=y zq9uI9}=ie8oOA-0wEj-Qz!iKxmmn)m0(PK?$K-^ zJQeOBYakF%NiK1tuTzwSb-Cg7L6geA3YN}UGsxZ?Z>uc~VYUTLKv^EzFZQVj0{3dh zcT91J-{pwR`gouhT!PtBO?IT)k6D>hcCu_u+JLp4?Vb?^977w4u zV^$C?GpRIxvb4}E^U8x^m4{RUFja~xr&Ilo`L|QvlzeZ@yqGOgxD~G>UVmTp(XH4! zG%{m$-}+u+Q1Z&q&p0zq?oyCiWH+FXY6f}Gl?UPZ{3?urgFwTVIr0f;5JDVezh@o% zpOmlyCKx1@t54bpe-2P}N{w-R7<}~S&F|0+6hY=^m2_|CZY|EJgwYGgg>b2>#YcGbANuSZI!p_6NfH5e)PTfdN4*r~Pq4CZ zM&LO^%{j!Y0IQ^|(K~c!MoIHMmIP{sHXY{^>>B3zN(-8y1U5wzaBQ`y5spZ@J9qOpLbI|EC^mpntR z*1l@B{D$! zxeHC;8JPC28+IzAp~J5x{09a!PnJdu^WFC6QlLL`QWp%uPCMws?K9P{as@&WhL@Ey z+EU3XIL{02>Z**n>XDp-U0q$l?&=RV@BxPGdr@F2j{BS(9JWRA1@0XA(#u9Dm=4+F zh7)EN)bcZ4IwN*AuAzr;c*Nolifte>i0MAANQuYdRi1EQap?mDxVZmyos889z~RwW z94G_!)U}z+2t_$)$jE#wa?vSwSn5{Sy|)yFR8OH0aR=F&aa4MUXy{)WpVX?X?q;D9 zPCLVrk}2M=J@_^}(+_ai(c=F%PCyP8OR~2w+;`Jt3BecK{ZXn#qaE#l8w;D2&pva> zQ)w?PZ`cU(H0g1DUm{YdYmYoQcAi-{q=UN~cl2+iJnO1PZO#Wv#VLu2sr`D+&Sjfw z6N9%2v)%dLptNC&G_Ls89 zgklw3{qvK2NbgdEd>Ec}pwUKDccrT`_r`VaHABRY#>Zs_*khs zR00rWXL$%Es&3@#(s-}S>r?bUVQCF{qUcY#q>XHypg3VmsTYm81 z0UUEU=5RYLC5DNWHMxd&3F!+;fbW==6PLPo_~!74>Yot>ZVl3XE1J4Eb};m2Uu;jC zF@8BcVe#L;e;0snu#|8K&?PozX0unM659(7YhDnX$j9)9r$h6C!68v6kQ%zVAVN=; z5rLVbdj_?_^NGwemzg;wVg2!c9%H*5y57JZk?~;tR|Xe=;~W&=ss>t=E9?>{)Ge|;`U%CabN+9YiJ+9dX} zaXr7_`KP<5r|Nir0ZpoEJY2Eob&=>6cO-{Vzyz-`p5-1iM<%~=p6Mn#h2D~`YEsE{ z+FIOE$sTtNOZs;yjKNp$4StQc@MX3zDa{N5(WbV9lqDq~U5=r;?xh$plH=76Li{^} zw&-6NwJgo%@LyZMMZeRsxQM9wYH7&{;5; z6gUH`?BG@gwg8+1BbK97epfe{_l^ZR50R=sr6(3hheRewly>f&%`BzCQ$%7f+;DE7~qVV|6>0}Lfhiz@{ybV{1S^7xh8a(QT|j;#~Hg0=R`1eX0`jb z50O@Zal6&UbG^jHfP?SteJrg>qWvwe5;;zW7exA_+I5R>#gfeIL@N4mmjrX*9xXOd zP}cg-oB#AJF>w+k*(Ta)VY|aHAl7ld%j95tiTEB&e~6xSE`*sWEx zRxC+P78q4$8(7oUBz*aVVhTB7CD^@u0Z3~=EfLwDB3MK|h8X(!qbMCPrXcfH1fxhF^|{S!U1rc6Kdp}aNeN@F7I3D%c-Xt>yy+Z@U5$hWj@ z>2VO*Z$4aLqWs}1#h_dR79g>;u}RhY>xf&9$|vsC7A<^@q%*obxL2JdH}(?p6z>_A z>$TOU;dVe=5LZ=GQ^OGRs%B{tlaXCEKNIWWFwD-tF!Nc0(&QC~BrLTzXC~*xuLRo6 zo0+n{jqiLt|88#44v$d1I1!1i>B#k)0>9Rv`&37R;{|RTT&DrE9Q()-!QIif8X8-n zT!ok=TJev@0|h3(h}HL}f8h%iJY!MeEZ}?7oFMBJ`6%$sS;9KwPlW`_X?Q_QA63cj z%`0nvs};u@aM(J?qi?hdS@vXVRMryRI@w#RqteRq&o(ZDprj?54@5lPab@`C&6`2o z1$>Xivbh+Shi`V>@@7flYH+rFetQt9prEG`J}!rGR~yCW{dXROENpBmxpkDbe0xOz zOp$Y=Hw7Ou-`zc0@mK*p0m7QCUHXOQg9CVh#$U%{hNSvmBd_sw9bjrIKBOu?Nn_XO z#w~SvuW1T_5-i+XrdQk6AN1bX2db)9YY9!!$T#;5o5Bp6BT8Fp?A_rSt=#Yzm!hbl zfDqL}X)y1y3Z*yk2G#a)%=bOzd18}~*TG@fk#VQv1bd8)*{F-nsIO4)b{TFs&6Rq2 zd0~-|A-x=(%DeW)j$RcL1BoRLe6<&9bY;^r-&x69CaZilS?}qD47dfu1}N}TAibkY z>u?+5*Zw>Mzwyf8prFIGKo7gfai#fBD@gnBkI?aSjEI;D>G4nKLKM@zRrS?MQftmm zI1sCcW33Z5kCITr>byGpEpU2zI(=kjvi>VvD-kd9_Y}8x!p<|I_gUxhy?A&okGXI0 z&3k=e`uYaCCORFka2+RuYmE&ZL~iW?`Xwt7aLc53IdBmF)}yvUGxfR_AFE&Kv@aKX zsB4D=!bK5Y`RCj!s`1Tl%0*L4HfAY&f>U#N-vNREaRH5lii*liOSI!+U;JJS-uYj) ztpcQ5@=r?ix(R(-&GK27i#{h%Td{ar>1Pv4=-$)6Jt!M=>8cQARVsBY%4PFf5=;iW zv))y12h%eLYYo)!SOEaIB!uV^d#^(k?$=FWSEb$zCgk6`N}Z|Ae|Mo!S6M1;lp32? zE@pmuY5~DR#zwPVA0rQsm;)#UoG})~it|sVrl%f?Wj^Dv=e{;UAwdMOw za+V|+3{KrSr0q1>g9Fd7&EPOX`3G%b?_AhjeXXdXZ%MTOy8#G_pBLW5-LFAyTvz8l zi+I{XqOu<}z8%~6hX0?U@eCOCn}6|+5xrh~iwxm8IrEK25SSgAQt`&8f8hD|Wud0B zl2QnpuAp9xSD@hjEMVVm8<5g?HGwzBTpLgO>cwBhuyIIY!D{O(b~oVnz;-6d&;IDG~nN#{g(ZC<Cg`PlXI6%S1w_Si=VLs zaX;pJY*7kmUMpjE+82F5LqBSIbfggPOj&-p``9NjOV{iVyue$eSY4uh(ZM^5O9Ab^9W~iayMn^69>$)s) z`pQTU1hQ=0t`R7F{R+i>wRMk;i^BFmRe*eC6=MKP+ zI`CcxJE_vAC_cxQQqj4{g`DabUI}N3zkIAMRU^edC3|VN7!jUlZLvTiHj0%d@VY?d z+QwNOTxAL1bfV-}NbG1^_5+f)2kTJJ(a9#VmXGEYE2J%^RhjnF=VL4_&}h-SdL1GB zqG&+!zi~dBOf>{Us-F%ExR|C#_6Jspm#kEuRGE2!hdrXS4UftFk%9ZX& zAqAg&t0`7!Bs@x?T%j{ zag+bKMH@zlb}D)_cD@iRtZ$Ks&zY$mlV-krqYF>w0Y0=#t=aW6D}r}zQfI&( z*~uFC`TFt?J`?f6q$xAZpdz>}eHaFr&G7E-m+`#xF{U6o~*<=9mz zU+Wd^^ONqZWGG?pUmHmzDs{)_9g(uPt>tDj{oae5n zc$%_BfbT9EJ&Jz`EUqaBw%@Ju>Ry=&oUG2)@({-U-r(k@9X|Iqv?+Jp{cbz+MW@nP z5#|d)X}vs2o%S~k--9FRTWZwChMVihG_uDbyg%i)W7)PjYe{flm*GI3n^*VQ-1gf` zSmA{?hn#wmj$8BHr<3Hf7ex2`~GUanvG-eMc zE6)TWZU}k8XBj$1_uXcX%^bxX@Vuj^!dB_TE)8Wn*c^^fhkhU2!@pg&4|65Lv$+_cq&j)rjM0`(Be>B3 zryioAEei;WXEj7uV|yI%KA7kG?d72bvSKNqVtoGkwR1HDfRI{0Qf|xPiu!6EwCniq zi&9z4&L6Gl&M_PXk6%x;Zo@gLFzc^)tHF3Fic#<`4g)=AB1BY0#EG0K**&Q#$} z20hhAdz9q`rev%s;up4hb*o)=mYumb$i~#v)Ue0ZLjI^4^4ip5J>=2iCD$_Qb-{#Q z3*d_rmgL|MI`4%zI2JC7AP${_7N9?4x`#zZN`KxGuO`fX8;d=*JWkJ|p30dc`(hgc`^Tec zplFvcZsA=72!yej>mnlzZknl6Il$>`FZ+Vee!i>P;{;yIDKzVC*^2GS(G>!Q3jisj zF)qv2s1HBw@c}wQm4|HMZ#`Wh%zjySS4o>1x5=&Tzz;nlGw&6r5Du!!UyKC&0CA~| zW_F?1*l_DPxafHB{zh8n2dbV%_asXo4$0|lF~VCYlFN!7NhNATGl)2xZz8w4dk&ac z&4iL3D|CfrfwOPI2V_u4BYR4%3%Ov2GG807y$2vzhj0)#p5+Jt0;RSyN=ieQ{E_N5 ztK={iQMqq2Qwy$e@aChHoWj|RC$@M=kH15@WU#^wuuOTiB;+9>$d`iYcu42E(5ua| z89~^F7*H6q+2zZoVGYhyoTzPC~xoD4<&(uH@w9 zP{qq3d1a@^r7*Qh#~xU)tbgwC(q1fgvZWBY6j;%p`nk`*)o+JqVTw7-$tOyzfuSG- z2?1ZEw|fYg)(^p6Y0+@}!4Xrd9y{79oYSAj6~HoB)kM&hOW-Syw-B>Sz^yGY zNG<#e48hTiCv&3bz>MuR8E!NLGsELP9(z-v67|r7b_Z~f(t?7Zj(1+47Lgev<_~EH zcr-11%U3V9T>4=I5a&^?{i4e}Zgk(LFAFKey}2YRHyGIw2rGm9%Z~0+ohduL5u8F7p?Y}Y6ajACZktBkx#bW1JiEK!xAcB!(^Uv~x>y6kV z6HKd;9sneJFHq_7u{4Q+cgHvYPcXhM1J7rr?H--%KKNT0@krHEd}+Vqz;8CPs_SAI z9kK>mfH_mh*i%f~`j*rBSIeD2PWc}Ni8!msi%kMunE7ago!Nmtlni82^T9>?qN8obuNbQvN1(mi{3$qQBGZvJVR zL<75ee!_ObMEa7rKtqvbHZ3NCxl8i(&SODF%1mCqQy20I{H+e;{8Q55=}F?qgv%*9 zELlFkA@&!3kDN!&l|PiW-caVT_4JU`89$=qnBqDfx$wAUuSN=PUmeyb^S;A&@9E}N z=i|Zf8gEMA(enG21bp`hfY5k{jZhNDp38mmXe;jpwf$pnvg*AcHOA!v3nO?l0r8po zLFMn>){9gpVKoq*jEZs%4;hP`@?d&pHaDi3?+!4#;KhVK{9#=}4re6>uj1ejdBFyy9d`qvrh-6DN8^?7 zF~jRXHOh_qCtNlc7KIaS5|b5qg}pN52?q$jgzj?J-ZLx|ee!-O*2RM-^VXASg6%Gu zhAb`(Z1k-+`rI(>5FY_2@lb0C!p=tzE|c2f?sQBXMvjN*PA)#))jCet>8*)L>$><^ zSQgMC!DxW<2|92^UYSl)hG%&wG`*JkmMJt0T|{Xv5VFo9{h1oqZG9t~FTTIeeZ;!L z=EafQb&-(WO1V@VP0|SmkJM=Vk~hiiHm83U#BA%y+!ey?;U~@#pEPI2Q$PnTdr#jI z?PFK_>r4`4pvd$DnbDlhUh8)9;adhr zulp+x4t^shxy@z~y`$_V8RxBNdK$9!>@7IyE74m%4+O-mpsNKZx-&Y}*GTV{lM;q_|rOtXn%d*nG zBT@4F+t=*#w-MjV+9_ma<_bq)_CMwbPh1xq;6s8?2z}6F@tb*{qb#j2p8>ikG zGN@+(v<*)Z%B_tI};;KEGwr>B+iGxG^rYTTfJwLl9 zdBO?n3gh|j?s*-G^P@Ky!TujwfRDLF-zIg^pCINZFLYFpm)DVkA|WNM-s;f;2iO9h z&B7GvFiv{1GduKMq!^buG6BU_jHn85pVu zvjIt~yCv>zglFosY5({ulT2!URDn*DLJcFAn2c}1L&Oi*jw=q|W9!I3k-Uay0}lV# z*A4(r*Q8|QV7a{2eg@*TGpExaxaF%zGC6&RgO(IQ^P$$T+9_-0UD#kC9NT8j-V(VWRH;qUd%jpMiwKUI;6cC*iM54hks=&BIE5L^eHt?a2%5(Z zlFe@?9MZ#2mFY)#P53rv^FiHmTYZBVtg5RsLF_Wbor#H0enmqTw=e5nkRo*~cywbIMG~<_c2U1jffXfMP zsYMP|n+-mAenCM#MJ_su&qyMLa=#?M@c_oApo=%l?o{>Ymp5R@AVP=;)Rk3_A9Q3#0*2%00F- zEpTonC69We1If7q-Yi_8xE=P9M02`0z@l?RY+4OR7#FJD415pj(}OO(0Y1<1Tu$TH zshzf%Z$;;)6|t*p1xui<+ye}6(~=E%pA|#^0R8xX8`UAR1c6*eQ%XVGa2not_`QU& zYbTM2w!jpl6~(XP+u^rDQA(mWaS(*)`s2&%oWB9>vF`JVREk0g3Q_X3%Z8=Vtpu-RHQ<3u{bcWMlaI?XwrX327hp zFPY_3PM2XwnAH?aQSr31wfzisrkl+YBi7>&m z{5206dT%NBNb5IniYc{AtbW?_oSR$t`xu!fqN_~)(n z0dZ{5&0Vmz@J1T*Lo1uCov#*hmh-r{pZ70ENn$$lcb=I$z$1&^xHFeC&=k2EhJJ@H zP)x8p`_@46LJyUd%0&ks+t&J$tiK(Ech=8czOD`StwrFeF5tSyK#yz45VgY{;@Pf* zBa!5_f2X-dR2gf+d_j?cdKL_^GS%d*G(tWU-tMHIiwbz>hjkjynkKoF!#uXIU zjsAGuve~^R3kn|lCOJGROUJ;_+tZ_akd&Uz#K<_8kyGV7mlVnh#TzpebfA%sFeAr3 ztE_DodEZdpWHpI}kXqw<(mR`sodvY z=Z1{1G-oT@v)IHb>ikc_N!~*9{&h%$*2fRz!fF7ZfroB&-gvRDoqV68BVBosWn zUhOoCFwW@3}$Lg)1xor=!1_PHFd2e*RAbbR#MbN$db-%c8eE) zb(bXw1G9`IT2C1r=A!8_zBusk2KIWSao6{V-e>->Uyh~9u2OY;a+u%&cKv9m{_$ zQAcGO`0{04AbF?F(CaMpZF)0V&J%s{4MF8tB0b|W)MP8mBZQw~zC^I)FVIEZdjSgr zD3q1C?cZedSdnprnq&a=hs>!*0A44cekpNB7tt+Va#4ev;Rv)mR5 zyo+XA|3bq>`61u@Q3Y?uP`Xhlg;CL;aVsU(jBnD%dNtx1i0}l zU9WiXmi_G0z)B#nTHJy&39_YH@0Fz=HW&h`J8{Iq^hh$zQ$bNduj_s-Ma3im-8qDp z7cdlgvY-+>5^6$0Oc9%J0|?el8*6i;A3n9tzm`Tf$SgQ>bm)U-(1gq)^4>X;KTzLo z`ej^D$U|rg7cm<(#L6$=5*Ss*wU|PL{W?~2T`xWda}$>o2)l$&ZD`I?+;-LGPn7jt z=v!Czv0Y;ms#rYo@*$Uq_FScQJEQV-{MfpO64KahwPtVpE9-xdw9`s_aK#P(54hSB8f;YqH?+Hy>h{M)Be~|F=+F zq+CqRff2tbfZ6ChKh$^xN)ebf5a24&cfoc%2 z+OyVen6LO138Lk}WrnJm_8$0S*9JLkp~wXBPn>TnW3T0&#K{TwacGd7F9oOrm}kfk z#f2%kpF=TfkoWaG1`_QL&YFARm(vrz2_Vqu!P7&X+cjK1J1qbHTO;i1MX2pFU|a@L z$^!~gs8)kq61$daj-u99e>xm;s!>;}Vm9G&uKvHnd2+oR)hI^7PLygK#?kBDzElx= z(W#D+gy43U_5@3DMF?!|nLnoajh0GtVyYmTz$oy-g=EE_k2kySJZ>YTku#_YVMLGf zGm*8}e5s5*`wio##*uV}#uw@V2d3*%l!Xz(2pMmId->d1axEaB)GAPh1NO7$<`_02 z_&3UDYUA*6poSXjy-*F~t@wLz@&1Y4Jnj>+NR-0YaVhczCJ0*6EB?5i^ex$FcI4EV zb8Bq5JfMcnCG!mkaESIMr=pUVrNN=NZR20A(@5R>NmT4t+k5;xgn;juNF95 z{ng#w9Yj~rPDmYsA}|_Ck@bxXea!RgLo-vr((F;3Zl6S&r?)|FKh=$5QG-uf7I{jN z2v4<4t^+U)QxD@JKUnZO>xRlzmJ=Kb3slHtIuOc!{(x_+9- z$?@Z0!lRntWobMd#5{^AXX#iYvuRmBwGf*b_Z2UH1!*@5TkGgfYYM1h-3Dq~HBecw z86P{lO=B@^83AvhMWVyPxS>+ZCsH8Dygpuom#=^5wU*Lw5?SxWvL(MqAcCxO!e{!bY2pj}% z``BfhoEJTgrWFLH->$)4)z+ip|Y-^asw|2OJlKL-`RnnZWIg zgwlk*Tzw!E)4Rong*{WAz=-jF6rX@BBKU#_8u^B9keYy^l*8rnm8%rIzzdl}A`5<( znv$xfvc&nu|1`Z`XSeDu%(0`ugjlaXB5f`hs{MB}!FwN{`_K zKGpHK9~-6nuHM`>dZ!blHB`r$@xg=70iK?D5nah8phN zybC42(ql_Xf7P`;^Ww9cRVY@pP*Ldu{>Ky-RTY%}`TF_6mZ$ntrGesDiSybQtYXhL zDB72u#}$4J+#l%4(oe?;hH>-r@o zhV`%$V5F1dooZmC!6ufM+=WTldH z?{U;X7I+D`4!N#->zSD>Gwz9Qau9B9)k{&ju8Pz$A9WDM*%2Ijr4xf*zqpk_qt0I_ zGRPyYyzZOV6~%%1a1)3i0^(#VQ4l50pNZ^}b~+8t}^WTZvg_ z$>KTd^?N5(AsS~2apL-b^a!jD)lcIAyL-6ZXFZYJcc(q&EA^#Kb!G)Mu$M|wT>SmQ z70g^`3b#WeI4xx@UCm8RDkm6x;PWL)63w8KbmI*zH>R5pwlS7dGHLgKjW|%40YSB0 zr>q?=?&}Do;}rEgsq_4`A!+-|WRdB2&m%b1C>zwcNOyjbNTg9Bp0Mba{~_vhxcnH& zmf8Y4^2lkWawkf1I;(hi{`N`Gv1HlnjXzYbtFQM*+~NQ5I_@@cwBoM&cz{aBvU;Kv z*xB9%AXL+Rf3Kl}An0|udmHg26B0U3l#V;#_+Vl!p%;xag5WiD<^j46_sH`rb16;W zz2s!7nMp}CtWPyE$b_weOjH6OWCi=0CDB`6GRy^Lmmk1DyIo@bcx7R zPC#IwV{}hs3}qW@bda?@2f~|$ z!RAU8mtWKPyn;s$SY==(hXdzqI7hddIlCl5@+{Qlcl7>QHp}mSp|8(f{?UgxKj;%o$<-Zf426Gnbote9O{{3in1CEUPV*fP9#M> zUd^IN;IHvNy08T@wA14F0mx1VG6CPv2!h+LON6b>7*b04DBxTe)df#{a|j9Qpi3B-2dVv+sT}zAt8QSAyc+5JY%VSK^*|dVvw=F}1L#*EQ;(PnXgX zcg%~L4?kc=mi!}MIvP4~^{+b%PJfp0Txp_@?H^j%IWXMjJJ_ygn{94w&6(&73JqmA z!GVgvdw-LA{u|+Yee4?=x0x@Mcp4F`! zxP_I!Z1WQir+cCFW%T#{)&h`A_2iACy^2|Bwd-|{*GczS&3d!DcT$#y%8Lbl9WLg# z1}(0G@*Qw=0vqs9XfudWd9iM;FZbJFEIT_pFrrAVUCVn>>$|#YH5VB3NEtL(utW(I z-*)%V7A*GV)s0g+vQ_eBJ@lUu8nj`Raq*43DSd>X{=qPZIw@3L;&&ROP4vLl&x_aBU1w9ktf zmm^bPsd^6EMBiV@rJ5<7iOD~jn(xjy*qo!SZVYRNYr5YlFBBZQP#WP3tlq`C6_A)| z%J?~dSr?Y&+ZHP;uVSZ&M_Dse^}WcuG&5Ne+z|w$?^)F<6KXzhoCCVsVMp}Hib6N- zCMD^z5eaq8IfZYXDe}dj44q$Lz%W5l-|hHt@AK!+*4Ea&Ixbl?P~Cj-;>GQ=QX|>` zx$GY|b?7ZUFf=w!{ens~+(wacnWyf>Q-KXVum=8-&a-E`;PIUZr3^rq3(9Qy*u0nZ z*Y-ZYefySk2f2+cLP<8CdWWDe)=_zV@&w`Osjg2JK*|zwEgvYjl z)PYb&R{1bG^sJrL^W+eu;|ulnXCiBGz#3WU>Vh&2_u!U|Ql&RtFRb(|kaXG8Wdx>_ zO0mt9)ZSFy7rAKO+S*!G%QUWH2Q3!bFQ}o=qT4e< zC;jdOd(Ky}{8u>M{JcEyjIcB#^S-uf505=sE|ZQ)DBOwgF#B4+`Qt49U;GlM4MWwH z6C3bhY`v|L{HKWH0@t`rpcjpxg9+z(gz)o5<_sl1rxAikks-v7-kZ&8czYH}?c<@{ z*h5Bvv`iAB0XO^d^{bgVOcM3|`D^}~BbZBCZ);RY2)#VJTWKB^#%2mSXK*|CA4uIU%kGXCx|C$k62 zLI|YQgS2yGhHD)TGdp|^QB}sd>$)9?QJ3Sw|Bt1s45+GWx>pQJ2_+N>l}Bk1QMyr4 zI;2ZMKsp2|328w@>29P!`qCjtcL`j&8|mhooTxY*caN0W8Hp&~e3+no9pTSW83 zIHd9~_&tyL7XyXP=!Kd+2nAKal`{yG(*te~t`~0Q<4M*+dFB^ngq;dhQ!?exvZrbD zQACT6F=Op-G+dc~y`B065QWF@79 zhYi{^KH5SbPIJ9R0eF6Bl?xm)pJyIaub`|1FsN}CC^Z?=SdCXYY>BUqS2?|TlXxs3 zYDT=CN>b`eLe9&sVx$I&TSR{@iF8}?MK5bCCgPLaKvg>be%({x>Fzq@35MDO6h$;# z5?6tD68l*B_LPL4#UV>CTr>$YvaD2n)JERk-i*V~j14AIMLe!V(Hw!l9EP0<5)-y% zZGiYPx0uM);!`3lHRzyNN-N%Q>67LHP}p)WEjK{Aa(Xpe@Gl*q?bU5PkK3w3uA#7E z8X0$PQq8;gt?c)GL~Yu#b@0^QcG|@S&K;@@qQIxr|8TD_VM%gRK!s^fD`ms>q-C_o zNKf_&oorn8+i>tKhwaLamb0D+?c9*%zZ+;7iuqv%tf(!mg2F;l!9j>mq1tOYkq?Er z&!0a#?&5R;p)0H4)nAHFg1X^ZGFJEs^tVx$xIJ2u0GMcY|H=(Wg|UU`DBEtQvt*9< zUYz2@JVm1@F^(%aTdz2|xQ1TpT_ZLJa>-i7W8?l8P4OpCBq_y?hKgroke1--j^Z&Z zP?o@U(m3yY=MNmKaw=`p0<1mb#9V)dq6GC~?Wc<@>P0^{2EfV%)5$LXp+$cIaIxKp zx%PwZrp}&BMNK^({cUvXJ^9IMAylP`Oom7v$xunI=$o?dnOJV&M3>$yPTy48n7v@# zB>}iF0`u~v2M&xT`KmFG2Z^TO%r;a@78-QeoU}|huCO?j@Vx83bHCz6$7)3-1i-L# zP>B4#kPi`oRhgu&Zqmo_^mO|0iWqLIq<`}aj=aNS_g!bFOZVYyv3${JX1dJ#P~|f| zcDlc1lPwXxVn&Q%#|G2a8u_aZ%2#PXq5VIy)bEQ}o1FN2sf!WQBPG5Elz<-EWt|mf z9GV#9d;{0x9XlZKH7gE->?vKqz;iT|NlL;>v@mKF3FVWMubnC#pt?psoC-^|rxlZT zw1Qb5tC(|GjT3OvT)z%VG86X^P~kD8ehy_v0qzYI-lcI`dSvnz4r41-6D|ge?0TUU zoqUz_Uv=skrYM}888=1AqSZ8yD$y(Ae^<%!|MS0hVe`uN-h-7mcuQ@e^%Ir{Yr+cE zb#D_pQF7s(TFh%lc|w@70>w2Z#vMv3GPy073%Jc`inf}0 zF1v%%N~^hUeq{{DeVN4W)F-4vu~WP(_q-uDWf4^=(lAU(n2ILQ2)8IP_iuX?mD5j& z;^$!@ii<6qn4&_L;Ou{8AHA3(i0n*+ZMXFgxBJgvz`uqO8UQvNm?`KOg4T-M1fVJU`@w42k4_^C2G&4NS%^mF=z7{jK6%%{-? zqCsk z;_s)uy4ev!j*`JXko4lN4znM(b%jj$5XvX5BI-lO3%WyO)zBGHxh|FecYAU!6q1ZXVsE{-ZPNlaIn)A~Q-bLd6=jh%r&6sw4?4xE`cxeg= z`e^g(zeoovABHMi*i^?3+Nyfk99nW8+kX3!8^uj2G9`<&ThA^y%94SR8W1=?+1|?D z1-8tK7cbKDQ@3!2s_}BG{#I;MuY9Hvq|4y_MZfzUIZ*FL*IE_$2nknzwZv*X!IfAJCy#CkI zt0=d0!J5<4rv|lyegI~-1zR87loM0~ifN#BGN8fu#gd#=^G~{ba@%>^;KA%mSr(l_ zyAAEbXC<7{=f9@dQVn|9R%Ycg0XppB;sRs`N^0cF1f{v})x0Op!4IT4%`vK@iHIV_ zd66TKj>eXNkAc>IzAi^tszlC$TlxBIio}gpGGnp7;sRVcCABp-Z}VA^kH^Xc#EQ5l(Dw zWV8g%%i6WoiL19BH6#lGmH0TXYEONEC$0YuBV+5K6)bR&ySqF5dxex*sv|Y8O>>LY zGJAcf>gB8voc-^ifiIl?j(pOPc+^OfH*kGQVsxG@JzhiV%HLz5vfS;Kfe<{mu0!Ji zs|_hQWrl@n3^;D_PEPV)w(J@;&Z?eNJxn-{_lGGBP*70FMNj*+>6`YfAVfG~;=4HK zrS|Ax94-L?XRuU|i3wdOE!jw|X>Z>-Xrh4>5t6?Gmund}Z6~}}=;bv{>Zf9!CflPH zH9%R&`u(vO78_*Dva@aS-DIKJDW|a_hHgl(#RPlZFD?tdqU1(adi;k40I!vCd%%W$ z_I<(HnYFRlY*bc%v}qhQ$<>R`^s4Gsu0Ry^Bq=R8tI-2lDs9Os4%bJ4bO$RKK*>`8 z7vz@f2pDky5dn&96P~YCP2h2YbB*G$YK@C?>?xT+;UV1d0877hOoIe(XN#Xl(+B8T zSj@m_h8rKr@BqBL+Ip@vCFMVwW#WRi0sw00tRDsq5nxE!WssQZNPz%1VCnhK6}sA{+nj6q$liSVQ9paQz9|-UfGa{27geot=rq~IcY~e+OadLukg`ByPFySR zp`_2M%8>z(c1Q+&96guB(@a#!!%0aebG3xtNm-@sk#s2a%ldya)C#v7!-iup@i2mU z{{-DfK7(<$rcEPslO46^R~$H|CcObvd~|{3R6T@-n%W)uxvwlH5=1-z&Eyqyq#2lS zx8B)cjDsx8E2y4jWF6$o4r(*hd+|T4+UDXrJ@$mT77}M8Inw=h+j{e)%s(|o5G9zF zUZ1|amfPFh-#hF{g<93s)h&lZBoJzAO=`ZoYk~0kAp-VW@)r=zPgE5H_Du+hIlIbd zMaOrtkfKcSWSosrdNpwJpTy-mM5;OUS`!=}TlCv|nVFdeL_aa%)NSw$x^AAi@=HKeK|aVEXTL0Z9;^#`o5VVRQTunZ^()V0(Y+d8b)s zJqPoGxKEK-5Tn>xT3U*TTu9yapuU^)pR|Ub#+%H9l5X?9H1kyS4+)8M-ynS^<*SJ@ zsMmVMc=<-pYM%c0;mn{dK*xf*{NN{73fjY9bu|22)9{7K;(OEY4}3rQz$eMkCimQ= zqJo%nm6-N9oMwdP?Fg`UNI&dDexVvN&A=}n1Lgt5attByyEqTBUXJ?VEl74MYQHOW ziO^s$f5Uj+Mue#0<(Q_*qel@67u?>HKHrA5ktB@E+vgrKoeGviRZ5DKmEX6#EO?%3 zT@Q6^@t;f_VMb8wXW?avx+j*rjg67CI+VSXhNnmx%I-jziiMi%#bd0T>cw0#ceql^ zNAEhbe9{rNBP!UIq5r=T{MmemVy5@B$1D1q`LUw@+Zd#tl38r_!|ROETr2k$D!L&J z8E(`_WyS2neZGrC&2jOhsV6KZXVoN(KOFuy2EGtYE>ENLYH5>{@{Iv+vhO#F)6gd4 zsV>DMN5v~xtS;WX7u@(RiKOo{Ss%W7eFH$L0`6mjAvsZs z7_}xtd9!z~f>H$<$2fzI229syaQmPh!{knTLduLalv75z}`& zBcAqs=)vhgu4MR6us*_L=?|keXvo)>nC+U3%muF2&SWc3rSf2h)I6zrw14MWpUMBe zl`qsz0$|hXF%lh#@-9JpB&GiaADxOEy?JJvMW65rCD-&dhArJ=#ai-Ow&mqoMHjx9 z-;Qj%+;6Z^6+pJcCuaq>ej4l%q*37dg0fo3{RBr(4>j!KXXwD}k0}kRqQi;uC!A{x z=K93D!ByU_wp#f{c2LDi7w52}8x#q1%J&>q#_CqIN?pp`u%mY+4`O4xSOpsqOBwFB zckdR#!5jg7OW=!ZX$M0VO>nE3R>ygF0PM1)q$ESs#6FIdgVl%v#*m9&!zedptNY!r zhw!|kH_Q93$~80PnkK-=Mfw0G1|0CjszOiavH zb7BoH+M4{DesOS983dmKHj6};cQ&Z+<~@?t@H-yg+s}3nofb=WkOebAn15&6RcdXi zT)F2x6b<8`XBr*xPM)6im&_Q}Yxd8hr^PB#v_=3ghQB#i(rQhr#ISu+_AzRc5e`sa-@e1+ zW@odr#GQIPiEF|h0t?oBUuTb8H{c64EtIotcNP(8;{3FN@GQfLeEqgC_?+ZS7YuC! zd4q{0u(aco&bnFO_-HWXmN8mNroDYRMKki5Y~AJ}YCIiXPvSDKOO>5_$IR)5H3K*5 z{`L0~p*5wDL^IE~#xLYWo}vO}W5f>(+EhNYE$ih1OIqHjn^<`^LW|@6livKhH;J8A zJ+I7#B0lnYWxv~{oWd(5E7(JgkrROnk+x1KIDR2$ zW64Q+XUp>jd(u_vf#O89^ITmve`2v=2~ynw8d7TMcOS^f06P%AzYLz;@Uj zP|5fSTR;tb^kz{A>qoJ*oveOWuUWM4okkL@LV@aeJ6rX=1a=UqRLEv|sJY z4H;c&iY2+_h8g$NRI;EwO?w{2g85S}NC#-!sVYEDP$UmQp+NSCZmtQS-|#Tk!!{kt z-q%ZkK)M#RTc=FjJEnf4+x`@`$?8lY4{f*Znvl&4E6D<^B;~Tdewp$%pVCNC2lqT$ zrkC2Rn7$Y+U%kX_GN$f?3a-u0*VKtia9szW#b z(&fv;1oY>;_M5LIsBi>C7bE4&KsheCM|ZYTciPSdLRL zJ8b13lrzV$va{4@%YOi%%h|(C_!jZHi)rGj9}FVrNx};+vMB7YgiW(LcTR+PDk;Py zC?|bC7ruaUHF&7z_?4hfpfNy(A)&;r#?QB_=VacJo+lp5aSaCVG8)W|gka55q|52M z__Jp%Lka-)$G=RNPW?s%g9Yik%HVBok?y2SDG^bp&?FK&DUF)U_A{eg*Eu!9t*cmW z!auq04)vAt7g~Uy0BP5PO?Km2E~*!;Lnm7seENi!ceZf(P!qjqD?O)%k)LnGoQDcq z+uK9L(V*kPahb4)`Y!haRSmyri0XLU$>tfyavR5XGR{NhO1U)8t8e>k?_6-Jwc@Nu znQ88@4VxP&X`)-JcIXcqZ8CLzSD!l}`?es2b+Y4muE0{~N-Wk<1AG=Cr~>8)=$Z}X z##Uo629)#p=9{H%Q+nj@p}9C z8JI$cxFj9UJvzvY zJm^S%tE90`q4v-;ax!_dQy{j$6!7s5e!7YLONaGJd;Hdb{_Zq5`IW=MMn8%+09y6xV|fq>l?`jFqp&( zI`8ln3>ZV|G|M@049auS9hF&qw3;l$ zhGQi|VMH|GAZ|CkH8G<2PnoOUVssCV!2%RgY^~tB$VxwO1z|*e-zJjoNkS#5$YA=!UDC?Z3%^X3sk@JW!9$*5~n)I8)ga;j`(d=X^bCPl`SMrip> zS#GLRa`mkv`;(oGf5U_9^k@=#FO^UmZZjzVDq(*P45Z<K ztBHrbYygr=%b2plj~7NE;j_Cj;R<|`mX?;{HDI8Ec0IDQ;VMT%%)51>?Dz{_AnoT4 zPVwiC&jVzTnXt5ZNJqTh8bIEpoyJ=q5GOf@LVe0c_xA7VXq?hEk2yYKO6#xXc{cel zD#yIq7-9l?JvRuF>_bb>7gNKvjr-HTpQ>wW+%$O)Iz zN4cTGgH+aOL~_lX>_wj%YxAU$x`;*5lZM^qqUwtIxwfj3^>sgX+eg9GOR$%uE!bblNLcz(fq9Xyhx z7f|Uv-?zO4$!8%Iy7IT^UME$hW@?W$W1;=PR1xcW*?-l2=`3+BMk(ahf6d%v;QMip zpA|l_rvAfdkxWT!{(29mJmp{9--pKnS(TTi;Io>I?o==U8v<`G#Qr$8M?2cpx9`%1 zyit* zG=m+j<|yZ(vN0~oO_VHavV&ngYnuRSaxyoTEi|oAZQ%3L4(VIH^|Bdl|SfB#&4~GxeqVg^D+r9o2B`t=yQ%`s?IEa3r zR3n#l3idj0ehn@Hljgj>ujR!`U?fAaLuF(df10O9?oE^3Q3^0visfWbs3OD>m{VJK zcV>ur@F$Xa@QHXY_DSVX{Q5eb*@h40)a)a0O$9ogXk_pN>I1P|`Wj_%D)-c(LeD(NdrzevDbFA|e5 zJ|bBPo&L)A_$voNsziYeVn`;LmjNzT4WQVK&y@v!OgywMd99|yWZ`Q~EjdMvDP)#O z|NC`6F{qwI(V<9Qe(o1)%(>X}{(K|fozFjOf;iCI_Zc~NBntJ44yXS3t~h^e&?#B) z^9*OnjJnzVsWmuSGLQckwbMo9%y-$j=Bj)%Aw@esBzbtN!9jL0X4)WrXSIv+NZ}eG z?;3$sU)prWuI}aVix*Iv*l*I752=;Tad;}{-i8gdHW@DKXsZn{y(c`<{crTWO~kJW z8_F_=`Sph2rN$WLe|y05s9?4Ik-KJphHt*(4|HS`|L%K=HpqI~9xbYTE~Ke0lDY(> z!@R=b``V;U&LobHa}wO;N;_Yq?&Z|(Wh^R zERk&}VQ`p>VgBD1r3qCFbI@6IUdJxGICzylcUtVZ+)VR5Dt8P%w(VKQVD-Y02%QZ{ zj;1RCO1MK;0so53=!zGv_Ej$NZMT-unUw?n>cs+YDpl<%+U96V{Q-~IEy zwRaIAx>Pj?seFz@Lwj%G?l^VaWa;Ws)3Q{WLetBoJhmuQI)$;L>^CRg zLQjq)e2pEXG)Y5+u23KnI=*6mcIb1{u=k!J1*FGjbwj*mi zF*$9)9qs(BznTB&*$*GOMHe!(G8r$?B`X&lqXw6u;%kUjZIX^Ft5_3>-NzmKI7Yb! zxqItJJ!2$8r~2!hu1iPqF7MbVn7H*oUnCeV-&6k|d$?ce*(12so-pPZTR5}i65#mYO0FWsEAKF3M_N%tp!lvMEjN@6NqW{|kr8J;1?#d0}p zlR`Bt97j-be(|Z}_phY$QHG1{#>9r>vM|QC?c;%-K8ao%DXSU$X@^eX44yz^S*u_> z6IaYn3lf2beEpbvpjC4{Tz(bIbY)db46R2?kcPT`f$FhrfK5#b+X=<9ms1SUg876a z$Y*kXvh--1O?peEh#_`*9+CZ#`dVu?%@2V_mKQx+zKu(M1l0W!%v}p7Am@~KQjob1 zm_V~{$F;H*ShG(dV|t`_D=usH(|^C^HzQ8_W@iu`S2yW9Ptn(d8&mZB+5|ci>dTNk z&C9T5AH|y#Y?RHB(0cBDJK0LYt>a49fXhY|E5}s9B~9Tfk*CR9HB>U&HjR(`7#+NS zDKg?w{$4}YIU4oZ(o9swXYuwdfhu3EZt*6wJAQBQQ%GvXGc&q=rP5B{`HAf^RRlsC zfA6{}seV{I$(b-d0BBOsa8B3p{DR9(zJ=GGwKOd@OM0p&+LgPifd*)Pr z4PU_6|NAFi>%T?8J^xZ8#K#ZG{<(F)acrLx*c+4>Jki`w7(o!YsHN z2An#L3epc`r`FO6s)WiyO9bnP8%dczdzb68^U>7)TOD7^tm6;orH-lSQH2tDS?;|8?+}_H5S1e}=zI9#wDZ_4%do}m5n;EYAwftLxB;yjJ z5z=W6BMHvlX}5Y6sCL{q$pdVUr3=ES>Cb3}EvOkHmGOJvh0w4*>Q-CyY@Brz=J z(sv7_hpoPbTF47sZIpPvg`5`H+6&Y=yJ&5Ob$9gT{u{--k4HU-*Bcc{Zlc_3i)MD7 zS*wrk_3u=9&HYAynQnex*3<{?pg|mUx~#@?M1Cmd%a<=6*o5X#MFU~GyLazOo_Q1; zJiezH4nEbcgcYGaRZ?8K(!oA;ivV!Degh09IVYJSIl#<3M|{v5r}T2b08_mo|pBkNhr z>Cd>SwJ%Qez?HGQcTceCJZQA+drOR({gYsklR0fKv7?Gyi*|_KB?0#C0#e_AiFoI4 z%m)3vknR(J*lGJU4m{1cOh=dur4+;6FM1r9msas=`&ad!=4@TJZL^Sk!~l9PmMw4d z_hJj0hV(|4rf|uahVbjeR}W+k)6a7G%niY*{9I5_fKYw!mgTsd=4|7rJbFJbuo$NJcrg2MZ>~2j_T=f<@U6S3>f-qX# zs|ruRosaW@S$|24s8@#ja-#C#OI}T{XqO04EYPFQY!5TDQq#UYN)S`R#hK$fa5(v^ zb^Fzqh430=l5RkJS+QQevidno%yi|ar+XWY%GR)9e9LV~*OX>$FX}q!iPhuhVty6( z9q>~<@C&KC?>2+tSNALwJ1Xfa^}k;_xG46y{Cj173@)GB2ni{v?K)=oZe{W15+Ett zuN4mgiE10_=};|tJ|&751W+I+Po|~uDn8pi#vPn>{I9r!B}w&ElIy-wfhlh31Fb4l z*w(@3Z{#7?lnW4uX>ePC!T$h@*SC0w|u0l-rsFAcI3bAy^zOA|mo?6nSft zt*MsvOJ#|Mq8WFMiP)9nNrtM;&J-S7%Yx|YWY{!baNF$O+B5b;eWiZ9Pb>YrPcH6e zHEd%?{Jdy+Pe`anKKc39Ya|a+`~(0-fP7M+o~nlKY9ttBbk;KN;aC#8hB#uF6YdJN z1;B%aYNx=RSu1@d_&#g$f&awU(csZUf4vWJ)vC(+Ke%z;Z69aejZf|YP+C82*ZOZDVwXbikqBZ$qxS{SCUVmr*?fT1B9Pu9#fhiyl zsi2NRp@gA#qReWhxvJpGC&`O0;DyEdN-)~^&#TK_@x8g;)f`~ne)8<+Q~cW~n5 z%o*(#L^Vf07&gcD4qey7-EE+WIq0AjF;^o=T*1f7?o})mnK4yiIP2%LZ2X$R?NvdfdQ)5nn zC7n+Hz0;qa4C~8wh^<2a2NB@9s&y(e=$;^QuLyz815Z^3n zFOaHIz@#MoxBOW>pju+#PB@}Q2ev>aS6N`WL>*#5xpm-Hgy(rVP1RriHwGY|w{S`U zrSTg2?xx^ zAb>_7ABo_ZQt|->5~`y8o#q6DX%ha8q5UP0I#1G%Z?9YRlWawDd9SH}BIcv=Ch|Qo zj9nE)nK@hRB`cxKUPK1u0M+$E; zyH~6+t6QeaxZ=O@2J93p3rMvRl3+ODoF6-z4O(=_iTMVw@I%*O_dym7RsvAflag2eCXMS|xA6D@6xWmb!O|wWL}vfMR^d-q`4+7d2A=qr z0Y;hCY2|NDjjV7# zkNe`!W-Z$R;v#RHCmJ|;4N$pEjcdh4D&G@*gX$xvuiE7`7e{13Fo3dLdT%TlugLxl zBI#N)<*Z`p)ko0A!2h@5hL@KY0Skx=!=9*`_G6;l8U>-0cwVR5j+ZtPRlqSdxiP39 zi?*D%D^-88s;=+eHhedct5hn&h&dC(d6kP4YZKOfVH9pIovy za5k_fjnv}or@Wvgpr@BtvBiWo^;B3`7&IyT2pMLCfeF{z-1&d!g7oyhTaI@fFIjNd z_q~QwvAI3fe}h#uXPq_kHGQHV@)+(19^Bh5se1E=r$sr>enXws3{=McHj>X>$mVah zJ-AKhy0IA!y#cQm@5=1pXfNsR5?R)pTds=Not%^=7>EsNxCXIWB>JU0Df2}NG_J94sl&jKeq3~1tW zRKDE~C4MF_Ro`7?tXJ-`zodO#Dm>f(32c4m=-HS{v+1COCCU^;RN zeEq-_*2>;w>c8eKYk^#RUqPH2GPAM~52v7AWc5Ov6Ua}Nld-77NB#th3Sz3uy{VE= z3a){PgMw^Mx-V`8TcY?Ti-oDPSa_S2UV$F{1LONRx_`LJfgkGdiUi*H?BNT7!wSDQ zo8EzNm{B`$2;RHMo@s%68Wg_#aLIp6q{{kf1U+N90C(pMM}C*mRkyS;2IWw8fHf?F z(<2`6hokb8)DwT9WF>g|H)~oL42|O}|2KkD_ct+;D52`1Jz#~{MKQ~&*2V~!>53>Mg95IRi(vU>c~eAE6p;P#Aebet(e|t1jxj38viwJC};y zIo3%xcQQW^r_Pm9EgNzw{IdUsu}GOp-^yQ!5lm_<Ds91HT6W^=s9p4a-AOS&QR3wJ`W_~{y`m?Dd}f2Dn)kVz8A+2iN8ZWMc8Hh zb;x%$xs=H^+CMR%Mvi}%Zhp*pUVneT>*ogR-yC;cPI}_Mbm}3O#hV zAuJRW6nyaD0YCpoXt#o}rVwHdZqAN0lv*ADhMbB6Sj3#1$|F`l##d;AUIDLaq=xpI zK(oP`clo-2sBjO0sRUSz1Ri;-bx|7HiSFN0^?z?yC8Zs3a0S3uf{T)}vLFIbS1kr~ zZ(Us-w7QV^AS)qp1pW=u3hB6`CnXOddJY)dzAFRPv|*gX^YQk7H%MP!9}lsuH}&0w zw;}qA(bK=*HpwZW!^&m#{G4oX8$l1-tqIp1J^7OK*DK_RxjDXlc$3<3@$TUx92inW zUjF;Y49HK_Y}Vs%+3x|1Ez8Qwljr^XW9VHvC5mCIK5&08ZwTw&@gqh0=m+|AXeaNn zih?TIQaAKB36~@5zh@XWvhH{CZ6e1a8M-4qi>r`{;qHk|c0M~?*h)U#jz7=NAI?-!PVs5@oTOFLy98GE+8R1JxzeBtuJu(p71_a5(33 zHK1V3CaVd8bno{Ac>vpS%ntGJ%^Ql_hPfcatLSqa1vjQYhiD+Gt4z*XWS@j9nc1Vh z-fK7zK%6SojQ@W?7PIfDH73{`GTDAKx&S+2V0U%6kGd3Ts}&l``|;7ybfdqDmTjoB zzBkaM3w|4vm6h$yk(dho0(ut@?GDZ+z5hTG>`g9bHZL!HLoSmVN)?LNFvloI_S=y8 zR^la#?U&A`N3I2zwTT)X7hH2Wxo_Iy0259>Y0k*Vc*5xf#ktvzv%S(9D}_a3Iqc5x zm?5slv9N-G%zCdcw19(4P)4-#z}Paosx=DRoOdCnp#s7}^|*vMeg}m-T8q&VX_whs z90vV=fD5R(p5FuKp^V(cs6KL#gI5& zviG=AM)x=kT@}9n!%eP1HJ81Ss!y3&Cd~z=PVTNjTyM|(s`yhec4W+C1m%pw_2>~S z2%Ao|rb~PQ7=Zr40vK#BJ`s-czac+QXX-+#+K@P2UYI@!s#@=u*}TN%)Q*uIX_Z?LLgRUM_WxzHczuOlXNolHeAT&E=~(0vFoS^7kv$* zCUE|cNY!gwvUB?NCkQS{Y(PvxPNH`RS~ugYSLxikdSxl+_ta02GRVvS>qp8oOT6Bl zD8>VezA0*ub-4Dkv>06CAWoQqpxb$W)iII#!BFr=B`BMmC)&J@j7LB*)~924GC*qn&&Jy6b5Jy>L){efHpRA-;_k>H39i)5%yV<=}Y}#C>^j z=Z(kpXXKB6pcTs%`QgR;C+qK~inRv(s+tvteVR}X;JByMNh8$~8>H9-lyXk#KtBDj z)H`Q=YqZDR!^32B?nktFP-*{WLV~z(EV~+*>|RiXlxr{^0JX@Q&;P=po7iN9et+Li zIetAV19UEbE`&b>8k*l+DpB>wW!@TSyeh1b|ZkhMW9h^#|AvPbf^PjSjxk ziqEdFJOYf-eACKUmh3yHpWeEGypURnh*|FDM#9mH?4GhPXX<8NR3 z^XEgKiollOKM)IIteU7Goi+$o37Aa$Aa@Vq=`vA|mw+bX1cw)3rsL`Iw1?G@&45&o z3wYWi)OJ9f-O{>3K-pXdkKG4)pOK8!1c6gDmS~126$M*Uhhz%!P@*m~6?X4`Hmvrz z1Da#J*}drWP2;p)-6y8xH)k&ma0M&DtsS9e2RaIn3%AC|nN@2)!=SP+*rWlsOx@1= z;zHs<#s^iPma#CH%Q58x92d6yrQB9gc64xW&rIBFn7faSa3KK20nfojLr+FSD_|Jx zn%S>kzhe0{t*y5Tgcw;^=9pp6tF#LWYG`;mK{4t(>HMci5ja*1(DeiUwcV{NR0!^kdKsfyPD(vKG$+QTs+ZB>SaJmqilX zm8Llswia2Y(?NAFFY#se7FuA?QPW!I51}`c!$pk7#O7eT1p{ zP8^o#1RJ?D z`i?OYyO|~=Agr}8J5B3-GxcxDP;BCXC|Ub=jbflh187mX$LSvgCA17~_m9vi^CMGO zQ83fM4y|{H4fn`c43L-s`3d2nbys*REk;~fFi1N}rYAwYQ_U`~@jlZ2WRt`F4l8B4 z4ZZyt3g*piKUv&u;bXzdjX8#O{Alg;hgQK1>4xkTx2MjIh>#q@CQTX_BNcY;u^ZyA zL%de|o>|#{#MX+bBeegTddNaW==A#0Cr}ka9e89aSQ!&Oqpi&!`mE0bQ;8D%M16re z6rxtf`YNZTF#z1cZ&Y)p6NlmIt-K@wZu#Uk=T$}C6Ahs+$OBa10ezhJ%@mwi%p>!^ zl#5hE98xG^w)p+P;7l+ds5FB;abDA4ZQQoa|Z_pU|xH-DLdT=%sW8@OZUhYGowx8HYMiv) zy55kW?C1UdmN>-5n}oFDUu~|B^QuvcI7r^pbi8!wQSiXdS?4|whJJk@i2h(R(zxYM zLNxL(oh?0%`MS@{h6YQF2Qs1CM}c=U-3&#DRU7vPOlYm zkgq+`3)Oayc4=5};ek2N%*xI-1>`5>O@Rml;UhvKqmBktE~GM=1A#*1)!p3t4st@EwR6HagmpH5!bs|nIYKY}h@L$(gR~W-4>P$GuTPDD-T*Y8 z@!m_lnKJX91=elywMHu^gwBbH-f3U1xV<(sEkW(H$}S-th~kcb=(2>w&f-Wr6MOBE9wcBq_&zH! zZxg`BmOl6(&#Nx^2f=5%LNJoZAC0U}&%5mW)J!Pl~<}Irnd%uh@)nil_k%g zoPraQocvr-_?=-fAe|*fTZf*Sm%=HQtDBddF#zC!DA_x&Beuccrx&*57ngL8pvV5DBvCO zl#Q(2*=Ou|^%B{q{QAGdC9n-{dn4~9OKm@S!J*Z09aA=<4)&DOY=oZYAXlqm7Mq5{ z;OgZxaa1OU8o2vqq-7*TD3W5x^MGM6CG2FZ@Ve=UEI7wcbqx{lkyz-q_k5%+}@4suhN!VB2b0+9iXSM=Do zAz{7Afi%42uP;_*E-p5msIIEiH_AwIvTXAJglUC>rQ@Xp&N}uw_&g)=G4qP9? z$Nwd2HZHDAB9Nk!UP$pU6B@wgH#Rv0)@Yl?8CWh>!nnvth8o-vQWZ^+x+P*%xVJe? zCQsw(<7q`aoY;=aiLo}T?O-G)>h`?tO4dy~wRU7zq$VWXad=n(24_V53O06|hTz^G zJyt?$3JS(ROF(!&N2Z^io!7W%o@Bq6B@brK^lu+zM!horeP*#ciPfsDgt+FC53&d< zAV3s?T?pLq%p84H)d>DTvp+wlAej+EgLxC`4JJ$xRzesz>$S7vSRX9LV)i>@oY;(V zTX1n$P8Im{fxPN+wu=bnBgI`3{EM9^DkTP2cIO zYYe$Mn0vS2n9VRhup0D`@KJSgM`pkYT;i}3Q4G+91_rGmZ@(2*k_Y_17!bDuU+~6_ z8+v+rVxpo)dut}=Do+1eqCwwyP64chK`3{P+{0Wj!Il%S@9w!j;-MM*3GrCD3yW_K zY+oleY0B$k|FrL6W;sNN9z&?5tjnC}y&1B_U%GCk9P|8{t6SD-vy$`RHWnr%xIwZ7wGNyy$bY_*v0@9+On?E4ZbIeb ze{RpF&~0x9D)A1q4~*uf`^4{0p zm}!^d1tvTkS*wLBhP`3&Pmvd6ed#C1>yBr<*5pAC2WJOb3h$ooPXN9CZ-F`nfXon- z{E&kos=?i~G?c&W5jpyzP7m-4r#l>OU|kqrk)+=gG&@6ld3w9)hR*=E#=d+Rg8x69`U1(%%c#ij1Q4L4L2wwL=&OukaW6Cd=YN`|>D6@2SEZm&Z9>S9CZ zOS8ri4-bb3!rzNxzr2klt!VpbGpPBQwj(qoXGTgG*Rk=SLLvs1?_$c!v4*XW@E9y< zP~5y8nJO8M=Ps;n~hI3%i@7FDf(l)nUXO1t+3_6T#K{K@WJz)coV0z?{h z643bH*~jSKDLDruo%#v90`mebR}+6rIAR&NU{T)>#%RpQ__ZbBrQ^%@?W(DWj4=As z(}CxH1KW^+3ajx-_kBZnW$wknoM`^~ob2qB2e2F1{GDfIoo`4d(vr==y#Z5B#T$;7YE`h^e&BH_Vgl`)+gYfl z)VwkPlbX-$3U=+|@SrOr#kSO<{Zbh6*h@d}ig|;#)!r^;3@O6{*5Jlj13#zZpi#+y z)K}Nzp3G2#2hub(FCbTqDde%K<+3xIr-n0u7t&?Ps{in?+3Vc zWlUDfZ~kn(2ft00{P(p2iENA%%O~C1%w2%Axl`NN&;XBxEQ|v3#)Lp-tO%YKEIf;R zM2jC#zrA;!t?^Ccn&GN*soD;E{y_A4qK*9x%*)3iV6#vyKs1~qpN2-6-pJyf zy`3ES1Y|#b!?4uwA6)|M;S}{VjQEXego`(3!xrShS(_YCuF0`^{oWqQlKuqoelUB5 zI=-WcV%X-!5JMkCLQ)G*17ngK>xBh@I~^mQ#r;IKb#h6g<#=U(k%_ZUF2G0*4Km*9 zYF}khM{c~@b;wsBqCRP87_JSNbIh>lLiwsJcAl6-2Q9C{%Z3?umz%2@0M0)8{NFyc z9js2Xc^F(C2-Cp*2eN?tjb>xzyFmP*$A^t3dr8F7&=#|nF$zC?(R0~Z0TN4!$OeDL z8b{`#&Oq^-*~J@|uZtXo)M!D!FdD9pon6?m(250AEuTbp^h40RNhr=r-4in{!}G`s zE9omlgMN3x*O81*hO$#F)6KTV;Xrz-UvDY(>pK;%xM4;gL1zq6aHLlma#@-~A(`{a zaer|rZvrkyP!q~29YC_Y^iSXw?=vg6Rkf`T00YHOA)l#OJ}V_9^nvL8Uvmd_U`4=A>x=~X;C<)+XQC>@6o z+dd^~_-TQuqEz8UoE$2S+l`;KLI_kiT}A33o=VUCon;yOwoKDY5|;X!2$8oJ;d>5% z0g-c7-J$YxOd|L{qOLlws;y}s8$m^-q`e|tD%~O?(%mU4edv-F2?gnHrMo)?1*AI< z-3=n0-yGk2{ruCP?z8t=v)0T!&oeXeg}QUkfyKJc;XD5heHZn|X$oZC%X*ZH2HB`K zsEePM!`^O!P;#}ZGVd5NN9Uq|Rbp9cDYNcrcKzws=rl4NE6kJ5i-y*b_8yoSTV=M? z?de_$gx0FWSrm`ZMn7evGqTP2g>O)BB2&BLGw=I$eQD?{(ta>>LrjFKO*>T$%&LFE zN%Lzz{MyiHXt8Jn#!x995hg9|O2bG8Y+LX3x(F#?}91m{zFJiPtv{zH#I zzBm7b@P)jgDw=RSSMD<-Drz5#swfg5UyP6a7!t#?$zwIS|GPD=>k8r<D^no}~EciHh1;(eO7mO#!QX%I5c0O#0cLlT^t)bWsI{ z+g-h^cM5AX1M(X09;@64CD@=;84$G)$3~xrFaG)Zq4DpRRx|LShc<%rg3L?f{z{65 zFoN7hPilsPDsDlh5IXR@1Sxs44l@NirkRZ}=bw;#^^`0;^d>T$Tr zS}VSPq=jC!XKBkwym-rdF|_yo_gwSP7iktEKF5lq%Ki9cmJZ(Bv>T;m8I+*Xh;+jI zy7h*_hH&72{r(Z1BdW!Hq_i6+#fLfg8~3gR+!i)${E!Q(G3KDX4jnDPhNj%yYkay` z&+e;s;C_Zy@oxSIPUP~Z6w_#eGL^Q)zG>PfJv{fZOBzohCk!>r2-4F|+99E!_Hu{L zyI*`-TU#M1goYx<0F*&PCD*wi5w9DBme9+#O`G->=>-h?obW;Qp@|iL-2M6vY|9TU z_EMsSSx^$9hsIyld`Z%F)^x{OA8p6s70Vh zw|{{CvtnW*h?CLgYXY_+fiVg}&ymwy0%MDEKI+zPXgEqebW+J?Bf+IoivS+SnN?8m z3nqFjLkAUg1ytBLhB7-y2K<9I0Vt$lAic0<$Cw(iO<{rYjY&>zXNNUv@NfJ7msi(A{7AYN3c5nxJ*Putbqf zjQW|sg=RTR2UE~TPwo}>#oI40%a$|luqy*h&}-j{k(a?}&fhS;`_C=_fOTK;B5F^H z5^+8eMubJhgj$kp$-@pGUk(2gSu+<^*+~$;gWc#Jk&7pt3Ir?C8yK$#0t~+Pj-77L4^u(OzI?Y%X z(C${MWEtb>mtgG31WMP1osx3G0mA;<6QM=pp7%MTAZ@taAAVEGy7STL-Ha7nw6%Y0 zdA;5xPh;J#ckRZ#FFgj8{JlLG`w$Xu-kV0}kP0#Wh|8tA$bvpv)1r*1iw!Y!ESi<;UkBMQ{`q`YeF)TtcKt>p*vwa+Rz*wWc{O(zw>i_lz&C@R59XmK6 z+YH<=@Nk6IT>f`9C;}d3Cs7~-rwe{I$BJ7_4j+5{oYUFL74p@Tw3tsx@d91$Z4&)k zlk|LioaJstaNMSfA=|W-P(>?ih_P*18<3`^rrH&23o&M?Q?MH^Kl>A}Yxo>*=SF0Z zRcDvTdg7Kj_YBC&LL?kgsOG|*+COMn=Bhx65G$_(0ttS&!fWPVC>ksfF&q# z<;=kXc`wVFGd0HD7I?o>f2<&3F+aa0M+a4}Tk(t}+9K#1(Yz7jVeS{@pqOPRTYK)| z2!m!y&ws*zGl_cGJsAt`#u~@(;|kbXR6f0x`ii$KTnWf>|ECQr5UV~ zg1)=U6Hm4DkQpY<&NY75cFd*mf!d6WKqCQ;%$zSx+{^@ zg9da1FqG?D0~T{Kdd)Zq8Lm>xjqw{FjTP?UAI7-6I>k?B&bQpX$SZw2c|0LAVdjZE z6QqJ|!!s&X*WeCjTD8VA)r`vt3hgUnF+L804$AKCU=}*z@)5HJKE&}j@tP5Qw)?}S z=lwCep?9>*sTzSkY<-}o455x0hI{eKt7}9xg5n+MMI3j#aEZIqGbSd+c(&gEMY*V` z=sJDGxGf5a8w(~|K`P7>8$(*=+>+A;fvEf73y#$C?FQim_|n>NqUIyVK|Le%4L}Ej zvk$?nDs4(lah44{c%UthKRvq10WBx#g>RLyHcYALV-$L4;+3h*YajI(>Gx2RpxL45 zZ?m^WaPZ|Oe40@dJ5sGV)CTmwu%!kbC>V0=PoKb|f9pyb1>&~wufdYC%E*~q{)%Y0 zN*G>nT&<7{gOUKmREJb zJCbG@1L1;pdXF2B+WyMqY4KaP1kIIw98DMpz_WXQOe|hUHdh`73x=X6kKz&D@B*P{ z`Ri`(*G-?}$)GE0iCPYXhAY<0EJ0l|-FFZtuQzxQ-0&}nlbVYNj_ zR5w&`v=0Ija!1j#dot0jhnur^-LaTBE$3dA1%Sfx?0E8g!}|ILbkRf4Vt6XzPLm!9 z5y4sSsRG`FYD-NQ{A|tSUGUGszqGkt6f9%2_Brc1Y z=R+dUm<@CkzoqD_r`)liV;C*^q10D>1;@d!`;?HFP4jgS(ay0C$c^ou&!~ZXy}D(1 z#{4*!R}lS3^APmO#MA^?$V`bbPuFvOjs`|r+IQP6)F|@qvku_5go0oND^u8v6s0ZZ zJsTR@vhi(TjO-9P%Bj}tqiH7EuUt$=59->GmzTE!S9O~Cp>(MPigU7*^PsV;iKB}2 zom?6pFgC#GjzOj{{sip#%i<0IztDC+9RU~ueQlkGI)0Z!QLMK=6 zo5Z#wZzF7ug7(eG5}(_!eiR7~HJ;nX zNB8In_r<9qswU|jiNLC2SLt0h#zjU((#BMs1Kv46R!p?t30*=F~bY9xj z)-5aJ{SWmcL&JoOE{^m`;G@Rg4&kO8uG`tY%<;p`KJFvQIy9euMLeV@As(ePsPX4M zk&~B4PY^|y!jm{M!ES;iN)PB7d|%JX!z=Lev+VQ8Z58+xqByVU?>yl*EcLiOFKNqi zL9#+1(EQ$3qddXg=57AH@HiE{{T;{c_buqlA-A%U8&n8T=?|Uq(CRzTx${7o5RAm@ zjOXLw<>jTP7r%Wub50vJb(6<>FOXV(tZc8Qu^Myh;-MnPDxE&SY2&ysla`GwoU8kz zYk7dX4PF>|%E?YuPd9pct`0FQ0+y$rXS{@kfW(Q+?ZXff-rSO&3C>^pX0-SGa1F9y%wotfH^jbjAkcG2QBT z)joQ%MnYG!;UzF~jC<}hH&i&D0*h|fVv31HZf~KU;>XMtJ`>;Z#RO(=D&`Npr*fpC zj1;Hznb{HQQ{+}dK9wCUyuoh z;W8ZrD}ha$gn2W|Z#9iIkE2UotOtJlhxB|?{dnSTlmjl=my=8J>*AXKpf}W?O(=|g z@X$3RJA8_vSJ_ZI!^Vh@%`kI2L?68)D@4<_j--h;=cgN1pEU@JfVIS{i8Zai)q zwU<(u5*+<~oy5<4KBXYE@B*ScY4_anOBO!)jRs884Bo`S<>Go>^jKUQ(Cd@(I~`mh z(CB`gUlKI`r2d%>*lPWkp6*DEpfwP}lfJTZiaeMO#u2YPt)tbK_bF-A%ZhUU?x&}* zU=FSQ1xKI*KvRZ+`b}%8P3@D#GgU!F;*f#ljkPyosgmf4eHE3Jm5_Ttk=`!u9Q=SA zn33ST{jSAOmq5bsk;izmQ^GGkmiY$F*mC^+Ze3W{Z_KR9qT1)KVm!;iRg}K8FEJ?+ zez*i4ystdW5jMBHhzSd^*4o(#n!Ih`L2|YdHKo0Py$&J;1b*5$O9~zx9_o&+b2W>z7a_is5 zwzV~xuQbQq>gT&aM#R=nrvj&TE3vw|8k)C*{Cfh-@gA6CU`Q7uU*OD{adX{s+2m0f zRnfxlv>QF-w8V(}!(6t?-IDb(!4)D4nKlzVybcE~qapBB2N>@j*1|JjV9zpW_Ze{* z4%h&C8c7NYaJc_-{;IyrWPyw~%sV`iVTT}o^z_puNtU%J9U4(Vq4#QORY|%c8IDab z6~;{s{wU>YfCzM|w0&^nG8USIp^cV?-85j)+rNjMTz)=w(B&Y+H{cb`9$?GaIR3~T zjL%*6b;hOjZIn8t@8f%!+mc5dxe41} zh|1Bg0cR-vga*w2;tLSDwMVg>gPhf-CXVnO zYFt3p3mv5lW4NYcnLe63bDRV=l#|3c=KAKW21Lg@5%%$%eV9WSO#=+hIEne;tHXGf!(&}g;GOfw!$8( zAC@o>p)^Je+u!E@q#;Cf`D)1@l}V%^f~})~1U2)Y=#+{YQe#gSeoyxiqf+P6!?{6f z8$Hc30msY@g))Je@wOZ2_*nDRt7&NTe-=@9lJeRTg|tWQZNg-Zbr@g*7dHLpV}`|zxSy#xqQ3V+-v3nluy@R@wfSwX;SA>DVa(|sUM?Fa@5cy z)>#^Rv+KIHwUex#WU6954APpai;js=&eeF=#kWr*Ve0xjX0jS&+yw;%&k!9S$zH-o zk-&66{g#9Zo}Y0x_V_7YtISG0ZV1ICdEaY#%{je_vPR`Uk|V+=X61a0rviEq2v?R>XjC63y2#v>t)kA$ zZCdQBAIW9I1;^y_=ccA6O7ZX;(AEr|1Ob*CJ%kT-c0MsG@h{`1N4X@USU0aiNL(T< zCya2L{5iU&5<|~3)7I5Qr_$kGG0=O|_?5YzyQY7M6@6dv2;PP=(_dp&UC=kV&DOHb zhJ3B(HLXj!FW94)Pbe=y&$1F`dQ7p1VAnuF;s^-|5RKd^De@oWTQ% zZA+6_guA<+&gqwQ$W`C^oP;f+3af{(87?`DId2<0bc93@Uvj_73XNOW^4ZT$89B4z zdHog(2Do=#SX&zSBYtYDkV`ddKVE2~oCI;l_=JYWi8t_tgJ9L`2K!8|OGKh$3xtB5 z`VulT!ECZ}Z}7@8)(!ki^Pb|-bc*5@sEExYaq-RYnN%^nW|~KcZ;pH$*_S%RP1X5@ za2tPYKgS-U=HR79Pdh|(vo)Y!3c%v2TUFw=S@yN35<4s-HX{mnD+Yt<2{X1Dh3xXL z5pD!DW{NC%p_j9U%F0^$Sxvh*u^*OgZyT*;{n^7kjEL(v?wGK7#~vhD7QdX1_qtKa zZ*m@C>G@m_Bh^}I!nGUnhJ=1f){vfbN&e8Wx~kx&*VV3vWk}x_Y3PBKfyG_!tAp2Z zV4(4zY+2?V(*jqTbcMFBBhsi>At#8-X^L#wcr0wjl#t?ZKmi&D2@F~*9nDy#kkakY zGMi>N$?Z=qT;q$HOjSxn&#KcI<9_9S9|OeV_Au-O&A??qdh0GJChXHkJt2QLP3CF2 za^vH&RFoG=Xc7l3vUq>Pe`x23XAtAp( zmx69xhLmUhsr@GhzfDx+_?cdR3iq~Y*_u`u#Ta3P7_BdKQ~Fk8sY|jXIlnw1O8op4 z+#CUvWmx`97;al=SJP!+WCXpGMC6-N0D$*)`$BT(_3c%fso!bL`U7?NWlIQ~ zD~NL60fvtAnBMT>V|g>=LLp9@7m{?LwtX*5Gw;p78}Nb%@3rwNJCLUmXxYDN-YPwH zM2{_W)4>lSo^CySXClhL=Hd7$@rc$`>IV9OjSE90OCp(4o3HV*v3d!9rs)TW@VR7e zg!+lBbR0!_>yu@1r#e_3Z=Bi9he7;}@P^8IfNk|%kNOfSwQN!T7!m#mL~~X^m1S=2 z&X3;QRaW(m?csmsO)xq5KX6|b6jMvr^HIMi4TJUQ`rdGLf66QzIE>?#l%_Ux>{?sj z6H$Y9t28eNUS!>y0NiI(=P`uPi1{6dQ)sJu4V!FC-V(Lz=<@;=Wo}O1l%Na6=$_(? z>_}YzSRE3eXva6EsB_XXeT}eOAMWppi8RgvPfKviR&epIAkqzg8>H~jSk$i8<-E{- zy?+DwcCa=ygw4|gL z5I69@r?n*5I{HkwYPwSDZyQFlzC-8BcPj2|D<2*|K=vG8-?Vd3`SA6<(Ra#}jLeks zFlykBpOPw$#78|7G#jMHR=bu%-rpyZI9J5B*nqnJ3+G<`Z-;AB9?-iXibWq?z`{-? zu@pK6j-~|g*E96cSTgu+Zf;qthOpJgd$A*ZMuuT7wH?2JZQ$ef+v*J7wWd0HuCObl1haTHjb2%%ro?&^>L z6az!8qp36wm31{TYAsltiIC4>2b4C#iu#h*09A5(XW#a{Q@EVM*59B_PsrbM*x6k6 z^_>*2tZ260rXae@6;z~9eaD&i^?CH!HDOZf89ZvG1l5pb|ClbN)vV2N^St1&AGns( zGO)@d;nC4YAaK#JY@y_njO?bZULVLBg85pcgoK7qqW*ks=to9>8;9g>b^=ok(XkIP zhwvk=utjQ@P@g>{u)jVie7f>xQ$=O89gglUj@y2baeEe-y=~RR$1E7d8Pa-7m{uH zvxELt1-0gZv* zDDHnbIkD2)kJ-+B1tCK-Eshr>ZYZBonWjQHdKXn!keHH)3?IM7&ez>n(}kW#d=n&a zFeGq-{QN+~bDuV(4thZxB>FNvXaK0o%_shoOA|ztALA$@b4W7{2g|tyH%4v%2bTXm zIij{wOIE#Q(%4ZFZrcIrT(XgEjH-`d3LF_(Sy$j3>^$>-SM6#pE9(ym z&x=qhKQy+EZhk;+)f}a$Do^<5hitC9=R>!40C^UM>ds0U=Jv2%557YkI}AzS&h`Ft zjciQ$(+gE1m2D#@GqAEfeprr3W|A^uj>mCQ!nf$4aa@SG% zlH^s`vuYaYsjLG7xOU@3$>l)8b^5hdAxVyw>k^6&@+QPgQTV<(ug>8<`r?zCnhL5k zC^42f^tcYK1vJaeU)k7{_`!S#^wV=5SW@t^?BruAW!|*GZK{f%Y4!d32^bcaf8NRt zxdaKU7M8L^c`J|29nP_TWq3c{02}J_;`2QV00C`3>mwhQL3in02r*zdS!j0D|CWO) z;1(~-ji_i=8-xCC>N0*VI$H$=mr&J5@=lz~5)pC=JlbMK!t+>AX+XVVlNpe$_tqYnSb3osj z&DJn_pcmp)SkQBN5xlR#!I`C$lRtEMdODrF(nptEUX==lf?>-eknc=URHb}6?!5R6 zutR-pG+c5a?g^?i59qM((0>>PfoZD#`yeVhfmYxBVEB!9#n;nbp+q=1Le0%|TPQAkDVFGibVzZ#s(+L=vwuAu5 zXdcez4JMAMc0GOe9Nh6xQ5Qckh%ig& zjv~qaY<6{`nDYEMA>Q14_lVFM1}C#klsN51K?#)f@Jb~0nY5su0DbE%&9$MqYbS44 z^Tncx@{YE)l~X5qP9Ky17+?MJu50AM*NJTXbM$gy&CJfi1e8P65na5Gq`)s2wfpu)fBVHvZDD1Q64s!zI$}db?$8sM~&mkl@@KSSF_jBs3haU zpD@<4YMBkjWTz%YCjrjjtbfiUF3m7+`WBsw)B*+rJt8!~wPO~I0WH4?t$}Y~VfC%L z{`!T9j?fSX?htIzkz5$ZbBXYMoetN&j9Gfxf{dhdfjF(H=0D(uIHDZii>8m&nFj9wgj7Fp0;7XZ|9l?#tHS7s z(f#o8J2JqiYZ5*k$9GUylEfeII%2PbjIU~oTn>2wevR!~TVj5WPE5dD+4fzo^A)nH zZ#&}2sYPo~;HTULg@nGtyu~?+58K!A9ria)VZf{=P%zKSAvM|}-8d_rO|6#f?dsdw z9uZ3KGO}2<)ObhBCxLh2DIVlQ4^*@uB7twY=F|A@Q${{j8>-;rjA(np$M79u zhA76uu<}Z5<^(Ez_~2AO4ZP*T82mSJP8CeAxXDLEd6r zvPOko2@TLyLtBiqUjeSeH8f>>jWy8ii63qe81pF)={3TBJoqzZW(qJ7TRr~@F3?FAlzOpqu|7U}pn7*b zuy!!}+qH!tJN?=NLaRfNvqZ=`u3rhEXI^pmpsvgT%`f9qI$->el? zTx6hcFLkg`-2o9U+|vRY?}q7Ac+SH04yO;wBY$Ks!a2>9VAimXT)vMZDPfg z+XzNFfy~uRU2)wgXC4EO-~m56r%J+>f5*4PQMzVy19EdaV&nr zVGt-vDCgjQ@+5er2VD1WppQ~pJ4Gn!S|i1@SqP+BgCiuZ`fKU0nmRj_hOB!h&tmzMtT8F>LWdfCs`$- z>(PSBKmjoRu?DNJZ37I|D{i*2M9^!fhe_2Cnq=cIXVr}gROdOn58Z|JlX>v?u|1?FtLa*hk5cTT=Q6u z(OzlP3G@25)l6$eKDHkaud!h*+(mw>qKu`SP%BSLz?|f4)YosPjj@$PcDKj0|_ml@zvA`JaJ!lDr^0oYAj<#qU`a-32 zHUu1!&E>MW!Non+^Z0ej8oD@V4>HxyE6L?Y4o256XI>Q&3M!?kWv!j)KIPHGZQM;8 z!X9Crg9M3t_ls~d!F64ZBK_6&N>JwvrrS6_*bnu=)dr|Wf3#Ngs_)md#kZx=sDfms0IG6bAYKCqVPKhE|9^K~rCES; z*5JLZ++8~xO;=&@#?w3dRpkq(DaRG_gq1@ona_Nx%$lSlb}wRZf)SUM1q-fTb9UZY zElhn?bV7ZYDoL1#bmO7AI?UPR|g0uaRH;5w1|Z*4rYQ?CC3Ausi*P zuUOfcw5rQp&(BEBkS|mL0-Ca^^0CX{yz8X9inBeHi|inZTL8_Eg2rL{ca~MP!^np) zX2$UFlqsdWC@)A3U-sqwZwxQBry30u%mz^t)%$yOi&%Fy%9?9;mut$`k$SRd)KDuZ zF76a&erms)hwe*g6SxCz)Ta3Zz}sS4NLBf$n5LMZ!=N=b>+ss9fi?@^rhVMHo?z)! zeKnwl40$s(snqO<%VhNtd=)tBo$(se$70%NBWFE4JG2w`!7+Z5gpv_!YgQYeirhBS zdlgTClTaYRlj48GwQG{;cMUC>QFQ6qTAE(BYkeV;)ndig$XD}$?qV%KSl#kpNwE)v zlDsx(M!~Cvp4bhvqCvDBI5NGx}razbx23g?%wK9scze_4kGm&w5PwTa& z}erkG?J=QLpja`8j@{RO+vj7wc;@IW53v zf^-ytp|_nbA2vOm{k=#jPGdgm>(T+=?1)8uXLoV~U#FfXr6GMfg7+HP z9Pv%Rk&+Sp=uR4q_3&y&t-AJ-?2O|IT<+6Pzdz+j+rRzYv`%POI=|M7BVLAYvYRvX zT)c$!^zO0uYJS?gV>E~Y?8p6|kaP|T^B>+kBqI*&4kjm4G7Nq^(L<@w2z*wuLK)4FxV1^ei3J%w}0DuGLOa`t+_e4_vpjlL+70Rlt=I zM;fnx+5JGmmnkwY!u6}lO9Xr0l$FSm;YZU#OHM0+-Ve#lm)jM}ExlEEPP#KjEyE4O zK5+OzG>R}-JaT>&Ke`uMuN$bG!m>IeKFjxrN-|H314|;1cudMvmKrp2>o}AP>Q`fX zbqrL3N_2G&o+{s3E}$%sI#~hsy(Y$=iL2np9zMWLRW_GudAH|fJ7fhM8x<0itW_qC zsLYt)DgxOq;tNiZj;%98)KK71Z3A#&l{RB^r@RE0d2Y!a{LZ{mp&yxaDZkNx%_|O5 z{z*YjlDO`>#BCTX#o$oHU&X{z@nEFtjwyir!N~9`MH7qcapSivnJlGvCMeZndE@@8 z+if&1{)v|?MW1YmALxx7_h{29$Q<} zndg@oLbSwU^VED|I>jGYV{u*bpSh^O7bmUO8J}v>nXXf)lM&v1oSa^; z^m6_Vi&Z{nvTD-O{c2aLl>e;61oDjU%Qtf;r?Rsenx2)s=#JTDA92CQuMd_9&!77d zY)IS3|MKL168DEs1Q)fzlvn8n+{Y@P(P7rf=j6G73)>d7T-zuB&=5#GluLDIHgTch zM+o@ZquYB^<-Fq!0ni=Sv3+&aAXSt)M7%A zkIb{x8m$g|{SP+MWyz#XRm;+!t5U3Ix{NA74h^Hi(LrFwW%DiX*gGw}Qjh3ny+;HI z=UCXUv-gFU*aw-hzt7j(!v@p%kczC9c~6i{S=~r1kmwM_n@g$vnAp(Va;-Awih32F z0uy)bPdXLk$rsf}-f@`p#&oN7xpj6x->_J&S|Lr4(yZK)(NyaaeT0V<_ZYnJ<>8Rz zRJs*YFV3~#Qq}n?`7g9w4+x;FSPw}3UIUaw9Sj)v3<$zcqHepTLL zBOggAs$Cd20;pZ*B1wL>Ulk?~9X_S~yLYi)SXMO%!y?!sMzrb_^Swy0WNRCGERw=B zGTs&wnW;MZ2IEPIMLsvZEi+e>Vd`_N>FR^o6@qOIhe0yLw))84R@2r+s1^=xfJuNb zzutbA{yG2FCX1y0Tv%+bz_^iN$#E4viRM(}mhD))g_MRXmVlK*TH@?_lu+n@=igka zC}SjS`mod;dF!+i^~`Lw*vp^eIgg^9nCMKjW=xI~miE}0?x#`@Qc@X)7i{ul#bFA# zWIA}+Or0;7n7f*I>GRV1So2Fq;t)!^^KBH`D;*Ad_P0Mdd_N1?%UY#uaQgQoe!CLJ z7?%5auxt)#u{5N(oLQ+UZ7E#X;9K&{-;=js_qsRxlTyxbQc^b}@pX@@R=M(_Gr10t zYR~Y5M<3XA@eu=`_C|d4oTPN^#}hQQF?5w;NrkaD!nMFP($6XGuZ1zunK9YDo#X$< z#XYG`)@;xf!UEUzgQ3qtEVlUT*~U5Y2Onm-ntu3M=<)#d_PrYOLOO$FT${x^-`uCEaC{w9Y9QJaJUTeqx0^Oz$ww@0R*ZqKg;$?-@Fnq*$pV$wzvTdk zbY0}0n)21{X|Cz`5vh=Ye!z(PQ12?wSdY08pAr?KSB!kHhLhQhYFvyTy^9Lr7HJuD zF`xQS+6+^4v=d8vj{d)vf5Qr5z69#LG&*u|o`(x1`(f7J~i)iZz zuGT*;UmlJe;&K@A(lS-r6z;tV$)GLZ{nhhRq$YmG{}V9llj3Tdrlp9J2VP5IyS{poiPloh@$Ey%BB z*Au__{=k03%rr&;_dS$hoIYH}Ng6P4l=m%Zg!oZXEb<|F`KaqwMdTttngY6u%)R3x z6y#yb27tuWnSbk1+`~?TR8q}|2Jg>Z{GJ=(#uLgGmJ!BskKt-bsTgh}pv^VG;Z9Cl zvwNFt+&A-XpMTlHEHI5&pj%nA+a}tEJlf${eHXL~S-S(7=lF+D=OC5?zPO-y`YrK` zVS(`66YZ5Be=0%HQI>iJ9$R(cDqabDi_YWElPnXz4O;{_&VFYgrAwUa=6>8IR)@D6 zoX;k{$DhAmZ?@)~l$hc^6wJXzI)~q6#g&@}aDynGD37mg>!iYRCUnQMavhAiC-69p zsd>5MU};K3>xS88KzUthNjSl!>UN``1r7c4r_qlh{xy4a#A-@yES-tRGaOmkbDd6$ zI@<};v(yZ@tie7d#nmj4X1@)?o4LpnF{Vz5ccjaWc}CH(I2e;BkV^;*fWnfOct!n@dqNe zJ-dPhemjNBC2hLs)m3{{*ArhuovCK&%;U{pp{n^!yFn0fj(hPt^0{m*82V5eRXOua z?d(9aGCx};7|c6$1cijnB?+az*Fgb%1-qYs1Tx9XM3H-=J|&9pbE@+{f094j zuiPzT4q}zsM^)L?V@1Rp;Yn`!zND?Gxp}<#6loBVSB**FtbOT%%4nB}q?~ z?>hY1K8pLXPTH+M!GwKekI`CHX`atxVN>Va6=GGC+UiE&BCxSlr<_)x9fL!+^P4xy z&TEoOw;6+&z9qL~0Tuu>+}oBqWQqzw^|}W~OGEs@lckKa`~I7T#)`3ZZzcDLYE&mn zM~R#ze-;E%Qiq$+4-Xm{&MRIJ=pMZ0|%0+`j1BG63>r>oJMeTSYqfVdFQL;83MK7=zND zQC*{DLt}_2F^8=7y{dRl+dwwM*HM4*AZjhg=T?|s3ff7)ln(IP-_*e(ecp?LI&!Qy z&Yh;5V!9=}rT92&=uMt%VJ1OY-Otlc)lYF#-f=)`&s3N2>`a@h(WB7ARC^lDa@7qM zQ-eCqiLN0m;=}wk$I;OjLbLHKj`3qhZKPGJbst=eIo4MPD)5mJK{n}pf{x{(| zEt%L-#Y&sGz22AZ;6#oj|#3>)6vecBMqBbQeyeHr5POklK}8-;{jekQ>}H! zXp~pYv(4f|*ohCHmh%amVq{%u9p{c`XLeByop#JiK`l9Y`FE}e_KEY}2G?N$-i@O` zI7j*bZJ>=iATs=kWX|v#K-`HFv~7d#W5Ts>ZGq*DB-NV@eg=2@UI%0xu`2JRG;c9e zORMw$7{K6Ij`>2T5>)#0(|*Z%olN;IlSe1x+m5%@TyA6o3-sK)3yrdnlK&fPY|*Y- z4rW9q*qfMMh*KQ`R~;u-Q@uJ5#tYZanifrrVh9`UE4eo=b2-LlHXEOs!+&h6Z5Nkk z0DDt%STB%2JMC3>dw9Nws07>W-EdgMPF6wQsLDAo z;jm*J>77%27l!YiRi9p(U1`n$iuF&LH`S(aqEb9Lz9Qa8%t8td#keKO-!zOg=N8qH$Kd674+3UzJ8X9{B;cduj0Imgm-9cu5)9c$4~teBpdCtK1@21>SNu zx%dC(B>YSO`-VNAhjW#)ZO~KqqAW3=^L2q*l$@q9DKmAz3mmDm@~_`1eOor;3nsD? zKr(WzwWP(W^)EAsTT;plL=57-q>XS*W* zwvq6nOf&VcTsk@dBOuxf7oKRP$0;WByyMC}`B1w8xj~+U%p;JXjw7=;`q6mau0FU5 zfv*gL#{JvDmz^3GhStcha@0PL1HuzsyNGao=#%J6+g(GvF%Gyqd4i*FhHwr|Hh{IQ zR5=}5D4TiMC>jHrsgfh@1tm~&$DQw$v{}HXXvMx}uVPo<@m>wNFuXnwgzkvIRkEY_ zznka6vyG$KHjIkxXQ)lIBb3YzPK24qFx8HXyw3$^# zHr&gbq{^Ssl_y0)9s1i*^bqCgc;|LLYV zO$UpbU$yS}_X@b?vhkTsOCTJcqy;?Ck)zJmPRGJCTvLH{#~ zCHHiano`22HK5h_CkvJfi$X+#Fyt21Sh0uGn&jM3GY*?AKr!X@7|x|tpY1qcHRC_#szQzctWh4r-Cy3TQ(M| zD2{r9jD2%@`boN!0FS}xeH)I2iJSWqWDbtat`+nrOvD7&vu55)Vy74WN}7EE>tU_k zp6n@=T7HMw@mFJMopl|LE(%LYhodH zsSd|+q`6`e2d$GRM}vu+{erdCQnI#Z+S4C}h5rL8U4_uDvUGH2*- z!R6SaFso_bCf-(@3;^Klmc~m$#*o^6m} z{_7L{4YQPlytA;nTLEMnjkut*db98T>O!*<6|nbA31028IhhHtf9q0r>jeBNC95n-|_fTrgN3-=i4wsOZ1`A9`jV#TI4M zXhBYL@NIJ=@68(YD zBY*B45{~$Z;k^%_P>LU{SZt49t6VGHRAM@Gs~dHM@n(_?CzPG6L^$$7+HoPFuM z39K~A8fSaowyYR1qcjXVm(i2YD>wXk5hh$Ax&n1^E}!1K2{-xgUCSjTqcg>5%0T=p zz<&xDjHk3YaHEzvUN3Gs3rwHJ52kXgLg26m2^Am{^y+j10C;@wF@R7CSBser8kRAy zJGIc?*;xNtHdH!DHz_&aG4Fro^Il-WNw<@nvdxwGP8mk{qHetWc9FD*!1x;@%bk*b zBg1jU>MS#ZNh#y3UPX)83twJZemupn`=$B++xv_v%kU)rSMH)^k7tjI+J$*?m(8M7 zX(dUepwjepueX|zgrix@lbE#v+$E*v7gn+OD>-zJ(oJP z9V{JmaoTz08se!odzBKgJL@B)mW##CT4NO0A)?MMpk|Cu_2Z;f^{H^lBnfiMWIIQv41F5a-A`JLprRXf+rgM4DLwg+= zZOi5KDGAKi*|GM7e&VUpS6lwG0fr1L8Z92}m77;=IktiO;H~rAq^_Rqn;(SE1bTj_ zCrVl*)yfqAIxDxQ^A3CSOY^?`!v90k6FPa0Cqx;ftqqQpP#|~%%$?554;=j4!8hzN z(J>N|%ZkemMYVtUtrsm#7>V}<1kJ`r*XA{u0c=B>eeE%-=G(E&GnrVVO|U{TBBXzg zn1U7Bl>C?s`_G-9BtTF=P{drLDowb4SNNC0c!qQ^e+49U6$Vh{!hEFyg9K_rR-WV;6t6)2t^;D?;5XHkbz+S9)Z zkH`yf87~#NEIWmV^-Xh6s)&60?BL$tyRAEj#)nCZ)+qlTO%h!vYn-gs9`N-QyA@(e zC>;ZPxZBWSWyLAV4ym0Zn+5EN1S6kjrrM}N<*%Kly%;AO4XL37rGp)Gj7~tI@lF*$ zIx*$OWK6`E!R{&8IKr|MZn{Vdq%jheT(9ATb^i;Ay0Jjr=@Hf6qw(|;oo1MC zl!}HZ$y*Ql&q}Wy6p!XEg^WjxO%S?Jvv6J7ie0h;t0vY?l=|0gBXH>qXw3N@(D#JP zh^9Zg?fIvFhD+7Vuw8K5?;DrgE`{GHB%h{o7Wy0S(L_uJ=7}lULbD36v1l2ULbAbN3iLN(9#o8H2;zEt`A77AI+>3uI{}J=UNQ#*&yt<5WV%a7%`Uqu;uK% z!4ahZWeu7HL&M`!oOTjIE8{%+^>wNeq(ayhqm2#4zKs5QrR?F%=MN~IXjMNe5V;uz z*A}>LsXqD0{a6bfOM| zPm?5fs{USvZuFof8w;AT)MScP4%+w%CH5nypWYZGZXrnab|v=$9yJfj{k1VBF*vfu zKIrBi?V(uSDLGr#fv8%Od;jFPoTQoIpJ=xF2ixynTvF;&74{B=`jY=bc(>IZy;E?U zrZ+9;wFTp*9|?sNI|pY4tr0|I1+KpEi;&>9#c(_4#zUTWqa9|x++UkCGJM2Z&elkp zZ|Wwjvm(oxl_58JnlZ%Gfz;lUdaaB&Xo>GyBY&(UAoX`!({r;k+H(YRs~_cEjMabq zP5`JH=5q$s&ucgDr=K3&bKSY{-*O96Wwqqcnj(!Eg}sXMq~fHL%h$yX>5eaBaJwr; z+mxKn3U%844UfOoP$HRhMZy`XXZ$M4%fSh_dAO>OQ zt5vF|GrXd=hsB>x4eynna=83x`~Q6-Sm!HJhNeE1kD?u(u@Q?L?buYL*@=yHVq+kD zH;d0*q;Gxwdorq_{&5o2#ER}?50H0uJ&Z03au;fh@{1n1dn z&!uX^-^P2BX(;Odzsb)))6w(^cYod4O#L#yKc==~$o_Bd)V$Ez^06dA(>_%rZ2M+A zyJ1)OyZ_(glTaETvrR`-5AHsM95UPogjuR$2fa14rgNNdo(#VweeUQjop^tMG~y)Zlw%gi?Ei2Ow{Q19x+e|IK))8r@u~gH!tr}^;pFpr z`fkL+)h6f2d%wy4ddl06ieKcwi`23lrxRa%pW9hOFt4;I^ZKbX)_L<;)#k9;Ujw)w zsIZzvDrxbXXdC{i$H@I0hhaa#+){U)(~Q*yX-+#UFaWH5T;WywIo{3h7HOZrQ`AiPjwt2G=Mh&t4TD)c!Rn5Wo~SH zS5gi({>HGfcJdP6fXuVM=6jh}1VV!rsF60sFvpywSPa)Bm(%&?pWU%HDW$4~JW-9qQccgHI_Wf)RcsZ1_6@21mFUXh|Mn?QZ^~kGy0@BX<{MoeM^MO|8J2e24ovO)qz#gu6mE|6>}X=WyV+?NO#kvHyhb ze)DxT7|U`Fh7Mm4Gkm!h$^gT!7(E9ve3oitLWKWgYrPZ>ll@oQcI@@tv+VD1?`IU< z_j6aBx~8g=dh_TqelL;KmS{-#gK+%IXYWV2flx?v{Po8uTm#kif!B)J+}w>NSy-N} zSiZ8LZ=v?M~t-l>97=GPvMt-Gx|`d=O^u4S>SzZGoL`taJych^nQzB^wDp@Eu!M+*qe zbI^AbzO6em)~5K!vKyCF8CU#(sz1&98xMugR=lwcN+~sy9x=zltGNs*&JXCL@ISg0 z#lz4^Toy9kB%PTYcISH9+(L404q7N!GeT-<%!v44_y~Ky>+T<6K}AD%5e!;^K1A88 z_=_1fNx_4amnMsuOOj!w8@o(i_}=+?+El$0TfLcXaWy^1I|;)S zo);Dp>ITQ675|SEqwZFc>}N2*uHSKfP?S4clus@27H*$e>-RISrZo00)krzG-}@sB z{}$I@_3xH~u^G^Cmp`5F_ug-PdL3MP=%`A#`Ox63|JR4Ha24)-K|??Hs^Bf*!8vPy?D<}0)DLFHt^#b(exv@89vl`C)YokFLcIZa+@{hWGP5_zm zW#p02;g!zjDIr}HbiT|?db1)#?+NSY0Icl+5AxPhr8}fIPxFGPn`q%_JaZW<&Ka|m z#tUKzH`O12=14D-x?@b+A~_d%ycW-e&a9Dwi*>}Kw4#+vMC8Hq{xs8qFBZmU`aG7H zNgw>TV@$}&pp#3XGfw`|PeJw@ZhKP02mFiIxmY*p&!O+^bN-QjRBCwkG?HSbuGfyN zdcXenFrg?tr%HrPG~T%~g^A<=*PLc=eGrKsgGZT+HiUnujk@yGmc${c6t3xZ5q|=` ztHSrwrgzFv?2}QPgiK6=s**6~e;-!<&c~-Xe8B;F@1YF?3%d_gk|zD~kRZ$sv&UZK zs%||peL51LHH>o-W1|>MZWmpIQZjVDFXK2E9Um_aV>&8r^>aNtr*)|dODSEWD4|&8 zvO}^)QBIM$@}Nmku8L+hac@RC41vfCCJY!IT(R<^RBrSmcB$+~8%O$=NS$%;;XM5QCTz|gSOlAw_@PHN|fPTBKm z&#dW|mFWBH5_C%u=|pa5>n`yy>JnWcNz1ya8IvbpE@|=U$zfoo$AN2)CNI?^ zjC&%e=aIp->?LF9wFu9brSPGC8vCSXK4i>G}-4 z%w1<%x@tUhk1t%cud+XRXLwPWtBoh;lsUsj3XQ}oiKKi-;U{D3$6ZR4JLcu4WigrU z7x}H!4$tT}2^JCl-eO~^`fdS1)_677hG@$LNfiYZZV#oY)j>v#7+vmhi?ElhGEPJe zKUo>;sBlKL-d+C6!JyLGu5>~H(#!9NX^!3u;n0#6(j*Cw`CTTq_R&`5ws>bWIbB^p zF;96B&$Z-^QcimCr!&{Cqwc-$Q!8EzL9Z27`-d6x>T2yAJ^f_0v(?l9Uv}h6&zLP1Hkw7$ z>kFv%vt}%#2dQs8;KTdt-#--582l@|pR}4Xvw$x zuW+hW4{v6F^|IZcuIs8^f3~&QwEnndXfj*#l7+)dm|%?m7b?Fq!BbQ+ecV2_y(+Cz z!bM0U>~d1EpQhPvrQB3j34=7J$xe#F-p@Uk;u$n!-6I+AlkfFY3hW4vD-TiYa$C=R zO(r4iG&9qgs$rEgW#%kr+7a0>sz4t-^boAJesN02epUisnkoAsLX6n7+f-~)Sd2C9 z73-P3jH6Zb!$m_gayb`$Ht*e?cW^x%=A5Ql^7{R%2tRo)+l`NrgshVS=x!Sl!aMW? z=~3;hXV6pC_L5UW_+dm(oUbvyGs~&;_^{`~yh44t$cU(`riL^+jV-LLy&=Jpj44Lb ze_<<2JNZ&He)5j3?@;7Do;fl*A;=Hg?MR~=YW3PmpCs6XUdikl(P5V@5YN7N14nU4 zzPXt%PXEpHQA*= zuL`-@82Hjq$pkyKfxo=d)P9L!{(I7jN>`PsSG0RHyFJXWGY?hUdQQ34=;DF1-gV`n z4rwt{;YOA*%i_z{FQ0rnOCIvz2S)GcH2-$iMV~)RLL1r4dAt{`d*fjvzjJ#>JyE>| zLB0f+Qa`#eD{Wk0MAU+&rGm42^k=SC+$qz_YCJ5Z`Rov-%{#Bra-n}J60ab^Z@PJhoc?EzlAm~oNJ+_fFONbM__zif+pc=ysx?d^BISkz`69XiS<^TEzW718zwhS zM9P(Ew2<%fpp}1Ve#-vgr7+J<&mTTf zKoWF>La!I~BW6sQ?xw3xnI~IGlfRWPdAMuga5;FLD$16YtfB$}kB0tt%8G?F?2i~z zQgi+GM|2C(#BV&xk5cws_KzzIaZgrrz;shB*pUc5=@HAP-*PbkQ$~3%rHS(>IE7)k zP7w6}kICZ(NWYDmvmOeas(wRLw{Lr2GD|Bv^QGdeY1;l|~E^>3x?}V0Dz3ZsozNYhz;^OdPxDt@Ue-ky2b$mN z=jXAL#b*~^RjV7>QAxB^y>Fau(kc&Kk+n#nZ5qc3^RQ6$*uQw38SnF3yweP=#>Qb6 zp{lYyA;G3XQ^!uU>I_(A!a2tF0o+U7r5c7EGhfMnKRYgE-E#M;Mbuk8BJ})QRTp-a z$vDf>{23k4oW!{nVl7;=s#~0mb^Av%@n5d}vXCeftCloVf*Nx4Yt_JyHSX14y~qmh z=C0?pO6H8S#P%>nIM_nAA`0X_xRC@p(&J60t%o#~Q8Q2; z=n!O-x&>u?-zD8itt3-b{Jvo?@tcPCw8}wXvxLk)ZAK5Mh6=U%i7@DvUE_9`%xP)v zSJ|8C-#XsmM`vW+WQ+Sv4wMxGP8eODA1RZZtlPs(p;i(*k4}ngd7UWJfC8&0Q*OL2 zet-Yo_cfxs@6GsZf5v~y7>^NLbY06P0%$`->pS%?+bmTzwNmXpFl3mGO;w){i3wY>YD>@0=t zZbUrft+bca66_7Ze0A~U^YlHJvn9=evwP)O(r5dMhzG?!YSh zn8;x-Vorm|TE$5+BBM0O4#ojdZwRh<8I8M;eMx_H{$vN;LSyaBu|py67?wj7W4mI4 zo3T`t1Ul)bl!szmlyf4&zERptG&u^+@1){j0WV|g3nff}6b2DQa>~j-B1Ix>~?s@??mN?t8sg&$@TV*$|oTLJWj*!AG1kjzYxkjn0!q{LBVwj%O(6IXhJ|Rl6vJj z-vsX)R)vEqDD+UCZo`&+@N_R8tJ?M&QAfQ-#`dsE5o1zP4^friq!Q zS8ywCg%p#{Jbys1_I{bc-1e%Shqatj7@m9XU*aBUx@b9PiM|(P1#rm)hJ-R}bPgFt znwbMs9o%7T^Z+!uV;I1QS^bZ8Jly8~Oy^6}*jHdsCvM*oWhZ8hs2J;c0%k_ZBan$Rhy zHYHzX;F9%di0@U#$@9&PE+mT0I6k11yMO8jY>kL@ir3;!hMdDD{xb4tFjX#gpvQHy zLtKBQ3%SVc=_9L&iQx0?eH?}5?*j<53Y=Q!T;$d$d%54>lY3WiF0|C9aD+2WihX!d zlSO8yJ2hLQN}Q9nl^Ez&dD~^#!SzX+mSE^z0{d$p0G0>lt=}egc3mLSf-mxH zrYL6_0AUhxJ7-9jO221%3d171kB~W_v%O)Ke?9-skbYCL(r;g|?l|>RmOMO?7*{oL zA+mdG@biax+B>4a0dD}$NQ^NYhI=UTMGnExjSd<2_0U)v>rE5dq4o83z)!*<=h=ii z@?>`m8pSEy0Le68WZMHKg)1$&Hjq1LRl7QEE=ZN4?%ge2`Y{M`jtF!GEsM#i%{A+pep?|lVY4#{h2k!gN&1vG^5 z{`nTp(Ko{x0B_wvdF_b6JnZLC1?ULJZP#JDUS+fVtsc!FQqG(K2ZR(^1c6?JS>rK0 zlU?8s(!OA3WX*An6W*IIDH!dZG(fZ$DNJD})ci&UP^NsEIFtf>_L(r8{O;Zvr7%lg z+gVE(=Zf>sEj^fJ{dojtf@5Q0O}9qxcS^HHyYJ0)Lx^5spIu_i2dqCkT(9XmrjaOJ z>eJg^ZfE*SA0Lb#fD*-%b5!NEbq!cBxa znJZn@0XgFWM^h6dmtHq}xl85@1y-sihM2vxd@&UKuEMfJjanuLhFaM!_T6^=0wYxc zWVW(64B+X=wKo6(b#$DEA_;{uD3G98Kk`JAs@5OYx9etsD}eLD(M&^e_n?g+d(^zO zH`ss*IkG!POhY@$nWX614t@VjX6^Dqn2oQzKn5IBbjTb}z=CS0`K~FLiw`tCPqyBl z-&RNw9GqYmR%el$`D`D(9hSJ93od+mqXy_HBazsvq&qN-gQ$(}vq^^x%peLc4s!m2 zFD??~(kXev%qkkLpmOegPLYXJ8O(VHbWOQ_8CRQseO~OcHRawoRnXUSAz76>g2}@_ zYuYa(659bM1kw+K0@t3c!}*GF&H;+-fWSOVN~h#Ehmjm6Ik#Xm$}AQ#{+ztxA*h0g z_hZ;ToC$t|V4D3by?f5YIU&+B(Wf62pmN8ed@jZDZW$mWB}UpV4RDxI+O7WloM+cN zK0aTwyEIg0(_I2UifU?Vy_)g}@6pZpvc?(@{jeJL$G*2ggJ`)GkK=t~+6|Zm7GM-Q zTZi>G04zO$MK!*q)?dis7&R`2+pZR2pI~OboCpe)FHb|jy^_5_qFS%5QL1$2@Ae^N zZ)=UzK_ZzS$a!I2M<`+&%OwF!ymMOtt~V2CnhsYw*%T2Wr!)k;;UUFA1Bv26vsPg8v~AAOYN6t|OQ%9L;l)+eEr6oa=-$3Cag8dP&u(DhZ`*`MKT$aOIgJ1^J5xeuOejsTuyU^jk&%t&5q0PTl>{)ibnDcNAU`tN zmh@Xgs%;!Oe*0a8sqEKK+;XtGkAiTOzQcJMmv`}&^<-nj0t`3C0L-|+9DA5E-CbP5 zC0&Z3r;si9*HjeA?q@q zo(dQ5YXC5J)&UzETl~#G_*sN5L;t?OpeTi5q-Q;JfN6SYpdafo1if56?#BoSg74nNDuFZ9 z$glrC@Tmw9dTH0f6uuk+UsgVM?wrGrl{kzfH6d1b$%=R*X@YLAbG>*01OsOB&v+5a z8Ut!CdHo{PFY$C>vb9c?v)#(b;ahQvxzUAn0MgXrzErw`HkRu1X7WnjT2%;&#@ z%xh&KcC6;M;rS+h;*6-1Kt|%d9qmGhW_`BCbZ%^}*(RU>!tIYQpUj=VD zw*KrlHS(#YlEFE7Rvf-zR`}a;2J=Ph-Wdn8oBcl@VV|y+B#BQcCWgVh=!sp2NdVsI zH+14HXDdrunhy18@9Ij)@koR0{mS%Y7+$U157RAi=2ua@O^ zRv;oZJu{U~$C%&XU#j$+DV@6q`L+2%hv$9~q8%4?j}6_jXOX{KjTo_q#0)=VP`{bv zxnWLRVchYXBZr`>{q`3=hLGajZZnT9vVU*>_sRY*rCm^cr}XZDE*pO)R@n_)0ju4V zDQAq6GreclB=p3C;&A4BkM(H8u?p<*%E`k~^OvxED56&NQn1Q=aJksYFc;39YzJlc zTI6~`Z)^2Z=-?gYW;e^)mm588Kk)y2b9-wbmu=^{H}}Hy?B9RBWXcSMa-Gz9!Wq%v=Ups$A-U3Wy~6=WFYW0 zHv97+wx?4`o0VJN*@#i6&j9w6ZF4I#Z#s9n24mp9bV&5vREvxL?^V1`D@lcZ`+e^k z*zcU4h#0oFaBiF1A>`nqIyKCl(zF!MoJhQJ6d1oG%Wp^;pi{{F{?ivJ=TBY`{5oMh zp-b6nWoHqW`QpimT(kPo`#?^V2rWl_oMd+TS{hM59Vf8LMa-wK{1WEVgm=|aqBFC! zH?aIJf$!OU*7Td|MNZvc^8;Y~3jdkYZT#~jKL1_yV%ET&C*AKd{$@R;`uG)J5uKP_ zYo6vZ<>uYG*4Sd_h;o+G=kMS|@ZUU~8Ug{n3}kdYJ-RI{Z{fMzaTR7p&fKn}(`U^S z`-+(FPQHIYWF16e+x4mPQKrAj!i9UaIpip)OQF(QfI`4a0W6$BWxEiS&Vo4oQj#dm z%f2E4TAPo)nwA}Z+zD#*n8QE)RrfpZraL#pFo9SND6Nw0jXg6yvC^;4qEh+cndNmB_0tQWd?2gcvTfi?WGuTb** zYzGxVvD@^PXbg-0!YR#Tq!^^i1D1P~%v<=~8s}nCuup$8UHf*m*R-Z}S|i73<|IRh z>XXl>GR-U<%{mst`0KZ-K!L)X+`>Is%yTu+o$W8wHyH|nf1YNh zwrKD&g0z#L9@`6fE_TDYk4&!r);35B1d3eexp2Y@_mo6SA8UUrFPW|hqxBy8U|6lB zrI4k2O50~0sm%f{&xp{QRH<_69DwR@vY50M$ob0s<0@omS|*MCVIBzkn|O9=nw9pQ zO_GGF556l=In?@LI-eSzdsWxpN<2~@>$7O6=G&P1S>umIycIpbX;w6J#i%;%R0X5h zTchl3I^`RyoW8esKk?QeJzeX>JD(=(W-LMA4Jp$yBps=E=43q*U!>V|rJhoub7PN` zsZW1uT}kp z4({$oDJEsWJG(6vHBN5J3!fX>uUvc7i;EP}Q1X%M^1G0_6l0}0guo<+)J;3Zue^$G zYd}8#zQc*wpwj9ViwZn$Z(a#!fGo~l$d>b|2;VdFWAt-*u=p0KY`oFnlM?^)9T`c{ zZ?r4gA^k$jAURWG)^4X&w%JJ31g4E!OQp-Gw zzkWL*s7sklO7?AiF8Qg!k-Aa2il@){!hjuy(@ff<|2Sx4glDCYD)mXRpUY_Jezn?K zeSSbQpZ0&d1ckoI@#FZ;G^>NFeM4OT%NzaU#O^qQE}-;7Tlzm$k`ys1%%(Dp9XTVU^}^1h&N1vHSC7@?1$%r{~As1!RKN z@#A<8`7+X(oK*EtD9k5p*)XHL<^>yFR_w5+X0H`fU-C%8 zJW3?Lg*sBDA#ef@pi{mXw6>e;56JU*PMEl+O-ENcXsirt)Z*SthKL=t>Jj!z>W4Zw zo*)|8Q}I$a$uc6Y46amF0fMs>gchhcVqgVvp3GA5N^21-(LBRcZpNF;J9R!DuVt~| z0~ts<0#y`VX>A>0(J&11RPf_s3*-T&ZRKmv#rYv`k@u13+FaZ;QnsQJt=8IlVrFw6 z^U8Auh?Y?Is^GlwWF2pTc%LIBHny?Wx&QS3FyVh6hyqo#LSOa6NgNR{s9u^nS+_N_ z>E<{bKqMzG3ZVzeIM|XVY8qowh51SRodCHX1Xw=AS6EsHgV9SV7SwMgoYD@!hinj> zh8R5!Nl~KM!67Y!F!w6`WZ!LJ0 zh5WB&e|{w*a{aB#*OAb-Ldyf=MFX)}>)#8FLbz)GJe{WgLuPfQ>zAp#b7}q~RX4kp zhbDA*&4Gp_vEK*Oif%7ENQa5 zCFR|%jwEwq-@TpT!)X5TBj!E8j)+300d?mI6hi2kJ;_1kdUpQ3^xy!r-0|%-%5a83 z73Leq`;+UIWxxkFA*qFGjI*S1-D=EK)F#w~yo91+q@QK|bM-TKG>ZdRpo$FIJp&)S zh39X8JtXAZo(-*A6}i2#q~QbCu_ox)<bV}Df#lR(HK?nB)2`ZV58P~=tWZJN%BtVl6# zQKr-hE39$#IGl{p-E=kFV}l5ko`Kcx-~(=pAvlwgWGGCQ6&6Pa|1)AI3fG|EwseC* z8+nLt<-4Ye?)(;T2@PEJwDyjY2~{4vc6)Xzb;f?cccbZUkRP3g~h^I`;ir zcZUO&k`qJn=EaDjbDJ6)^$~9&?XPwX)ICM~Krak;{#zL4P1%9ThECq+WdOgq2Qu;Fej#p3- z36S5lP6u~s#O=KZxPvyMJe&pOd*JoMYiZs>tcqe6U6AVG->erdQ)=XgYIu|Il=EHu z&z<3c3*e7Zya$i z#8NWt>3x26u4T8s3{=_~LmVzhW_A8ptXqEt>Zy_I7ccRHyF_;byNu%lNQZG#2K|@> zm(gC%b*(kf%xr@hh(;%!pFHsxuFZH;j|~b|RE58@dHKXL8Dm^N7Cxn6P2gm4sA18*VlWg0A944-TJlC!#+ zb)Q zd9gIS&BLm$mZI%e$P>enCkERB4W`0bjpX9j9afHW;@i|3SzA~3OnP_ltkxH9aQYg_ zfFg=`>o0C-)~|BH$icD@JvWPM#qgi|PC@9B#jK;*fDuz|=v>S{bxpn5Mwefem;q{j z?URTDgql-OQ&C&OuehoOihdY2)H2CzvC-T10X|{ti+tiK)Lh#in516Sb(ULZeuNR1 zP6*-*N&>h)BP(4~KzlnKlmXc_s1u?Ly$y9Tb| z$-m(*%)cS+^ZOg{Yq|^2@q>KyNAV9n!Tf)cW>i+~IrX;EEf@Ga!)(x;>( z1E@bP`cjgLs05&$V4b9D8v_8wfYz`+I2kY&QON>&N5O_Z1*^KeBsCe z1_usArEta6v)+39S464=%^i!8N&tNyhRP2VG=?E1Te7DMsAvw?U0R!)p-iX=dAs6) z5S45Va<|P6$YYOk0#x-N1qjs*l6H*!z|+y)RtFRRD*-HH=gYQ{Tq7hwzY>N`e-97+ zqIk&G##aDEB=M2~s|Iqw@v#|}5stR{dUZ`#y~u2E``eA!EPV@MA6x`BeqwZN1@LfT zWTcW7cKEdda* zeZc?*iF#M3;1{da;)q%J;6fSikq>k02U7FW_~I&rc$z~rrA$z{(k}kUbr#dk-QC?f z*ZaYxhg7~Z2Lntnwh;&fmCy+4q}_FT(GIFr*i|7U-lwPUV^zXj;0C(-j!{tr&-K}L z{Pcg?=$Xfw)Fo%3?vC9ZdvC5Dth55s(w=U>9&n3e&;x9*ALwj2bkj}R1 z5WS+@?76?Spt@2dAIz%@byuh+XjD2{**-i=2#CuR{g5wzjJE%NyTMB+-az};nOnE* z7IE({7L@#xG(X%{CqDfxm;jxh0@d+?JdO_`ZC{j4=4$%y^S>BXvLp_aJb>GkrG*V!B9cEmE!1P_+E-0} zp^zvBymNP($H;%zq8s)`QVE!$c9oZ@8!rdKjQGB{2jAJ+Xr?q8&r*qoxU`NYAk78n zV`wh8BTB1fMAo(WG5EKaV7$EqQ`Z8P@y^@j%u+on}FZtTwMqD#c>1^BOAR;DS z2KA!6F9<}?r&c16E}gy*UhXQTV7qgKuA$W42o}aocR7Y(x6ZaxZs_6O-{-EVR2x2|x`_N$@fa3|?zaofPv)mj3Y7LsRJ|U={dld%(PH zL&B#qckJHGTn@8@Lz0>|XOi#L1tggMA^tb z6nH?Mx@XDd3jGE^3p~Ene+SITU%cB}vhW}!_o>;bXC)YY1OlJH3+SRBFolSv>bV6~ zZeI2qp|v|{kDx1p18Bb-I^~#92Z*Hl7~2QC8w(>wu(QRz&(ns4bNFqJvZ7VetwQIg z)DSjrzibnnkdOcZBhE?2=V&R#>f_mU1QqT8{x(YMMk;8e=y5X;StJcO-b@vwt*!&0 zaqgIzg79kwQhu$wd7f`6hmQeg+(ax*L<&eR!>%59gNI48n92T`2bcuA6&tW+c?-Sv zy`lXgVqa}K7qqR3?=YgJNe*sKbyh+Og4MZIYQuo~^<+tMu>u|0?yD~;zql_9LcJ`;#do5(ZGbgpkToK7?QVt2S3_S-l5{0P9NW;Toy0oe^vl|2$A{=#>Raa&7Ht&44I!sWIu4YN3K2+R`zI_3#D*Qi zH~X=+<>zzCx)*EZE!_j%YMnO6?t-^41f^hMRv#%TDfgp|*oNhKD6#bwJ`L5OruH=5 z@6#nKG3hp$Y<%mxvJExmH_HWpR7!V2{U#vIF#sH@m>K6KI<;C3@y6m`maMb0^Cd3N z&GL1mEyXo?+9Y0nwtOMSKc^UqaKyyK5i&{QQ4`$7BSp{+_C??fl?muVWDGemi`Gpe zs(o5F38PyKlA5RpW88J5WL(}2a0E3_y97Wm%S;|H!{$(i4m`G=O-l^q0Sl;)wj6kx z3LS29cOEiJJl(IK1$0dC9Na;PLr2UV9ug=Rl4>2_aL@Yd%=s_4>*5qnU(QltC(lMv z_5r2`^sp!tNq%6_MjD{-GvX0d%2bJHrVC8k<(tpX;J(f|P6WH$ZxkENX`y3fWd$g7 zwcgk-@m#^CimDoqRv!W&#*@2mDb|8!`kYmVJu~y6dTZ`qlO0?T%#Tok=ob|@F}Np# zg%dP~5qE~t!xf)4tyLEq+D%xaRN%ES}@PppO{(d;2!v? zrod8*`d8tqAsT|+}N*w)FIS{B? zGmG17krL(S17>y>w3TrM4_3={y=aW63XruC{8}3iM!#up)nkjv*GKzFp|T{%p+K0$$Lw>DRt+o((d$zV5MLl5T*;zo@svjEb+rHv@JIU8C~K)A z-Rlh-X>H8T&}5+RU?plIH;n zO_g`?ld$bQ9c1ACz(D}#$m=Qv6U1vd{;-G~>ZZ+6*-Q+n+wnRqV%%3g0P%$l2B#Dm z66#*zkUrMEZ38am+6)!AIgLUxz*e^+DTPk&TUx=C;px=8{4unI=1@RLq2V z%zm9C8+T)RY7B|X9*+IP6*}PWfMEkLd}~qjXYMDZZ9fkDA~w5{~ntbDw! zKR-MP0{&*$0Gi&cV&)l-_if{T7Sx-&_oy3%g@w%t+_~Q9p)WoGCXl>MWuhSnkL7EE z=2Ct$3!CA0<8~{VOLu6?W)5a`JM9+x@}N-_RyT{RZX5j5>pW4e>)$%e+W0oUJKo*h zZS$ZQrr9a!7a^c^FCwfl3A)rjemDb!4R(BGOOk*Pw!u0$HO84?`wQ=rrgzSq;esCS zi*$h0?tiRAsrE_lei5f#44`Fz0dNj}^V;owt$q-{%E}%f6m>gPZ$!`10iQ)fW3@1z ziDxkVH~tyb3R{aPXrF2$i~siPz+3^JG{AhM$_4Fs*XidAjD$#Nf>ZcHr5<7pYeKLr z0_&KMd`qId>1bl8qUY0S%>HVuA~X2@@phiku$;hd(ufT7oe@`j0}wV++YCI{jTX*4 zi}@_)i%)M}?(|I>MOUM%c62#!K?MD)8SBV?& z!2Ft}09Gn&=@6z+Nc0t8_1}Q;?w2M*)~bOFk%p($S880l5cIYuyiI#T!U1(&Tr8&#gsK4@nh)sVZ0stC_c4cglNJp;9 z5XnQP$9Mf2GCnY+NM zy7JZ$_s_-f2-=hgxVtf+o2s|i3~mLC0QWeDex+w-4)B zAs3VnLT7r3MEC{gcd4{^n;q3F5JIcAc<5`IshG$CH;nxvk}mL zY&)L1_b=d*=OeCN%o602%*mywwLrllZVGVqytWNQhIt+EsLj%^EJ1aoje#T~S^zOF|Pu=K!D@Rw)T4<~l_ zfKn5Iyz^BQ`|wXB1*W<`VakoIe$!5v$M;v(gjXhpuWb1SPO)jPxxXBBmYEM^P=U;u z+YH~pc~U;a*X1HR8uw>)hm@5CTp#El8UUB^YT5y?kr9pU=L3Gz*BpHv;d!4?Cio974c-cqor*v=Xml+GN_O{H^yfdh#N~OcvhQrEk+Yxt9*4gh14$9|)tKP%0XXhn#QF5_ z?(?3R>Dx<#E2R^GdA%EX=9Oz-2kifOGm=fh`0*S#|BRsDos-KEi#`3zg=;zEc|JQcordx@HtJ|=%KzR zc-D@sxvC_H=9~kET^o~=z?Toe^uRK?@l^~!LTnHEJ<-A>Ep+o?F$Csj#lVJ)Ii-)G z8UL!UF5QJSiH_jbZm>;%2bUMPapcw^l)4E#^U zy*Bq`Kr+r?;2uD*T>WlDSl4Y%Walf5}|`e|^R{W*ay$`|;W1Od0D=-y1Qd z-N(r?@TljDXe0y#sA&YqRTg~EGq_xF;5z|RnZu=m)zP1$805C?&*mZ_gP?bRN@q zom3aV7ne`Y3Lr3ld2@^a4=LxPu9YC!OX&VJT(j@hc5s6OCdsPS~=c_!lWa?o8ig3|FsC!mPpRrY3xQw%%?)vHVws-#$YN!x(Dq8P<$s9!TjL( zn|@{Upv7~Xu$Q52T#h-E=YO4DRH5EyPvq_qqY4?g?r$Y%NCk8xCBLnX)vZ8^0veu= zSL^V=t2hM7UO5AqH6SZ;$0!yGCs)}FlQz#NDJi|7;NOEgEDPZfS3@AS0u_^JUWcRp zHg|gnO1D==JwV3>fPt1Og*5jry5{&0z}cswY+AV?xRvqP$B}A22M}rUw=sn+p8qh%DQ~E=z6uH== zATW232kVA7t{ANCc^_QEo^w~UR$&`A91OFy%GN=1Vr`R=J%+?BTn>7&IvTgt$~Eyu zkL5u$Pmy8s_v0F1W7QRfPOaLOwl=)4V*uFN0F1aSF1Xi$2gxq#Aig_X3drpvYOyyL z+|RB-%K%&vHUuPo6xf za^4z%&n^h;K@x=@bekitYQfDe`L*6eBtg#B%9RMthTV!Kw22Eq)bt9ElA=w(-_H*h z(winOTtA;pd%2o+Lt(4mf zy{!KP;0$=&Qp#Am!KJl`1=@mt@l)NrfGre+UdBj$s)ulQUGR8Akb|=OVT&AGtO7rt zrd+w*!45BIz&QzjJSsbHw57SZVlltD7(5&vdk9wt!PZ{;$dPank)t@s^c84K#X~|Y zyy{#@Y3UAf1E=Ibtp(VJ+=%{8Mj*j5=o8cTjHW-p`+)$X*QIpxon@*_BvPGVw*`*d zZJQ`dbcC`JD6^d6CE5>KopFY`)vmh^0Ig=i%MFK7J7&3PQl?R>4X23YfnOal2_B5$ zH3X8A9xKe>90TjVomJ54cifIZLJMOzDu9K02CI$27=U5`aw$drrc(GY?GRkd$eLzK zYeAS&y}%HY9ky{V5$ZhIhAm?`70XRO#Sw6Ca6m?8O&+X{P2>vps?@pxI|9%BXctDx zaCVd|IJ84hHR*9P(j&Kr3sp$|Y0#Lpa#g6sY#+TsX%y)r6i+D26+bXNdbsSMnx&>- z))K`u=Dz;z26(EP6Yf#q&H$z}YwMYAm0CFC1vn*YhJye{rh6@^-d`p>u~{yhm$ZLx zSvR%{#n1lsL&##dgR-v0ffcuNAy-S(Es@)@DFST}#dttcmPRdjcO&+gY-S8fUPx{h zh*9yCd=C=Q=@XXeEMp_q&CHm~H4qK1DOs^rZFZWF7Ml+{!_lu5?n0qXdt;;-G*V zc)5Taa4cU!s#nx8oJghj(hk&x)U&(VAw&f1&Nr?f!P7&`tpB;-Iy}Jx2m=v65iGd0 zwDc8b4Y=w_2`TMtU|CJA8l$$DHL^TIOf=l!ForbCrU#e`E2xhOfb+;^)T&irDC6X` z3+x5qfdgo0L|0E+K_VLs6~_Twbf)g1Nzk$K236YUwtR87dB>jnW)6JIknTd9a<~Qy zHwo`P>yuYeDR$jmUz=z^6d(qf<-f!$_1S20BQSLtWlQjOwH19qNV;fm3_Bs2YGPGL zutX*b?yyuWJ~Yex$+&e_byc6v?cLpSFJ8C|!z_RY@=^@9m!=?6fNf}Vd|ltzF#7&+ zZ8B8OJa3wkU5^j%V!C=QkU|;{oUWweg1)Av!SqZpDh;b(lB0Xkx zsD_GI1i3axtRK}Oo?~JGbUH`4=6kpTSi_tgu^VI;T2-$DDg~Vq)G67lgn-ce#9tpdISlxA535h;8|JJF(cT zH&<7;07c=rGv+g~`^Z#9i?Hm;CM2YD)H(K+9cp+jfBwsZwf?yTe0J51^cYBPm{f^J z3ApV+mQ~lRZuIyFZTBqSda5a+?b6OSId_7#+>7(>Yg*@1A4Jg()%#!R%@Ts7{5)ux z;ZKi*$w>n#_{*o==3r|J5Dw1^JZ>Q{U+lx(R&OAmxE}->^bAMCHrT7HZFrhGIwO#% zi-^<(U~@>FW}9Wgji=G0?UK9zLL*F0l@{KT36C>+930Z69p^8~vI3XMkvnvszY!ZD z%-@$W{X+;&2Q{yvrKMHy-5Qwv$zpAR>GAosatz7J-z_uxL_1Z1GEcgGt( zx-}1$O1~<(Ue6mcvQ^WjspGp&$2Hr_XRBYij2%0Ms&&$M_0bbaX)Bc~ix!DW7o|Ov z4lCF08hO<@FzEb6wmYX-lV-cyzG# zy;5e~>Y@4C{{DWXVpkqpvLB$UiB>wwu!JO%@|M2l%m**HmD&M^EpCLZpjsLNwT$KI zmPq@OOmnNM%1QtNUdrLJ8W-6T!@wa)n)!-L#?{_qKI7!gcqsd5e|yPZRS;B`vw&H2 z4Z>aUCs;&WoHWMs-#Lv!%j=qPi*;3InSguBxf#rG?su^z5zbslw zcU2lQAE{L5cdDiIIEeR11O>vVS)AqSbzRiYxFo%pVF>WBN6T!)+r-$|*t!WLA4J}5 zS=Jz8P?Gm>Q=Jh#U;p^=BR192h2Gp=?pnBj-6i+H8spanxJ2AOUwZ^T#qwwU}p>$%F7azP`SDoQJ@y^kN^`i~@&?qLjyUYTUJN$KQuo zq%E3vW|r%4Z%c8p4WgIDoUo`UAd}q|I`&6r=cNB3TyBG=fwD3_mFgTzSV!!>QGW!7 zY1hVGQznbdS|YUfQ2>i}xl-O9xK`O!O`v7FHt=S5S*k>so^3gM8m3tmrD7>SeoWze z%fi^0)yfEe!tX82mON=DwiBm1>O6FTa>u3mUmX>AlmfQK!H~ng?`8uPg6urMZY(q; z8SITKz(1FN15O`hpLVl4(Q=Yx=;evC7#O7g+@PZq>&Tz4-0MWnnPq75hZWS-3Le+{ z&5y1d85qotRvl=L9RWn8A3stpx3@1&93;xTDUj5DB$W#11ep$8Gj?un_1ibh^z`Dk z89;R^KP!abD{w?D&kvJPOHQuM{|YM)`|CZ^d9boKoPSZ_x%>Re7A9yX>*JWTns0N) zL3_QUf}eA=%JLsaA@M_20?T=Re&ka1Si8LiT$}tS3E+k8d#zQxGmp~ucmIdIw~VW@ zecFYWD55AJB@&V%-Ho(JcgLbbLb_X2L`pg(q#Hy;8Waf;q$C7ETu6hIAkyzF<-VW) zv)^Zb+xx@&`@McaWyN`&*PJuQ9COTEKNq5=E`3bni;w;}tf{($bosS9zKk^l(TL4U z0enBv$?W<%6(QmGftI;x>|H=f>Z^Nk^oo%VzCeG5XYWYPcdE7Pru~0L~yclvHKImgQb!rlyv#@bTdKTxlYH_KUW^W|jNWkf*MT0_-#84k)xP zPvb*qZ4O>?W{Zo9Yi};lYnF*33(rDbI(z;y=L@I3S8dIKM-Aq+5c}=DKP7XRj80>f zuuK}%*pYr-gcwTvU0PcDvw@zd*BZ#XY*#y>Df8<+;x(v;T)#fMIG7tQ33UmX?Z0b1 zD(edYB0&eX6{d_39Sl@i$XeWx)EPuh)wG)lqAc^_o>*AYJ8aT1rSD ziV_MX9wx5%B{1YbD&(4Ho(=$JDM%s^9**4!;i$^uqYkRGqeDnoPD?A{xDgGZ0ew0^ z;c7YV2++McD6(shu+h8(C}K72>`EGlmOm9nKlAzys7!P9-R^Xd zlQ*x&=1b2X28NdwcCl;0xwAW50D8(^)@uovIjBl5XNv(}Hz^{w1($3329f+#5|ZTF znkA89=aGJ^cW(9(#KmaN0RB7zFV8~u7^(sFK2(1KPACpJ|24{T@G{|pI%Rrh_NYT+ z6j=9EK2CP#kdmaR$Nf9b&d!dMH^3~>Xd3B@6^4~ruKX;oZK}pT8MZD{Cgt=RMABfB zpJ$fxu(0%G9H7S<9Oai9ElYWWUwM7CZ=KjNii}T58$~G|*aTA`Udw!WX%&HLT{;8>P4y<&3_}~H2LkjUgkxEKMCMG66`_bV=^0OEi;0Dd_ZTK6Y&SPOMY+<`R zo|6wjbN?M}pbFu7eF6@(0Ih+CKUaV^#Pb+|Zt!bfYY+FIg+oje5HSE>Z2k(4?bK-7 zUUM6|YDoO>-oz^=_#zl=^5UR;5aNxswKdr_5x5!}8k+E_6^!$ zpO2%jaXmQQDv9^q-NjnPaXFUWKq0qJH#$%OZZG^C48l56a%Ot^j!&O7xeV^zD=VM- z=@;^)(aWg=?KFGhv4+6w4u?3vF&XyidV)`PIWkL?WpZFZt;4a_;mfG#K`I0B8r*2& zOJFA}oxfTkuhW8-3G|<<%TA3K;mWNEEb=LTzT99Ci&V&wj$*g&6_iQ|$UL^Ze%1 z`r@$#n3)x-oBiyc<-7rFiJWN=vVj^?CUI7ppxB)_%N7_F? zkOrI7k&UgpI9wcW-VeO(kH<&7@$m1-`fBq%=sOo`7=(1BU+>Qm?l6drjqSvxCPveA z2n1(hQBjdp2sTs6`Jf=QtqQxa000vA|NUYl2t09?`HIK#u*>%D7#1F-)|eOyg(54R zH4ABUMoD!r1GwjVu>^%amd;}R>H@#O5{^e9A;r;qz!eflI83(~9VxFv>b^8R0O5eB zR5g{GUNw{TDQu;q_Nos+vy6k@m&}#S$Q@Cj06n&5<&O+STxK5Wb?AkZW?r3#ffWC- zR`Q+v*^r4Edq6_-fg9=R>7d&5_Vt}$4#K@IocDDf64JsTLV(!dc(fwbN_E(N)NH+I zGpe?ZGEamJB>U_R0eF9)ej&$taBy&0A4Aw{?Vbk;^vFt6t4moL5~5bpSz-ZOv#B#S zA(Jxg553wmP;EYW9*s;W*ydEFMHi^a|is+nba_MmV6 zkJUZ{149#EM$d*zbvgL?`32}0Zrp$}2f1fY7Jz$|swItlg{A3jDCmydYK0B`vszJ) z>uLFu}T zRehUy4Jd-=dT8xvCoac7mXQrZc+QK1M2svv?|% zT_YmOYvx&&m+d&VKd~`dEj)ZnO*|&t8f^fmyrZGMvKWU`4HbTy`Dx)kO4NN(?FZRt z($T>#EE`e{AF>{>z-Jj5Q*hLGemIQ3%=eD1su=~G3A_aj+actJ+3!Ji{bRpD0m~LF+i}LK;utXJwxV z8w|!v%#PG+o`E?at7~^Db?P2$&spw~L<7I*0~k3RJwZGcBnm9#PB@YJw6T-ZI^avEiC6L>@7JeWv*O}tDYJlO zAPQnSk$wkmU6lSoCbn)7)Z)zVxKObfH~j{0?dYx1xcJZ2-}2rt1>Ah^C`pKua|4*= zFHJr_A>k*EH-wDo2rwWdi4ZAj_GfH-KV*SJ*DW{DZcYjfl?65scn6LEIsqP@pK!!M zLk`-qq!An(Qf}$~sE=Q;btz;FyXxg)X`zf%kw-v6a@U@B$Ff?3d=$t$A-DN-5g%?g zHe~}b78XT{4bWuu!~8U;YgFizr(v2j5N=f}Z8YCqXcv6L}3sY1gMoQf;!lA!>@glxz*6ggMt&fXHN05xPbeUe2 zlt?BypIu&xLR&9!#RkmX5w{)&wA!u{X>`)JoX)Hfj4V(h-TB@grfNqr^*5X#u;Knz zX-6?PNP=6$CT31x)-C~9;hQAxyIu6FfR2_H4Gy`Ue2&qR5OsKfgst%iWaDvSnJg_h)^tkR&6fLa3;YS`=I=1$4Zyuuyod z5E3C@$|Ufd_m0b*Pxk#P2zJiVb*8ko5u-^0m|vJtTLgA6R7M5~p2p!ynSQmq<2G=x z`3i|Sr+6s(0Z7hs;ZA$DRuq@RIRr@UZqo?KJn$xN?zfMRk3pH}YIEDi7^LqMzw3wY^6a0MYU^ND(E2cU`(yvINx#;vc z+zS_gP2_Nd%y{u;uNuk#zMX-UwG70j94)_d1cw1+>wIAlh3$U(5DQZ5Z1&hbINdG93_MI8L_!w~*o2RRW9zT3hgY12t2D*0hEZ(1#N-%>Zy% zUpIlGBoxaEfFA@g1ri(_Xz&G*Ysra;9$@z|F)=W434}Fa3$fn(VX}2uStcRa#O+3- zkPm$O_6<-J#VyZXXTwaYFxj%4LnS%6Z)c$6>(3t_b~?J-T$@r$L-|6ir~hYqez`bq z2l?ZaX+wOo)7RGr53j3L2fHx;{`6%MndFeB?hAW?C8GZM&->Lt#0oPpbr04+wls%A zWfwWa4Yzp8aQZI6!QY$Tj}8yd<5BtpL>BEafkYC3U3Bs9-@jqtUh4OYr>|7uh3vZc z@llufF_(G!6L5jZCT}ht9!-OrqM}D&Y>NwZgw*q3AlYY7cOl4`t@sL z((>6^QZ6r|MZXhU-AkIr@_eJCa9~cgRi;!*CQhk z%{7y##xfYvv(0v|Iu-dg${3}AM47J$j> z>b;hvzx)OQVF#EOuo)DvTD&)N^4}AmOyBtuxBsQCPSDQq^uq=?7#JA9=!Rx)GB7ln z6DI8u&dkhA@>u+1=0u#}c#}wp)4#qfC@eIbSN(QSd-`5eB^8xEfLHyQqR*0&<|ku; z{0GeayCzGHFy#k=B3C8~#=#{DUaw9x-)EVG zDY!bNI?6#}KqUSI4Cxt44dMN>V{F}xtu2F> zmKVDy5T?w~y6}?R3_b^lK*Q^A-@VHPjTIV`o@m0sH7=&4)h(d zBNRd464TPs?Ch(a2{^$$SIUeAgJ(eRd`bkZ21AFgCoq&!r(Y(gqEew(l|yd>>1d%G z?+=fi(6kPqN9P{G8O->Ohu{nYSiZe7rkbvjDeR$eEK23Wy0Cn?;m&`_N^Fh>^lJB`7D8*?d^51+LV=*6Z`APDJXh3u@EWg zRoG)2Hy;54i){kyCyMojE$Vpp?lu{)tn%qUFgS^sk)H`DDc6>kY{ODwVy<{d+f}aF z6kTL9e4U`<13eY>0CV>iX9w>PJHk2+BcTwOcmoJ%+&g)cTivnkVb1>kB6k}RN+H-J zI-so>sWh36;{eV}NmccvXNTAksE&MXG~j3k4nasjs}3C<^UI;M6E%y8c$58P80?R1 zNDUC~{5_KU<7%k35}-a5_g?z#I_`v(urMR{=7xSF2@s}%YsJn-M@RYPPwwA@-F9ZA z{Q*>8%%PS5$R4YW5Z1RtF4X{>lOx=LLBb!G(Qlr7^G3op5xN;&;E~u$eK^F9=H@vf z{kPy?kG}Tx;rTrd>Si4(-z1xlY^7Byj zGm53tu|{uD{~)FoFARdOTsODdypkb9Nng1$hjEi0AS>Iw^EhPSvNyKR-9K3`o$)zY zSmb_qi$lkKR4gTuoOu%RLxpEW#?8X;jTJh(2Ms>Qca4UHElyu@k~u^bJ2471HSvB? z?~Uhw*B~3B7{UTWMVq0PpdUxi$jAt^=xCVT8p~vFFG%d1&~3>eUm9w{c>u=>x|@9* zG2Wa=h8)Q0)Io$!WP4(eL9}p@0GK zdPq>+qo{4961)v0MyRlh2nDUWXyXua5)zUtSE!@V@N0Nj3v3w~g*^u8NiKdd3Tn@Q zvEm++2{@)_)}XiU&$2J#;q7j3zk1XYN)=cXkh8pvt((4A0i!buZy@w!Lk^y3*O8Kv z&Pc0LCcs6&0epi~`kDf@uh5f0C^B33 zHRv7N0KXTi!T|fq8Hqgx>1NfFS95^nwg#okR*fo#Z^_rEHMXw1vb8lro zrLQ?X73uHq53-@Tha85lBMTW2he5ExN+FHjo8~^$qs5x=yIW5)RpOcurq_roY*~=+ z@NIiyXl~~X`UeC6w0EzNo5ye#XGSt3Q82kTL5xr&@USkEPlK{gj3AMcS_)R5Cg3{?c0 za&7R@nc0X9@gnC-z99!tfZf~QSI7loXA4XiH%bCN*R3xaOhgAYFGgD)r|PH%=g#oc z#khKe(gW;dFfUiJBzq{cCu&OlfW#tpbZdJX9NB_AHsT}-yH-NC4){A(^_)k%32IzDnGYDespzEQ2PlYx0(wn0q=VE7NZPZgTJ_WIRQc@VI8i?OcT6LJU zZBb93CiQnP^f6xFXJde)+;=C$9&#;x{NmT9Z!vrh!*F6@Iel8h>|2kDnI~b!L3e0# zzyZJ46~voYt|ll*E_I4E?vUlFWlI6%<9p2mH{&_Ai@9_OpW~z+Sv?#*OLoN1+_pP5 zHj5YmkUP<ulmxN1)t>BRMY{a>;_Bq@pf;9Q2uU$)paGb4QZafWXZFxWksm9V9k z+@Tu60k@B_2uT#{y0r>H-dsl~DfsAy+nG8lV)ktwBucowtLrXIuAp#0+%NWra!seJ zvgk0Nx5E^5T4OX2lAOzVk}%mCG!2qdgE?rL<$Rq5H*Yt$EhMm_!Wl?ih;Ua33EyR( zN2DkRmpQ|m?ibfJv>CPd*ZU`e2YQAn!QYwSiqeTqI;=XmSSBRI>Uys@~rI502(^aRL?fJ#xU zoSo608XN>E);{3d77(jLe0`Y~hwh%LbwtnG5Xd-7(Adt7AVTzg>_QJmiJof%=Jh?2 zn}qWsGjfs3VS?9#dF~jgQ4ZhH@_{!2&4tS zc6K~eLs-0heAx6~K0=6JB&u3`H`?NdNhsGwAPumr2P)2vQ0*mv{7fQ~B`-?!@jWIIInuKKxR3TBAwU@_Hy)~Ebw$0vebm8@+eh+%Y?^FaMzat4^8eP820HNQ$Gz$Z@ zXQzM0cICh}1FPHKFkw<$Bd4H1z~C!fE450{NDbdRYtQ~c_9#uji9IVP`0sZzqrcM( z=(C|a;*h%|jZg&z1s@ouAbq_#hH%BMkxnqpUJC8Cw7&)(IJn|akKOlo*;;JC7GPqM z50nAyp#TPkS*5s&vHw$@Vee3GMp{rzEK?J(h-F1Fck+MbCR;J3pf&dO-8XS8c5d`q zXD=Tr(PnW~hGMxH^l3mQna*j}wmM!t1`k=l$B#Y8=cl@ z;XqXk`0QC}aYryE9@N39$ z;onN>g6b3-K%+u(!MEF(oRst$QXQA+umHl7Mu949~)Geht%c5y!)4+ zmj{v!9LRk)`8SB&(=-YPJ|*fiJ!~oZ`nMNyRUmhck%9gtzQP7ecCf=VHuQ#$Y%hJv z4^8(bE9uuZ(n5WxOzD)3-J#A1px86Crsio&H3VAmSN3Cl zU0t%xIlp@V$=WwLM(8DTaC}u8Z@vXBLQHHXC0fNmSMBsXFq$#zFXig(bs(54FwY8y5s~gEZb}v=&G(qfd0mejMRM$g2g#6ky#&TNY(r!K|A6=4^ zl=L(?0~H$wfyYGTz)@L4t?gCl5tQwBCMjZ(%hK^^2<-0uD#8^Ez#b@#p*@XamxRE> z%`T{ZPF&B1PX_)Dcg_IZI(S{)PF9V)C+~4d<|ZJ;{p$Zyxv|vG#|J=g=V;VEs5A2E zPgP=3bT8bOG<=*R&f4!-1-k)hvmBd}!Wd-y=<#E;uLkobXuN;yKb#B9!H^m-_^OJE z-?ftA2zDc@t=RwOtsJ7hbJIm$9w96z$4$3_X07Itw}82TGg1~faML(sxKa^#=h6B> zP_sbWGtbsY$5i?8Hzl-`<(C7x0_9r{wjM4Z9v-a*JjTp6@&M{?Wr44lpUOx`-2aTz zF%6Bwab`nVzT+_T~G&!Zx&$rnk zcbv-^R#!PUZ5Y!8v!!&Lw0wPiAxp~dAmg<`XG5imP=tFgj?ix6n?Vw2)jb7FAA9J7 zPf98em;LAJ;cySKZypj<{v1++wzK)uODD8;glelQ?sOkjM$jZ_2q2pnN-cm!uRJOM zYVOW-M9g@o9+v?|^l5kd0Z4VLgEgKT9)R&_%Qr3~gUy%|l&hLPZ^BMa05>j=7j0+H zDsnWx0we`ox_(kvbaWP|st!H60i{_GJOi-I7^ukYvt_w-H9s#8YBa{aqW6Z2V%^-> z*x4&UWg6a()A2>9>g>?>1*mw#r+)(3AsZfNY5h$p1xmZj%uJ|JlZ4ss(S&)+lhDD# zNOW4VVZg=LmVhs7bR}@uK_O5b$wd1d$Q{UWlRAL$-hobt4_)ZdGsL&U4y@izKfX*# z%XZV%E|_n5o$>|)0~D5xC^LW`yi(h-Ws%i-+`_*G5&t&`7vFnXKm+~j%)Bi|3Qp7e zzNB2HV7~cQ=!`oxmC3{u7=onc#KQ7A4;`mL&;w9TeTu6L|0%nk^}rbQVOk^nF7F@v zgB!7e^k}W@fxTAp=vwNRZA4QJK{^0#V!+>`tx-9p9-XI!GsJE)sj8{Pn9~vgG@Uua zVa&M;ft_+>3$LTyt!vbuDO#(7Nvu5;R4pSNpv=&Mnx}0QWSJBDsAyVxQ4x`Q$_E_A zf#8){*@P@QFPBEZbd7F{J53t$Ki|9$!_t7TMUnPV1}}DX#!55LO*+r6_k`|PzDX1^ zgOvT-wV=)YAYNU)Q}r8M`ka8I*vBWo7Q$v|n&BB|rI%FGc;#F2E@(DVO|E2pZ-#_q z$N(y@qrU~UMF?i8SiblweGs3)hg(>vCt+E;T?tQ{Xo8qk&gNOBcg5kmw zwEIPS;Xg^f2P4%FU+7GuaCit_2fZOvS${Uf6)I_Q#tohi;E)xgK;|DLe)1 z1)l-1?NCHpo=PH0AZFf zTq-eEJe@|WpJ81oubS$19oYDtze(&#n{C}P+BEhB%_rHj@5neviO1Mo3a$Wg6XXSy zr@}ucQ3EA51Juo4(GP$(TkDKZ$p!ibvHyA^h_=b%jup=D-o4AWZGaB4+dtg2q1rVQ z;s{2)7KCToha{|Y8o~fwcT6CzsUi>-`EwweTXlQ|B2_#}k%4QRw6szNpS!xcmTQ3W7Ak)aCC9XBuG`$Y4-(y zBan;^tv>|e08k=36j2a@@RV>?t*xTzY z1JM9frjli3W2nc8$8qk&cWUmi3l&{=CPjDwt0x}UhuQ%!G6njWf z@XrHZi+(vVvO-T#-rR_8OhP}g#m=0O13cib?*rc+9w~%)bMJJhYrhX-$>wT}kv`5Y ze}3F_JJX()7gBf&0mC`*vn~o1=(v3TYlKQF_ZZ%P4t9;7anHF(_?C$jJ-Qp>>M?hdw$d0ewA$V&sE03AwBE{?I1t@C>$YQ|A_{% zf=?WGZ<0_^ahwD^dI4^Ea+-HXi>m&10({+eB~*_`_xff*EBomOPmOaLV%l7PF*Is@4uHw-r}0q( zb@ey)n6sGOHEzo%hYG5mL4&IEaer=MNKaN%xig5!m6v!VqmpkW1J^f$sbG+gW-Wqf zHyLLqfbqNRzjiYy111Tmz7j|~z>5aK0`t)dh(t>6;zeJ-HD8AGgBHu3e&swfc);M0 zAdsO$^-2ELd64qii7dN+4e-p;e>$I5C+oT=NCk1`*Uk1XYwBWLu;A_q>P}rY?yJ6`)hq9T6KFxZ6B4zCgM_4^`Y2&mP6sc-4|UE7LOL;`s_AP z88AZq{}@je+pePAxY=NTtifZaML*6&@+DLjpE?c?>Qe5BXbH#D3ky%^*N=k4!nO#k zm6Wm&pwoHdcqkJ2*p`Dgw?VI3sc<398!@}(f^LcUG8I0fP>hZOCx-le^u@sAjd-qq zHOiC2w^ed6MoYPpGgVG^{DJxCA+aO-&%q?H`0gxCs9DjVp=NR~pBrR<8mRDO<(}K6 z(8@MJDA}0(A4H`<6Fn!2VtotgH=la9H`N}1Z^H2oD8k07L$``O(o^hVKBbpJh5nI< zK-RngTCkmJKeJcb90pG8{Q2|Dqrfr~F2tb&ZRa7>{9wP{*2A|sL7T-&4_W~HUOs`th8w%}{NQt!OyD6^ zxp(pKt_y=JjaRj@m^VqD)voBKy3FpYg?@JCa`FQLdIhxBz)c?Q0cA5pd^AJ?@&=)k z>oT(HUr3(c#%4-fp}94Peh}WIKSR>rb)bWVRvnap;-b@IVm2F&e^+q? zIoh1tW*Cn`XkgF301^(!dth4kY(^enUYg~=G&ejou$%ppAon#Rur76mmZ=+5dq6-$ zn^sK0Q{BakPGAnzcBKC6d-_rRJ?WYDttZEghvo?Y%RI3Xf{c@TkcRcH`N67ABj~t| zE+x6d>U-+K+9MBXAeOQb&QCz?W;WT+c`bJrP4aWFJ-Mq40@LW|=-aLQ0CzF(LqEai z&w87*H={J6K?E`dGV<_$yz-r3RJ;GH5~zj_eFMnwCz$~Y3jzzH<>hq`7K3vbCw?${ z;tpgbgbv7K=dwNs@zSdYck@XGo{<)9T@iwc(BaoA-w@4(`3aEI&2czFXny$1hW0n8 zX}*^s37wW_Yjr36Exv=g$;aDU?)xD)S5IA1kjcOD2g0g`N*(Q-kG?>BYCH>ldtIO+ zG@us|nbgOd0-QWjq<))BU&M^f={$5Z(;npu<^c#Bpj<%fkrrQ^y_sQ|EhaubZNE3@c-Mo4iAnmU=yv^0cQ~yE&!Jgj!bxhjRo3}Keh}1UZbbcp zi7e!lva9vHD!^yekOXdg3qIroF@7V%7z~a@E!N-}Lx)`<1y$57qbBv()`xNZ6Iu=K zwwvyw*A`#~12-p+i0OnL??#&E?wZjaQ{)S0RNLe#-ao)N0^`lnUeV30rC~JR9eaAv z4$)bs#X?C%k#k3>Ib_GP&r*18hv=T!gQ6z(A(Y=?@_&`BL84BTkl0}?3i#9l!m{P2KaW-~r9(aN51>r$Rd3TH5h-t4ZP z`!=6)dO0stZI5q&{K}4fH}qfQ3tR~I*Ao9etI2!qnSH|PMID`9luG5lG<@q{8b117 z#YIrTw;bN@P2=lXHbF{ zb!rByFr}j<=tQit>it;N;(&dc_qY!{ZFWx8A6+{5$BX8Cb5R##h6F;kB@EPleg6?ssnhBDIs&MbSzo9Yqwpg9_7an-}vG~cMW*|M3 zMxDZIU!s-16R(P`8uB2SV17(cPe-M|YP({P4!$NnbP4LE4$X;)s%G2pgy+i?f*a5h z7TYS8e#`4AiE&E%V6JRU;S;Bz23x3(UJ>4Ve4Y#8@d!T*Qac)yNJh{oRf zeYKL!)1K<0UfI!#7VWP8_GdPz-u$`W_b&E7Lr<(&7>iz4EwD@H=sb|=%b!}s&~67rjwa5FvACTCAJ_ z2dzlqg?d0%wU=hya!O8hQ?3Ku9Hh-tw;7CWe*~ti?gppip1#%nRP2f;4F%c zse2ez=&yn{0$S*ysfrznsNN2&ngx+ho5j}K#ma(Wl^6kG$&t9SgYHgFMj6!DQreS%_h0m0}A>G z$4`0kgiK>l4(T`p4}pPt(*0h{RS;2sqlC8a`2KUmR8;+3|Lr$1iXaE{Ob&~R3YZCF z$V09SWS{MVxfbRiqT?nRc!*6R!43uYALwBS=vE&^E@*fH)>9#HPZ4^ifa-RcgtcnE^dDyT`OURsn6xkQ~T1|#h`I5--^bYMpTnY%(C+37ci zs-ZC6H>0N~Kr8^u0-RC`-NsOymlK9YlFbve91JFtL-%Nu>J3=r--Vuqh5pqXzIpY3 z>96UouC7S+S}?V6E@(m%YCF|9n(BFa{sM_39UWc9|3=~nWhs7U<`4DnpeRIY60)n+puUvkOK;aX#r4z z1Vv^>#>ZXP(|who0TJn~Tel#g0Q!uC!}!&9EyN+uB^kg0tUS!8--pFC$GC3%^GR&n+}y&#!upv-(PViFVZM3Z%E#2H* zt;`&-;crgncG!G8Jk*@j=)Z}GP;e|03Auw?7pp~R-qt)CbR9DzPG*@k7aABvG(cnuTwOi~{zONAAgwyB-gdEKOCT(M@q2VZRC zsAEW=>DNb_&CCdb_rx?W)#s%qmd-m|cw<%5Fm+b8wPL+bIpp%ER9UgN*fL5w-^MjQ zPezPy2Yn)1stnXpNF}E${Pgw5(({eHrXI11#GaA@(MpF=4U(qdpRCVr<$e58R{G&% zh25yeBi6gZmFrsi7o{|n#P>bRZ|k7igjpJWueaJ)W9vp#-+f@(+!Hm#>tlGr_{vD} z+O$?EA8S<@(rw(OJbd-+YX{Ggv`?Y~DcY^0Q~RAMtFgu+tEL(hl)HLVYelVjS)T29 z*EA_#hcWWy7OT~BTpr||kJTwzQ1@pXQ=sN4z8*vyJDysEb^Z-Ww0-f*v&|~xVTwP7 z((L1}2UU2>8NOq<^DAp7s=p*K>7l+HJ3K68(EfHsBE4^8K^fkQ9g4dXu~(?yk!cuE zvs*44`Nf=Hy)fRwjK|jeWz<1;dYb2_)UWI_TUM_bj6aIqyN8>mL}eY%wGkmc%5#~@ z?)bw&$%@*5>72iv;BS)MaVO0O1eIkM>UXxwgDQ;PGtP@2cgq*k3>L#Wj71x*I1Z z?GYY1=sG}W6P+L}yV=o)HMv$5<{#XJ+Ax*#b5yyp>0n9N!Z1U;A)w%oiH&q0TXYq} zOT)q3Ow2=Fwx%sEWsqc!d(!UdlyVi^X`P|86O?Q zZq<;pNdLkkN^VfTDI-frc%NkU?Nh_wtKJjmKAs78lc?p#T}*c4UC3A;Og|SxUA{6n zNf4<}YMa3#uSM8&FM4;uQOXSQ;ly?F@ND_uuHZb&vY#9EukuT&Mol-a9oP#51{)eq z#<}80^}V)?@*PcjfN{B0mrPp4SJh8rG>(KKXj5Ioy3JU~jxKFq_lcc>c8L`Dk zZ8Ets7lOa=iQpwUi}bgB&i4_^TR)?+VVl_(!P~zu!%X!Cb3SCaUuYu2+u||R)cbP} z$(XTv=qsHYWu_aGFqufQuM+ts602e?Jdyn9UbRv;9`)^Y{3m^}4%!7_Z>{QfI@Ryl~`0re|fF{fvXN>WFuD zrYY!fR<8xezQp?U+uZqZ@xFqmMRT^YoKgQ1+1SBD)YaAR{AsPIC-(}BQI({$a+m7x z&!5R%TdJz%HZ6^o$#cy}p5s5~( zKMx7%rHl((;R&M%P*UWm*Vn5ECf1i5oxZj^uQu*PVZPYTeKEuQqWhTm;i!@Rr`3{N zlekWQ{7qK68|j$-LqC}|d{Q+fyc)@AXE_1=$Gy{ z|MNECT~#<8^E68)*n__;RU6Vs7I;6sWJ<(lt>qAOx{{syM8oO{nS=ThNiPFL8zaT% z&Ewd>?z3McXUsHeN4d^BEpcsW9eF)vurC_&oc%BH4bmMCLO3+bp8|_zXSmmYH>9tB=VuJbNw%;f2uLqt1FUW&DvBPuP>` z%p*MdfT=^fAs$BIvqAHDlx`XyC)2Xj^Md^zOUh57WYa0RqC)0Mf79+eT|6d_{*IEc zus?1#@(Z(ORgxI-_=%|*uIPq!L>Kmm0~d+?J>&g2e_nsYbB;0r!$^F&RLjR2O7C@Y zj1(-Q9<1`WQs&v%x?wU_ULiZw*(6HP&Us%RqblY5<88lwqpM{56#?_r6IIqYMlVWQ zo%~E}8L3P z&tz!bE66+avEJ|AhaYE0?%_YHBb&L`hX3tcEN^zz^8Jtt&YP|czoSjv{g^@+Z*(*9 z!}PZwXMCO}Auv7PzVXYv*FhCfF|g2g@6C`o<1YpEo#P}7%$L}>uj~@JOWjLJVv(*$ zQXO9Syq}>uJbN4@tbXO~$q(tNg^Z#Q2@}oWMK^~YhBnKQXX*n1s&_8NBd{KIUsf8= z!NM4yA)KSfN&8{RWwdISG8vC}L98c~F@lBfcp>2h4#v-JwYR2^Wgjg)n16g*4LPiE z88ct+DQ0mR0sdFS6YIdP2Xk8&@oNw)hOTeUvMvW>%v|5sdcU^9=24^FoPTP&^8HrZ$44PFO_~%o)^1cu5STkIG`F|TSIP3f z+pT9j`!H?uOeb%7bXXtefaw`t#&1j${3UOPF($UR1)1{A5Zybw`Y~fE=-2suw3wqi}_vOytD&!pe?D6zzG;0OB?}f~cC0gt`X= zP4mAWq|@+zH8ogFnz%iC>ypx-+F7-;mGp0jHwxtLyt4cfjPv?B?F8 z-)u|@lq?bU9ZdFEr%Eo%z-3Qn8u*e`^cnM+*bDh*T93p=*?is&(o+}*CcF!qYAzCU zz!P$9$)o}OMSt1I|>ZD$*%Yx@?Hx5~7xnBH2wS*d`V9<~FEdRCko+E#kX2XRSto#ONH1Hgm`N^Jd zQ2SqbT|H?kZl(Kr*odmgO)D|vYawBLrQMU{UHbkq@9{j;so_2DHsZVYiuQe82 zHf8^5`uXviMrXw2gRV9KAG?>+>RA4hH@sUNdTp03yvtR@P~5*%yqR4pS@?!Qtl$h+ z{-v{NX%cKZt*!G%L`j!1;`xX=b6Qf}9Wcoc`Z=uyabr}{X~eQiOs+5crKx-H9($>2 zT4`ruWAqPeoV|kTZ@iWzdJq5YTFJc2^+vkjC$?E^MuG>a7*DBujeg`-y;-VF=_>zl z7sH%!RSub%Vve|@_#xb<@ZF&RJ^GW{a-@HMinFhx!+ zh3#cP^U-+Yzy#Y%_VKIuFAayrQUcUzms9AjUm{_asS>$-hxou{1LG%0elss|RsfPBSv`xBqMX4?jxdzGwKf9me;FovCD|)!T zd_q~XRaGc%e?v>8WM2_~;9U7n5`)@w6HD%lb5qTAArE&YHGH|`B5Bx%I_}`cs^M36 z5YS3pv9QIF6PdmfcYEIaedALr`EDdBt3pI}_|H2*y96HRI`l~{JV#x*Dx<}A1~gN@f+AVn~B$uyUgI*MUzo*D}8{gg6rLP5^@53;|8%;Cdhby=gUVS@+Il1 z-6N9TWQmc9D7#nkwUW;VbwXb&1h}v^JJeOrYb)*t7olPej+#fidnF4iiXLy(bKJ|? zz~GV>c=+&|V6YIzm5f@ey28d~D0so=Zaw~!Hkq5nGcjwCsZ^71t$O+E-KqDo@HRU5STG-^ zxhaj*QoP*^qGp|4dk_^6+cqfb(92G-uV@rMWbZG3d9hmY^PREM4{MWor9a-~^S_-4 z?tU{U86M`@zHQn~va;gH6wJlG;S^1r?76U?7F1=kF1AxCb@ixWkL`qMoAl&@mE=ie zSLx4s*3bO=_VatKXBLQqb@G^Qm0_@+w07{Ma07T6gr= zfqk)3F>|n@W@P6ub91wDcjIukGPAI;a&=>OwzOuV{`)d{M{6f(TUZbuFBg2b#_7A& z%b?$h(%WAp*)HhDVoOBvjR~2#u1#=#GPP^|mWiD05S9eVJ ztaKFq)ZBL-PrvLm_Dp8+>NL4|L&t8&qrS~%+iOmxGI3q&Mh7fnAHYIINN%@Tx~f z%{jd?3h~W7O8Urz46vo#$XdF_uJ$4W$znfZsXA6V?{0i3KtX}EVtZU8w0B1?Wqvx1 zE_Lwm^+lP7+Md}d^R%w*QxATI3Ed1XNVEJB+9zGcdMM(=o;I2)!%ObTrQCN+ zqrD+5S%$jC7ri&Up+%GWtw}NdI>2|`E$63Dgr(~Ub>Rp6xG)6 z&YKlW?PA4Cw+_<%I^t@WU*q-%pZq=^L;&gFUz%}V-O?KNk^6ZCnh;_V# zDYBxJsJd>8T#hkju!*|)VRRVn6hyd{KC-+KVDs^=E&UjE)27XFejwI>8+DL>ytpP5 zUowY(`!icEb1Qax5F-hkv?F{405N2440fwxEJK8{mgZ;Z>aypKh{OkQoxV{=RvKa? z2ZGENDxDDOMQ~dray&gj|f>~t52s@$HiuC~;S8=Gm zaz+T9$EtSnrb;8*^%k6dvc7!2uEx=q>24Yi4CmP&Ng<=WAAHP4Xp4p?JG^}tF|C&2 zkNX!dJciQrNE}hwQv=u7JqqA*$)+~_eTq23e!a2ePmmZ#8|FEQ+NTE!Ro}%z9H8aG za(F$2X@(ssWz8(gW{q3%P967usRy>+!X6;sKd8?wBw0p_SFYa`}H| zga5g;{i z0wL<0IvL2F$w?6@A`FF00pGrZVP7D4{lV71Qq%u(TY>EVuocLv%mM%^gKUMWWr)Ob z`X+0Hl%k8G0h1i$53U#$7nJJX6h|pJ{vBeN4ZsOGyzQsvr&W4*Xz_}yxd+hczOaSIInN%-^lXA@4 z@|dcCxhujY1J3D!Y|(s0MnI6eg(gR%V+ZC zeTl9*$QioxS0u$?$#6QRM~G?}@(E`an|vVG^^W~D6)Jd-(5zO}J!G&)cSfOP@oag@ z{Tj4Px>e!NaK^}Hv_nU6-&KU(Z7of8v8%b`zwJ>D3OMG=gFlSKbfS!j`0r z^U#`CAG#8YCaH2l3?BAIg+=zW%iGq@esk9`! zSgW%8!DQH~@=nayRNkrFDnd>EMiFbesizGI?aD?>gw{E3_Q0TL9ML+-2FFeM9-26B znMwvleSWc6{lLQj$=c-N0itNfy9TCF6>^2Sqx=G7Klu5@uP(xjg3W0H$ z?}*X?0!ExB(Vb$fFzNd)g?zA7+z;IdfzAYGN9vN)VWn@Q4*=1$nRK36Za56bgFqeX zc)l&tb!FwSp@OW>!veO$pAp`fPeCzYG_9Fp%5jafNGV6+eP%l#E_8kCUCuk0_ioQr zZoHg46;zIFG4+YtMB-)7;-Phgeh>dM7Cy)QhSRJOaXk0#!oD z^-B~Qo0s7(%1IzJ;#YTZ66i!KeQZrwX_FjZM;Ul{f#oNMLDR^kt#FznVnewQk zxMHlVgo--)(XCAte&8MHo$OuPX6hAST zEjuAl3h7LKJVIYZC93qN_cyAxW(qhqW1D%o55dtr^}aD4VDiH$-)-+g0V^)TtcM=N zTQ~vIT7s!HM@V(&oqO21=Gx?`?cWiC0Z>?+IzuUSh}x%Cz>>W6_QayXpXddZv;-dq zXI;BiScfDXaCTs#+Z=fNQXOQt`XL0v+cw^KoKgPVVb-V&O*@1C&}_=w+MT(uvn!kc z_pt&DMc=fiqAagC>3E;l|Jp*#Nj!2Ug6kbwy!Ll)|Bdh2#M+y>oHZM^CC#M7IxLoNJLNNv&jNO44KQp4~>iPFL2M%JVu!6+AThW=m=@Rjy({l-*C=Nsk5 z@MD34p3GEvBo7>Xd*etL;r61=G6h3i=8;Xt70}#Ov2Hlr?1Fi!vN_wIjsainCM}oL zjOZ~_-#*iBxz=*HBQqN&FgAgkf!acZxBLgwIA3WR`|oqbA48Rdrp|;b%K$qHF_q+i z@HVq65eBTu0-5>`k9{rTVg*6k-^NcY4+bO|l8C2#4*4xPB>#jt8!hn0-sGo^a_6)r zX+R66|IC7a*q(pLSITAR(+VgHlgE9a9S6o1)CWKH{7uWx%HBASh!vPb z<|rPY^YF6K-eIpC=WaO_o{Zm#I9wTAbr>&me+m0EG)x3HcA&C!2jt0ZZXSBhA6P1% z^PxXdGqTc>8G&!iXfYRrUsB;-DB}|#L3nrl2VY+chS*rSe)E-2u_+1)gf8`h@HIO< zj!P_XB4i3*E+y}--%jC(DbsPJ#?vx?_)Mv#vhvO=sTajPc-zhtNJ%HgoKQ`9Gl}ra zJ8TE*W_dQLPJ}(#lG_InKvzmYG%W*6bD+a)&R*&P+#}n%K&poj*XWQ=<{Qp^C3PA= zeS_4MiW%`1Nm>r(rP3)TOFx2uzvq_-R$M&F4#$h;)44Npl}ZeCoSl99hJJbp3M4vV zd|E5Ho@Nab2D%l8klaM4Hltrlqy95NJ$W;d;B{E9W14bwPKUKa!36U*waU+bhY0vu z@br%XA{N<#+{pqb>RD(AM&+*e` z5(}cPgkp5YQJ&Fk`vFwcRiX05DeC9Uqw_KyXXoZ^rzsP!IN z5I9&m_Xt~vVIz2JpL|7z;p3AnWj1ooKkFn7o86Fe+YdEwg9;HPTAkZXj#bq>=OID3 zz9_1qRZ!MQkLrH6t6`U7p6}s`O15r@-YxMA)XH-^+x$6A`)Qw#t;@Wwjhm&6ZydDC z{;j|2V45e90y3;Q_CmM-;gEQSGB<{PF-18;o^kt4a@L-wS2P%3-%8Zd)W8UCq<8~k z@znc7E>spwm8nF>vbay5F=0e3BsAC&3kHWhggLsSxN}n5dK?TPN9qFe3o4XbQO&^j zAoLdAZL&-IM}u{*(nMa}!<0VibN(T2uSG(vAmse_5zeQ;jncz{wD^SJL+bZI^Xp2& z+r8Ll--^9#A}I81x53&x6KE9HPf`PfVafF*kL*!`3;}869>RSr3=Tl4Pa#6;QX2d^ z>9S-E(E5_MKd^WSJ4t#$D;QK_g)KASUG+N030zR$RPJbPSgAmp(ZD4 zc@@I5LtI|0DT|8L@-QTDI(>cw@Z5c|}Lq^7qWn3B`$cW+;Q@D$DYN!~WPQxHC?x z6W=PFaxjU%()Z-@^o2To!Lz!3I?d@2YH;=zJR zabd#YWVn)Gy`$Uy@H>85FoO8GT(Ff?A@l+C$YAUB$SHq#^lN8tR#4jbd(RPz<;H+y zg@bZ#^QV^7^}i_}Y3RCtDS`bVk-HDUPS}hiH|&9B$-iGCp3^*Oy~iLOFWQ9@Po!96 z63Rm(DJy9bFZq=?fILmJPA?@@m99>Cz22&?yJKE^c2G3RA?h(~A4c^N^h&1BXL12m z@vQf6R9krhBBgHi#g?>LkDogGX-==C}qfkY)Wj5C7ok zYheLsjrg0RjLI@jeWXZ>&Io$hfLqut-hG#5x3-tB@d;w$D2A7;+reSdURtD$c|Up^ zqecaT)~m`!gC-;w2j7K`#72CJXAJTbW!PfvwNk4yLcR{n-tsW zN{?z;p3?kkLK_8VeJTTOi>7zP6R<on8q;`KPLK*{&IHulj^ zn$nX&cDmx>-JoCwq$i!w(!zC<(vq|6W7C2LZ< z-SxQYo{?0{8{DZUoN{MM;7)5SWF{xMD>K`Yv@Bh|V7BH5PV~zw$hT_%4#~K&;Y*CQ zHM*>@QjOskF$`3cRMI@~o*&Lne)0G`gEKgLIsc(qUJHo;Y`^zE4iL7724VXN+HZmd zXA0vNrKJ(=5BAoWZP>CbhMTm^THj^bXDAm7dbV^(ZYXPnS7MISMwR<+aO$uo7^@^E z&>I;Mpp-EAG*g+e-_A^2?!7B^kk0y~0oRB{&>A2G7V!QSmbd^ws<~{nVv(1I3+9fWa9PPz=S3LmHYMwT$wrAK)96}qZfml~eY;&%InV3&h zv57a&vNFP=Vw|&H4L!4CZ03Kmy~$D49eS*kpx5JYk~H=aZp!kR0B3m31UueOqNoM~ z*@~+(v@=tmt55#|lN+To)FdN~0m;OYs>mZctaCE6uE3~&fLQzL0#$Y2E94Ii@oJFx zJ8t@q9OT!7B~r-_MzjN|{D(Wg7LtLgGygX7#A0Mnpvd4vZ_;z4I|oR19ohDSoL`Rp zGVCx-_<~eFHTmc8Fww+KY8txZ%Zh^~&vV~M%0x4|Yh$kloKAzmP$myUU9vzchH;77|!ZbZ9p zJ~%7=KDINuM!g?rRj&TWAiz;S40v(eXOvrIrPabKOpKpC8)^lW{#$_%i zyu1QJ;wo8{p9@NMKG~sOIoBqvx`9d=;7o6Njt!l6s~YxwnX?lF&Tg!>hHgGYR_*TI zJwh57>V*CwhOdQrT)*$zaL6^G`>`M$@&!qB#z?lJ4k!ga=^O>JC&_1_55rn-f%~sV zF_YcqGUEj{AfnPeNV@zKMYh1E!0f4FI4e!Zwsoe&oY#`gs}mZztT?t0AZ`{|jwbwz z<^B)8J7}r;x}7D~f9yE$#dLx26r9NE9m0!X{!iK*FNLD_Atx_Y=OzEi4N-(vL%QgRNa8ln{BeE~IlVzpH0h}lcT0ewJwke=6y)|6FZ@smA%nY}LF`5SVF=Y-1KOHopzpFo+~F5lWnW; zd!#a@H!sbNzGvS}s%Lce`}Vb!xgx$Z%se!p%PQp?cp5Lb$lMf2IEza>Ia8oQQ@sSm zAKqw(x@^+$DfuheZWyUC4IYEgScw=Wj_m|>K1T;=MYNK9ygaB<(4X|?6AZXI7vbFA z+*u-@0@aiYHrq@Y$H*IaOtH7TchQBjn1|Zz-`Ox``q9hZL$>lfvB-mgVLFaLm}W_T zuG{Lhueq#)(YSvG&yrA0`geS|Ukee~*;#+#S;!~$8kF$!9+?kg5^3%$Ke6mSx~*DWJkNe)*0=bYtMSe?wHw>l9s7`XDv2r*WncN5 z9E|?Uarx-Z7kb{c7F?NA)8l2!U-}UUy>d>!VNY9$q7l`w zl0vn=92NcGGM%GiT_I4|NI6!9c>a~zh6!RY|vSW!&=#wA~o4u8+fhCKa zQgWo-2J35DPCG2RM^ac9il@&QG}Ee--3o8y`SM_x?G}@>o41~l3bry3=Ewk6rK3*m zmBFCpri`QJRZ@YPd|%X?Z?m6#a+%7U{*|Tfy;;zSrtU4AK4pwNHGdNagDvJv?vX4* zk;#|4Ce1Tr@h^L*FP%mDN=;1fORs$nEFnQ}@>`NQUSI33^uIRsH5X1{7?&Fsj=UOS z;^RMwR@3>luDK9aHgejFplYMn>=+iEnB4e8>ln5as*)Bk`b2E^#0s(bRUzTS9S$_= zgx-v;7BhD{O-ZX+jQ^)*kt;JM4+W2s>sntbQf!+XHmOUnx_FBFZ?jDCI*Sh~I_Yzf zKh3p{68HA|Vf@UKB}~1y6pOcZ6n}Aduk}VboP{r*j}GXm%p~7Ct*H&a<)YSOIQ(jT zK%MS$TIwWMJku98p;`P;fHT6Cmw}JiUt_PZ#yVE9CX zdMk!_*YdUp3#VhHjd>r=^;}818CcEDS+v$AJ-*~@?0A*~simw19QN7CLuyUet-Vg4 zfP;C>EZzI5YXGJi(dqyX!35)u(Few6#PZSdH+Z@Qjcz-;E(6WS2ENzVIFK|QkD03l z?IIz>Us570!`1mfc730E7M?Rrpj|<^>k)OcJCt)w}Fc=E_ z3L9*Cn^99U%RprBS8hjG9-RqMc-8~l&iK?-+iZg^IXmPItJ5b@?#5sF-p@Zc##h=! z+1r1a!iGJNuZ%xGflCH^1OUB+@k7bRp5s2`sm`R@ee*- zzm}6ly>~IjTtsM2zDV7ace2eCQBgRyQ{C^N%?y<6Z_JqoIcWsspaWHuyOBbrh(bTh ztOu>Sf=40u9~w;X)&=SEHp@4mWR-i=vAsA_^H|3+hFpM5~>* zxV7t*fb$muVSFmasO!yU^K2?p$0L{EVUUj_!^azQg&;nW=j)^kps3tMys2`WbHI0w zF+=2Jin-`yfT^BNJt(0ktcCrg(euWT2{m)dnI`xtj5+ugCZwlE1_D5izV3QJyd1+jitxfCW!g#$>9fQXLeIU#S&Kd@U=;!a%OVV4 z$6j0kEafp&n~Ha!MxQx}hA&c*eHG%Kg}#hI6ZqO6UMjcKkhrmV?te zabV%9QY;5WzgmGw6XP~D7QkyjW>I3sYr=}!Vj)Tm=j9cqXx*ppr&1Kg^=2rJyIbux zM`9TrFgRo=nhE~(EN&AIl~cBUjYd&`)7aCf!p1N)T6hsod;iCKXsQn=vP1LeHU?o7 zKld&wZ&e%LJ?jl=KJ?PeGDxr;}28hd)M-Q6vRr7&p$64~i( z@^^dUz^H_|BKQ1h&h9ICI|mKoH;{vQd+{E1=_n4j#Lmx#n$Fvuh2MH_fIjQgm)Rg% zTuo{olH)Ujho?PFE#0I-tRfIArfEZVsNBxo)R!T)Np0G)e=a5LW&jQ8qqi_{Gg2FpSt_tmUSvmGTz$9@g-88NK_$au z@w}VoPI?SyK`n1dUejiD;=~2RmYe!b_LL@e6=28SmlM7_NNXcl zK-}Nk4*v1H6Aw>(fj+BYxs8JA4e#8g8@xzR^-zoi%ExXov%(mZP&yoFJkZMiOoJFs zdQfk|)c4lX*5lpaR>-xgjwI|CVCx;+%USR}h7+}i6F(Ln(x}(cJFyn%h?&kfo_zE1 z;G*Tq77ln@VhgRo%3uA*l@?#!8Uba>+;PK~%Fy1~^xwSvU{a(?f(h$@>ubwb9K=jR)XY$wJffgDl+{l_$Mc|L!a;{5T$SzxfDk80L z@6!&UmPhq-`Zv9reL%%N`f?}zY@`+NDNI8F*lntsaWOZ(^-LM)T0CC5icNORD%@Xa zK^1!#aY&krD$b13{0#K&ZDjuI4$jGwokbfz&5h~s<$@|<-q(^ULQo7vbH`6*j=tM$ zdGgoVEPjIqpI;1@sH{1ci7eU1LRy{yF1Vp%@%Y24m)5STt3cTHL}<@Tzlft6I!FFX zndW}GG!Gryp=!}LR4}ThRZ~2hbk&qA#mUh%e4NZIPM~XS;|Z8MOZjHK$=vdSK)X*H z34xW@9wToO@8$>kor6BzkKSfx9}ki1B{~Z>X6N3ZpGz7xm3(kaLKIEL#z6{ml(7Q* zgqW-{@zcVU3cJuGiT0XNeIT1BlFp-|t1?v+mnkJJP+<+gwQ@y6PzJ~R{`{3G)eeex z{Ckd~(2zIP5wZ__Qq<(?bFdma0Qenj#5gkz|w>2b*3A(ThC^k*Zn#)Qd)06@vR_2_j~&B zxy|?Qh0TldRGx&KJjPhn-%{nPN$RIi6~3EPi*0F2pgnWwnn@ToETNsVy%8hoLCs!L@-6dK|nn09tMq7-T-UOh2T_Z8?)V^KhdCEmuM zpq}nj5S;_pP66J?>u(S7+Hy08&!;0tV{q^CGU~7;*>;g;jl}FT#fjVqES4qa+m~$Lu81X41GL7 z+XnON-}B9fJ^6uhzAy#{d?z#FTs+oxiMzA zn)REc;6k`aDYi#dC5PB>BuaOzt5f7GS-dn+8k(4LqYhoJjJFpVaA2j56@H0i(VLy+KhY^DO(rRu{z`h&(2d%VdJ$RtfsZl=f^-RXd>3%#ZwztK;MerOiK!&03)FXWS95oV zJmn!LtBRQajGgZZY~M^B=d#KcH>V)8*)v^xQ~G5Ou9oGtz_!o`~sg?~P5IzRP;)@7P>uyffxheTT<< zhF#6yBTuk(qaI{0z$=PpnEfK=JA-%7&3q+MqFzG5zb1+z{J?M9UqdFDI@I1QSxRiN zwjbgSTn{A(%w0#)v55y4f|mD^ch|J267flpqunI!?md;mQ#pG1NrW}6hBN}I?9Tr zyYQ%X@lSSR#}kOJklf!=cbVqbR-WLv^qm{$;hi(*` z1`qy@ReB}(8d`T3Ll3&_NB`5qUOSiQWwc+IpHjcr8p`Tso`ie5|VImk^1Z>)Ut6Ts;My!MZmcY0qTz7>CUnLCux8zap7mT7nTpd^ z?!&DR^{nl{@}9I^+Q%P@hnZEVE@Qzy*xpCZBqF7xXHICdIG)T*meI~3#JVaF8f)%) zlI!7+Yy94+P}GD!SdYtXH>L<=Ib8@qI-mkz%E z4h!R+)k>(s@Po}QRCfzm(Usk2>uGqlEyS$W0kdzBIvK;+Uf;5N(Y(n**vuBHk$p$U2m75{1~c*Ml3QjF z7`o}8gnlvZ?~9fzaEfM4+7oMY<GMn5+egFXGb zu}?XBsYy7l>6>hA;&d>c^yD|v1S{s^l7vLwbGOy1042HzXY70A*&_79pnm5o+7#Vo zxeE_fYAdOB1w!AVVCW)9bwvu@2|mU3m8~zl5qg7)9jnHVYYjhLv>4rg*!zyZ498li zd`)dQVfFpXeSnyQ@c&jPL0-q&vmnRJmx1Sf-n@-~d%aRzWA~mP| zEgU;9E(xE%blkttcQz=Sf$EY}-G;vqJL1;@MtSQr3-F2%?u>&FMITWQ{Y6Lry&1#x z_cO6q@pAt<*5>45XX4@paB`5cb8|9*L>4S8ETBLBD|YT5loo8DH@N=SQVR<+TU#Ro zfPuM{1?wN>7C@H&@8uRCRR-X{RAsO*as7ub=Ops`d0}IF#arm8#Bh_YzT8OX$-$I=Sf3eL37YxF4`k7|Sw1*}W(#i-An# z?772as}jJsSXo=O5ZOt!l0vyXj+Ln{xF`H&Rm2~ZRxvWf4RLfI)BWWBX2m#v?)D66 zxq~=(7zlI6hOSfD?!ipHWutPumf zEsUP)-GZdA1DYmBX|By-G+IpU-A5TG6t@68bv-+rcJ7Jz<@3QDC?HbLU-+gZjMDX5X!W@c3AC8wB?;YFO2$_GrCI3uT_@yWKe*5&>M=x_w z@EtVcgv;NmknwXcCwzI|&2K9c#`@vySI|>`1%zYeBBvs>i*?A_m4-nEHc`h25TGxv z746-UNg)jMy^&pM2K~p%B~}E_EFAQtzrK@()eQQMft+LNlIrwImuN{s4YE&oG>LKn z8q1(+Tx_v=;Nns*M>uIr&2$X{zfdEpm9iUhUs!N@@@(;YW324GvTySJ?{Be|`SYc6 z7HGo1U(>6lzTb$9!qmv}qBi01@sB2%$#>xOJi66YKVX~PBF{Nzq6|{+2j0TJ^HEF? zZg7`XZ!FZ?Ndn^nn<&8k>+yCZ%J~j0+4-Y=6*Fd~v}p6%HK3PY_5SBKK>l|lj4pjs zPPXMBO8RE7`+SGFLc-nwG+lXv&mTkGEiWGkU@Ogo3P7q!!675+g(j&!g&KhVrig~# zgf?$N&cxwx{L3#4X@u>}aJikNt8Fa$d@$q}z#s~-L*=r5m->+Jhr8xEBCf#sm*+Z4 zxPT2$PsLesB$_hIgA|BCWc24qV+lSkrwKU`nqyihfzXY|NgaI$s~%UtfQ} zmDtJJ*$7#0iCFI=0g`4*lNN?6(IQW6D&y#yX$UW~_+=i{48Q?*2j4m23m9)X)yGrO z8cW~Xqj4u4>9QEQuxzfxAzH_&P*2HiVfnNUvi>NzfJZ3Hj(o(4i%>i{qbD0k0t+&6 z&PDn(fObaU9IYW-gj)AukKLztQtd7@)9aeUD`3)n3(_CIds zUd$bHq*V-)-0MU&1014^PT2M$b@GZF9AcD{z&^y*SwyR`NDTCbiL5p9)B57#%=leY zzH0zcS5RXdaBXsQ@`wyUt?wB8y)%E!>!owHp>wQHmVi5mgw;jyvy%j(M{(~Xqp(J` zp!K?Dt}`(u@#nTZce)b0@ur5W(t{i-S9}5eqqicc09PP4J;|0=0S>BE%0<#P-168W zfe4V8%tNt9(tZ|pSYKJZHnv~Y`U4@*=GN!q-LGACsv-fOALMl`3Xh1e`%6%y#eq#z43p#DkO< z-zDWF0?haxvddGV#)j=u>E`P&g1;`golY90QB*pbAtRqwUE{VBJGPIJg#(5GCn(I8 z=eG^ANXWtm?SF9Vb_8}B4HViA-!qgTn48 zrIQ1o_?`!=q1Z=J2Ub?LA3CPPs5c3jaEqPFD9DN&tJxeH18}Y0gh04O3!#cR2>JQz z@lQ4p7e-1qtOh&;Jpefs50ly%DHC5`iqhbY96d0K#>uQE4u~t7V=Zo~8~2V5AuFz; z8Y-@%S+BOvcmzh4wyF9p+Gk`0y*h9+V|**2xBlF+v-WyOP8HB4sfkXbnDDf3aI#ml zvh$z;M6^()e#J%#h7!Rf;8&PHhq275=xC@Tw8?1xJU$|g;gAhunXJj^Of$!PRqbhu z`XWyq71yQO)6UGuw{&6p@8>ZWzR$-In&lABxdgeooNMBW+3i^0N4mODXAxjY2rypVX5a<*vVkKi(@D zUh?Dm>%u8SGVDQecI3Zq)6jsyZuplq`Z*4IV?^HKI`3w*YsDaA?;W*kaPUQ9C$ zR@)yOF0u|aJX)R?JcVq0Vi$=a7a1D)7>fE9VS7eGl!(RM-)tLw{y%?t>7qG6yuf_J z==?Nj_rxfA*?iBod7P7s_bX`iNQylm%ZAA^$$-gfL9Ef@Gf{_SI0T3C-Iax@yynW7 zzAYe;z6B=pF%wpWOgrjg_L;2U863nqpeiX5DOQMR&4r`4jSq;GT^c38T3x>L0En34 zi!tm5daUI5Nbel2p0?1|`byljpE}6e17dboZivujx!lohNixFUGkK*tV6o78x)m8V zv1Z<)WWKXn`?cQmjK_6Vog8i1YrN&!x{9>_u|r?qTN`B@WDqCS|HwSeBYA`tHRh+Ib7j1uOc?4Dm7M=Y)UoQ!73FS1;ZP|aV@O0hI-?;Ze7!pG$B_z{eFXWA|bt-5A> z+CNUY_T>xIYMLwimg>)_6l)9wagY> zcdH;2BOhVZlNYSUVk$^;A+0zB1aNrY_rm`r&LY*c9ucl?u(8=W~3 z-or|)Cy&7#+kAkq1>}0=U1eWeMyQcxeK8tpJXQ0K?Q6#LoayzhB&XZwNaRr@dRnuF zrbcm2lf8E!>rdhEkfbt3k6h~-m}AMKFQZ1l4NxBOGxm46wJM&{%7{p>BS~W8jIJk* zrV5a%m0^S4w%D@V3*j^sS2)FftUyIPxoyw7HDc(PJH5Yy)d|wm{X-mIOK$^=dxtjzC)gb!*I`fpSdPpD2_NyP0;PxDmgSV zUzWR%qiew$B=@Mt73rk)Tk|BRHQMc7!W*Jc<8zPBq>E39n^=q2(G0=hdv-byd8yKP z+)BN?SOSusjlEV7m(#LjnNH#zO1cwTP@QzJGLRO^zRfaPe9)ibgRSeE{Qvu zi{Bp_;ni%Me-O#|l(_9cT=zo|XWJ0`u>L6%-XE*(#a_fJzCu!xO>C+ONVRl^A+jL4 z)teld+YE6UVzowGdTsVV7#fgVIlpYW~z7e4<-z|8@}ZDFvDt1xnI zNLkp?j*Fyv(HpZuY5}$3W6EbFTO2;Yu-2`+Pb|SZ zNR!cB?kSBQvP{!!)buh>r`(V+tqL!9w!@S3q_y;l;~&%IW<}~(oV|f7OV3Y;_Fr`9 z{t&~zZxa1?WIXPFDT;ovSg`Hk6#FcqDX$Ouc2`C1&WC)Nofw9jdyzF%=i=4 zV#MQrO(Ak>=t3Ojh<+zIm5syBxqPl@u78kI|LB@Ee7g(Frm(=BdFN$0LeBLEGha)x zX5;#uzb>XM6%Qg=w>)6;cA4+;@o^;fjJ{N%yB0Z1%0P?54WBS!G=$Aw07Dk4bn!W5LCr=e=&QTixwO#Ctf%sHC3py9~o6UnO)ln?JV#x!13&M@u~n^46dZtSjjKXEL$btB#Nn&YzUOt$8t&JCR-3#X|1A*&g7Vbs2z#Jy#lN%IH$C zGb}Vb7g>2sz8IAK?A14nH!~_ogRqkInA%WdhEv2Es*lK`oe^e78oLO1>`f!TqTw9s zRVd>zu-9V0(H|neLG;%r;QvGGzn0?6`FrC7>ey94?0x_&da(H)w91i@pBPL`$g>X! znM5#USZs|ga}3{G!6}P$+frAjhegGp%ve*`Id;c zX6^Cd!}t%X0eKr32<_d^lgoNj&di&z*{D&3kz|ZS4CqHXSm zxi(ww-&#o^sItfFV#ED=XgK~)aojibTQ0wwuw1O`XWLLl+$FyKunQYQ(~J=E`c0hL zLI)LDW%=TdNbd_ciFo!X$DY`SJecq=Q5~L zy%xRw?*baHDxd*mdo2?C$LuUO1`Zc?c_RXH-(W_lPm#6`hwwH35_hf%yjaBP=~BnuA}fI5jGr+HsZ$BmU6RuZ1_D zVq$-v)c_ovY9MKKJs3t|@XjBmj=#!Wh{%{Gh1HP7ni(4f_p$+N{D$9Zf&^nWawwyh zgq27jH3tVS9`qk$nSzTt;`} zq*oM2|EuDhaL8tlxIX-sPp1K(!+iXj4S@ym{6qm&9a2nIB?=cMPW&55&Q^pepL~Cf z(i_bS^pEsoI`3R-I&Qk^cjD;Egn74q63$C%&xua`;sZfQ5tm`oPyC!@u%cGc`a$^} z*F7I>*;^Wbb=0K+5`}^1Qg!%g)3oM;HpK(Bbn0vfoTZWB531tYsOP|OHot_;KsId! z*K(@d#~JG6SX@lUZYCZc9AivGf{=QWME;sbufwt1FIE)=v5rD-+4~AsEm{Y5-Cn>F z6?Cco5Wm+V72xj)2Ef6g@ju$MQ2e(xHM6urG2iyn!s!=;k;F?k0?Y48b2jvF`o;z- zBs7AJ_V2@0Alqvp3HR@!E57KFza+pSr?Ope>nacrs%of1&vU_E9$lz9gWuqBkVx_t zf)XL^{cET{80zUmVhiKonQkre;6_NB<8-7^m0*6Sa9k11;gOThK&_u%TnpNTyxJ!^ z`a_srjZ*&qQq%^>_FDMF2Kc>_0;rCU6BJ0M{~vXHeAjt1q{ni1pBD#DQf*>OJI^s4 z2{A1$LgDfWAIpu*6){^wf<$Hwd9n{XEd=G)@R?j_9r6|eoxL)8z96K13mLF!kSx#G zmL)r2p^~!MlNtn$TRLr~FO{mU$Xd7cZ+vn3*fMOrkks84GJMaqsmfhOXB`JbPZhH! z=n^MBs-DOzvmDW)TjGqA)5A>c`O_|>DcjOcfuoq zHe}V0-BzB2QVKN}x<#iani-Kz(nGl?KI5^v5?UQM2j1C4j)J^My>RF5CqTC!(}bcp z4Vq#f^QOcf-KyVYx117{jZoogqpzy*m-Y_pRc)zYKd_6?h8nPrB?h&D`50y>#CfdacpMP8mXGa91KYcRyoaucHi5S6t zz{Y)g8EqXl<)cUY8-!u3qMX;sr#})HHPMthq2%UDZhTBG&UiJU}nAL4qdv9=g6b-v2fCO zWKal_=&o3k!upiFuJ7tULeOs}fC3~50`uXg`9fGb z*?Jwh@|bwi^c=?JcRHwHm9MM&{us7p_s$RHh_(+4nDVZk2U6RZp}R@too1WZ34NL{ zd`e9+tlqH)HaXNetu$EyHvI2HMU!bP*222FXeLpPnvN|t)W|ILmWymnip8Y|raO@3 zqF_f+ z(O2NlJKyH`RQcF5vY}~AqExq3a`I~PfkkaoQu8$x*}jhJdQ{BPn>FIMpCb^Bg5w;1 zlyBN)M&rJ?CQfL=o&s;fwe-<`cFX?Iz_DOjgf_8C@8uq{i`2uciTY4cq@pRol7kfJ z^0ntPsk3VS!d-s;k!yg!sd*pr!f$t>rqPKiY zEY`9|NlE~Z^Fzt_Bz-&3pv~2VxPb=4SvXCI36pGWpRN!sO|iT#FI!p3p@hF^uRP0l z+dvm2;r)kH69{-c9{o+Tm;S$tfc@vooq&MXBGP}BQ3E0Ra7YlM-^IQcB-2l5EfPr; z*?pNCMhW7Eg0G5CNJ`N}L}d*mVc@%sBXj0_BJjzbZ_)CIADVwj*?p^`bgNve!=h`XBn>YvDBOKT2AP#SS=vHdI7TOCcy({1C3n2QE+# zpR0l|r-eM;2qPIQbXV(YI2yV1#56JjkbNcaPWtcJOj>6(NvZcBk>bM2rtq(JCN}8E8xjRpX7+_6!V3SZr9EToT>Cg@J^ZJ*G$a3 z(m`5I3?02S@%sghKs|KnMSi9tHu>c?NbU8u#4^5xQvqVvcjtd__O;0T|DAeYKu{&1 z*Uj$#SdaeSE2;%#e=YcA;~~t&@UIc{BaV{T{b?6Qs>pn_hs(uWD-Z|E`_gnMawr$%w`)u2`ZQHhO+veG}ZQHh8 zr*3t3>UZz$^f&3Gx+_)5%F6n4&bi(TLP9k(99AQ#E3zJ_}V zCy*sq6dk%ESi1!$kM>Tkq_)epdY+SHfCKpwKu$Z1-w<|;hbs4tiie2cTHP%8PPRJKy?I++@vf!v82;j!Q|LZ zWF9#z`3RYA(@X6Ll)8E2U7mUW2F9Z_dH;_q>fZ?E|AgcCKR=(0_20nf|Kwhonf~>V z_v^2OJ;VTW`3n@Cf#7dU?E!&Ue2Z@;=X$x=LMOhm4pXrfo%0x#y8eB!pmRitSB^=^ zC)`uqK^oo~VY}jTiYEqIO1QfOZhZ#Liybs;H$VoGBlO)1#4WX-e6LWR&D{%pyE+md z7Ro2eX+~v=ngI}OWN`Hw>b}YrrCMv{s|!gRIHUuk`l%wEa0F#buNNlGTD(Tqg@ZcO zkBv7FmVPkXWn-k!u6r-A6v?-dpVbVH=H>ahFsn-l+u5vNq+jL~2_U~BTP07c{)a`! z@ku%bIUD=vJ>t5Kr?=FCFk7 z@eWr*iMK2x%5D%=sOK_8-0@q3%Sjd6)z6XBaT9r~xa6m~Gq~~1JY)krTcdoKL|^G?R#E5FS;EagNy>fJp>VFChBsgoFS{YKlT1IcTO) z&#!02z{Q$(DcGebwI=1ljfu~MvZ_w9ep+szFQ3G^C(tWrhgpd|M57Wb*`PJcY=rQ4 zGCIo3T5uoF!IiktXr2MCMAS17fzlz|T3~!*PIU?AJ^N?U%u&&ddi8SsQ#ef=KOkeH#D4tvfZT9tX)9*6Vt>&9$>8ZKF2>cyIRJ1}dv<#^IY@^* ztiX-unB0+)9A6cu;46D}o(5&DLS;^uT#+H*jH^KlU0ateh2-lUcQ#FvNACTu+o_os z#xlD~zCt>Wi*8r^P(fdznpO+wyWT6*nJM>R_fx2&!zuMb;rG_)Jr+PcRU`9&qY*Svv!no)@0fn&&rfi~v)bYR zQWEkn%F2I(!qZIp(-1?)rTq0-KpXz`Sy&b6nHYc>ssByDY5%VhOIijp@PFKhfA`lv zTO|LEL;L^8Q)B)0PurRQGw{?{fBjSO^?&o!{_l8dtiS$g&+z{vo*L_4JMKT+4F684 z`TsLdjrG?*Ev5dQJkK4)3HKLc_gAm$7d7)C0T&4K-}Wu0Y>NDPB-t36)6<9tYUv$2 zVe(al3sx>VMG6qc@(U_{^|Swe@(_4^S{8a z|Jzuxtbv81)8DAJ|I|M!V(#GRM8N*{AoPDl-2YcigIOvo@%1Y$O-JnC4L&Qi zy&GiBBdxkE3Yx~6^#>ZBE7)yWSqJw6VOZi?4+U|=y7w0^mM{z?*4k#FjE)K(0CUWP z0I*K*x4+sMIVj1}17-H0u)8P0SD@hl`%@N#sL7)Yg54aG`6sg9lBqzl$(x1%u{DCh}9dpLrrnH=% zdp!m^`;ft0X9a-t)$EXx-Dd(?9#!=S^LU3vordyYT4R|M0#DQDPX%uY0*vPB%23td z0D~f5$@j_51wZE0sG!zK>Wui@%xB$)3>tQqEmBCnjBzDp7I0@2HTv@em0G6N=3 zQo;I^jL=sW@%V$uh67_8^k<~ zyBk`TgfR%tN+@l53J7h^CJ4`FW>la6CqVj3X?o!l)5Fhc=*X8C?}=qwhohjEJYo$v zA@?3`{lL64P$-u>+I2SK`Y8gNKfm6LbZbCOC^byLHvt42j%iUL;gi6L*7+EKiY`AG z98RK`G@8Q+Es0!xFL{>fP@_z%;7+8JKw%y~ihX^=jXkQO1W=S$PDZ{I7fdivc`@}g z{B)tubq6<0@Ohk1F5zo*aOUU3chWLP7uvRU#BYX~P zM{QYb1hvaO#k2G9!Z_WHEq4-K6n(19_>b?Q`-1b8!LXF?+tueib+0jfpnrMM{*(ZzV?p zAFI@diJ>y>V|J1qkL8@GOz?-7%j7}WGO868Wc49Kk7$)l&vQOjBuB#&p-jJ4R1SxBX||RreKbnjf-3r`O0Cbkm(< znOv=y^{G-i8JRVEW{-tw841{(l=G2?HA2XX%z++$jxELKN zZMcJQKE$11Mg3%?w#n|tnwbw%PIkSr>;-Kn{=vcm8WSn0A4;>@^ZCt?a0kYWY+CgG ziVGw9gF1D)tK(cY{klq)fbHPft2K3s-mv>z%*-?=BX;2;gza3EJL$SET_)s%4woK( z_=wxhkRpxaK6?taebAHSr;ubE8zQX(@$~J*AV!b8l$kgZGb1{BlS?EhEq6iTkVq%; z%}{8S*x%7vao6t2N}i`DWcwPB`Pl8JKwk4{x!7$Hn3q&y56A==jGjL|t)^Il}6b}jO@8XX311u?L`~Wnt$hOB+sx6%<>%hIFo4pnAlg(lR8gbo`NWBh%2T1O`cN(qfNl*vpT*@a5obIpaLB<4zdLz&Etiw zE&$o>2k-(A1oWUC7ZIQ@nK|>_C5KN3<&t$KJ8g>n;vRQ24U1oN4dDFL%LN2g!@Oas>&hKIIstQ`i zxI;s6i^MPy2WTHxFgu4PJ-Y&BVBa*OeH1*iQ3Aur?g)99op zfds7xIIVc3Ugc%zBUXi_@C*-a3XVJZ@rIh8+Ty4R@tXvnF40wkJUETFS^&+_&n;>z z!p4sY{YVt_AUX0Y^A*L&&T;j~U-lf|yrAZ*0WmB;vHa@EU;u`bo@e+|o_8454a?Mq zQ(Q_3RO^Oqda*hJe!1W-uR>W?(Cw?Jbtor0fZAIHvrTfeg}7v`^KsfB@3%UK9Y8VL z^0xzCwW1E%V;{IfC0?6HMa+?PEX=#ITb0fDPV#gs}PCAe36IGN9K6uv#bky^S_F3f>wmWMY;cfzi2k7ps)Dv0}6d|nW%WrjG>B}bp z(?nSK3CqK)QDgu@FKJ8HDZHQql8rxW#`+k%f_yDXS2=rEcc|;-U7PUppWCR2@H+EW zn)z(a^bh>~0g&Hbn(QyPH3#%w-l49fisL7@H8RdOnp|DQN#Fz?bnQ2bi=Y84@O7W0 zt!1gVcjopCmiXgkKTp??DAkR|8%DmrSJ^)QBUaO;x-L|s?IP!RpK5;5Mzq8nQMzmH zJ^tN8Oolh3JDJXAw38JxLx)a_{|h}Ru62GVq1M*0`BT9q;UuA-7$!E{Y2ASq+4{#Z zaZzP5ZKodw#U&cE66ZyZxfG}r1GJ1#HvE`?fb5{g$du)}cha2`SdZoE11=AV%{-JV zxHnqk?vOzU>G@^l$XwA(MpK3#ewhp}VP@No>CvB{Z5nQEW5{G>jnLJN!Lr6NS^EUh z`+42>oMVSVv-4%#4)sdKI9eHlvr$<+n5V=I8h*&z*BYb`)wr643qa0VQH4FJ`8*a8 zZC3Vd=uOsMNKnnMAL<~q)emPn&IJ);_x#T~6+`dRR|`EH%&ES04DGq2wu7RBrh}@3 z?!DZ-+I@FqjVr)0TLBOKQ@Mg}c)VT3VyT38#iD8fKZOm&N&8}{r1$^vWoq%JP)qmp zoSE?fXVp7-RFI8N|$Sh-Qj`75^;+Re|;lX+~-D#_?KAO4`;P^1+~E%u-w zgrEzk7tY{p=CFp30Y*my?9rk_6Dt3mq}E6d#N|r{4xQs zs%z7Z-{TUUv$Lot7?XB8ciAiVBWai-W)xivxPf zQ%B>{c8jAIs^f}c+2rD6{qu@ySvoT1YI#-buWc;Y<7up}MvD2(hK44G|%N!aVBH+vbptit+<<|@AYTcPk#x;$J zyEP{so;6%SwJ*0p6ehc%ESjj=vAL4Ls$?z$sel+R{kA67djL57T)u#3iJ10dw+1qX z9!?vnFs(kWUX5P!l{KN6v*01Kw>nsQ{m_*5!28`LmO71Qr!^|p-Ko<-MqDlW$^%A= z9M-O89&2<{0G=?BUsu`mlfofrZ{z4JIzSOVV7l+A6DG^ivb>imjJEDT z8dXuS7QWbq2a%C)Mw?UNjgi71Xy?s}!xj4%BAgR)-66UlS?BTD%rZ4S<=vJJW~*G(k)FKT_jt$`Yd!5{Oad*xL!y6QoziAJ7# z(M+7BStm^Eja{cz$`=c8f1>^O2=&1#M;QX5-NoY1u0^N2aJ zH!EX+SZ?XO>Ur=RRBK{aw#VmM)t`?I`&E;FVaRZFbSkTZ`@!S58Lpk1DM6+0RM7Nw z*kSjGP{#x(zxv-BCns(&i>5h{(` zkwNFpqV(xd`*f;*J$hGb>I_`dMeot2nHjnFqWXD3G}U~)S+srLDZd!d4NQ_zca{yI z{dC>w@w&hL?pfaCeZiX~C(k_?e7GN87+Ybj+tUb0*eqmDq5^$~60*y^7<;&H!I76y z4QgdN8BCBGYc?FgrfVlD!H)S&U(3$k$?RKRORo8HME~?eag`d?0C@;8f!B|%Ra6p7 zjSJR;lW(vc{(%rEyYG2dmIY91w|~jAv@dF}q+Le&m+(iyB%ZY*xa+NUr@XCrcOhyZ zm3zS3rP5PtU!YTb))R`nq|xS3@b0nrX73_`GE=TPKuMt+%Vs+D@)Y&J@<9NGURGP0 zHQ|}hnw6|G^dzQHyNr{f^Aj&%sNX(kPUfI!oC~>(LHb~7XC^s$@*tf=VMpwlS1=jc zMOkWw>7kct)W|Gh<3Vg_Zy&6eKX^#k@Q8?aT>t+1jm+H&_r{5pG5t%=_Yo5nmliJM=s@>g(stryQW)-jcTnRvocM?2S{R2v?ceq9Q|Hu~wtY#4F*H zcRYDpOr3pHH@qbYWv>Fnf20bx2=k)cVmOabozP?GmCe{c^=Ac{QgoT4WiRRT2dm5h zUr{Svjd2SOJeEHt{0UKvQ>y<-?n3eSB7fO*az(KEZ>7_Qa@vSz!95Olhy-vjWr6j3 z01@6c({0+CF(U*HDVyrvI;7awtBMw#3lY2Bn zHOwRCiD(Ak*E?zKAN=WtzsRUsaP|7#MFM=9o`JU|pJ;n*{Igq|SFuohnY#IR1w-%c zz@}dW!z*gJx{gvKRII}tcIeoS|L5mH)6kH$rMI(C4s4wt>d{^(M_G%q#(Q(YhfX+K zE-KGi4{BA#a)LO&kAOX;%KH`SSKCRUZoLpchK#Rv3hRrUf3sU&Dnnc-57O%4;ZAf0 zXUkT4N-L+0Qxn$#x}lrc;gK?zuic`Dow@DW+*Ua=zyP1_#4c5Fd#+{m5zkpyTWW-0 zZ^h^s6Jt|##n}a(*4h_)7mN;dh9b1Rf!T0MyDt=J9d zh)Lw?(_qRSjU$R7pY90E20qu=MzII>4`V9 zO)0d4qs$}s#?@j^oJK_#O%=NOev0;O#?(V|v1^yu312`XT%6$ls0^_FQ~8L6<*zmG zznkk>Z~hxIu+fUx{h@k_R$(z1=N4a;)d|ljennhgN)<{19s?m+m5(Q>@GRrw-9874 zP(-rPQLZII!WR(jn;~uk}?-sB!R;Hm4|g`pfRI|t1*_zS?|xS zh1}V8=fK>o*Kh70_OyBx9~gKS8-S|bc&Glav>%q7QLhBIAmP;LP2#W00cM=L?Ws0a z;RR%NEt3iOKCg(X^bd!+>C10Xq+<>O=TokpAJ@5yaYp- zo%0Nas1EZ8}9~Lc`Jri4itNkJ<*)%N$`Uz zq!7YWZx<4|i=N39?S8JzgBQJN(y=%0j;y)!jHvpRl4bQZEUVm zcO5XjyPTZ%M%C%6A@FIznE;`B2to~dqyk0Xr^nn!3M!oQCR66ZF0@d zztfuk8%v-8t!i6F$z`Rv;~5gN2tJNgZ5Hi{Wuv?VI;~8vO4$>;z--K9K2i1j*go;v zEq262kF@Tg>}lk;JA3RC^{S6Xf1V(A8uRuFKF%EEdaV9JdX`9;rcwc8{0`woL<8Upm}RQDKvTRkwY;dkc2!UZSB|- zkLL4*DLKm_IOox73n%zjsK229!BQLVl2Or+(X=p=kfsu3?H1gfV~c1Jw#uSU8ZL&G_$R2Y4$^W$|;&qMtGYp!b_m?Nn}|W0Tq-8 z%*GhKUem38sbx4r`$KN(XgwN3Wd~0l85q$KI)L&gS)MLIE05Q&w2Td(66oFrVG9Yc z!aU-8v_T-DeCZUfYkBOV6d3%bfIOBw47*5J>H4}m2ip#2ZkKD?wGI0sN^q%n&EXn? zxMPJu{{F@iDV|4^ky9JfvkC9871GwEZ-h$0P#z>~*+s=AA2q?QP@9VgO-;hOeH7Kn?3XKth0?Fhwq9?PQ`yML(mY3i+7LKuZ z9q1WW*m~ZPBJJC0gI(+|n*b^s#KheLldhl>mB&VatSOk_&M-MJ_ZGI!C{8JSvK&`o zQB?t7MIDd+IK3ZFU`enr>18xxN;Ww6C0E6^T`LhwDHI92P*BwZVHFf|@Mhe)Xs9NE zJ@QJQXw)0I@q->lv_x@+)!^d%m3kjRsbE4JKltrr@B>+Zo~#*tL#}1SPl$3*fxbt5 zN8x)1=<^^U`2m;dU|AIWlw(Ua9g@gLElXOCBy5dbh7|VC+aTFdu7qKV?eG+Ru$Isy zNlD>;RQRFwrk9d410-+nYu;EOnCjLJ}0ny(6)Ypv3}!M9Xo zKT(CMU}d9s_9#K@A!wc67L9OlNGnbQq!gfL2+KSZnRp_?fFPLCF2sEz9MT=s229a6 zx~2urLm`^bLy?~1H;d0#_PZ;Lnx(T))c&yQaPj5%wE|j|mS@>ZZUos@tu}iQA3|Uh zgZ_^9Em(ei_53EqzgX<@ikH?^+6urO>ot@B0?6JKN+hW#Ka>IpARYkj(a6g28bPWo z#<)c0)SS%dQ{@i@)vz#BIO)Y{U*<)Vnj_>3*-N zNZVFLVdIoSS{u4I|8a?je8BaF$9vD1bjjfmz}VED%`j9SG|8Td+Utva+4hJHMMUz^ ziX%vuA)gLn^Nkd47Va>@9XgT?zstiAElCY@Z4YYXhVk*n)Vp&~eBz%+wQh|av~m4B zDq3B}kw~0YiiO3!w4qC9Z5!&oawq~R2n03r;LcfS>ssm)vudQJlAmAzCt(U1RH9__ zfm#0&9GSdZVU2H!)HE3#M?ROXtGvafZ%=P%3Em>OOKn<92ESIBcZqsIwQ*H0`U&Aj zk*XeGK+C?k`w32h$IZ2^r?RpA<*_Ln#$F(_hpi4Zh=JV$MatQpvodmfHr7lb@3sq& z7Ls(ehIb>6?1~)VjXvEC-Ed>jV5^Rn-yXK|5|PIeX`%EctR0{mk`YUTs2J15y;_{W zZ2Yh+u-M9U4xJp=lh1mId!1*6m>)q1+SlSMS_-)h)Z)8j^1g7QGY3$*C+PVxhYr&f z8ocz4uJLGk&bXZ~W1wQLfA7wG`0J&B%#Bd+S%@}PQYotdEUv@K%8V$la*p!+t{=aDb2)e|VPK-Vuf9 z_8i5)>;;LTRtEv)McPJ~Tc9Ucw5zEv2YAB>wULOerNiL!u-cqN29@q%5Q}B^V=qU0 za4KOB$V}laOHC11T8uq*Hwkg?c9ADBU<$go( z^VeZIT$8rkm(+AIq(yGZ<>7kStF{NE1KXqXbom$NQ|syT!uB(3e=z850BS4kNrM&a z5Qq#ACmKJ0DpNA1=ru5~=SVnn!#)PbGmDD`0gEcL-&Rvl*iS>^fx>3t; zpE(^%*(@52fHqQvG!+xv9dxcc!80m{(gD`Zo(KgkLDCQt<<$J7-PHy5pACwWio=^}-h&WaTNTXo;}Gua=vvfcmypt~ zjeeHCQpazW2^u@h+$83ORNOG^^D?DmEY|HD$$5+ZDM{MYLER~DnP0X==J(AD<}mMf z*`v6%JQq>2BTm-{6w(=}mro(7#Ft!t5Rh(QGaz}_FM?Y$_wrdJ%ywwS3AzwGPjm4A zzN^5cFR24gn`UR6NeJa=h`H~5o}kl}&Pc!4#PK{56uohH7_+%{vn?m3Os*9o24$}V zk6_7+jWtk-9+?T^^eRdK)_x{0_Xu|31jO)VNZm}td2{D*e#?>6nz&d>SyJ1*{&Y zxKBuwQZ;E2uH8CY;-gChgy){!(aV6mPH)&v9H(-)k6dbV+sKs8l|S;lZFKR@3DyV0 zgL)sl1t#5;jmRe51K*s7AWT1sX}Q)w`LdQt`8a^>o~LhqoTFbVn!}kvY~UBaOw&=F zyjLD$I~LjL2%#t*v?5n5P69nSd5ZDUXdloyf|pML}gmr#`p7z?J96Gv_GS z^XxOUQDxoU_g}ok=1GygeUEfdhJgI&zGXm?l@xiQ=sMy%j45apjCJ);f{)pPO8Djw z+!lwu?Qh?UY71a_VQ-E~73G%0gF#rUNIn14 z2F}=PU)+zL<@MH>Zzl}C*OABCX$Td9enI^0Q4xy|y@>{nmWZNaL|ImCd zQZ_#Y2zzsQ+ixGLwL3H7srRJVOB!+e4>%9{?S5TaZ$CUO=gBp9h0@t4fZ@X4UdnySYetzKkY9K*ZDV)r*Z_(RCu7Lb^xjV@Q0 zSBVNx?U$NuZmibEpyRZmR%DL_9KmI-Ma=4JR8eP}WE()ryT(#8-79ber`{$U3w6@N zh5fQN<@M`|uys#bu4@k>oUlsKdM=)(3*!0(!3si7%|@ZGNh@3~24Z)?2a!T?(M@;R z2ly5PmYJ~%yP9=QJ-<{{>e_v8TAGI<(!?<^9w+-p$Z3JmUgVt{D(-VTa`}BQ`B<|U zbZ(08Nkkt^bnAN6X1a)LBskyYKotrZuJaPAeKLLd-86!b-kz~zp_Qo9V0KZZPGpY6 zJ$tv;a=D+qjp24al?~FHM%YL%thO3Q@0J6{2{v@yUff0?`OAace~B~gqLPVC)2)lOgE5Wh5CC$%cJQ|U-)xaT(4H9TV4 zw1DZh_O<(Eg_Ga_#n?C`(oIPW?Y4ArV3k%=+kHPeK=*sDg;O$G+dKD$m2z4RBXiL3+093pEmcN4d(h+5Z@iHj!yUI7iP#Q0}@dg(skQYq%@uknw+mY ze8voc9Z!s$6C0-+Q92Q_;4`$7DbbY~A097Q$OGZ)9YHdIin>54hwK;y!$cTQ^jnFS zr_Bk=0%aQKrYzps7HJw`B~)o~-HnRP+XL?{6>VZ}DZQE~v`Dq$IT!VoyVbNX^!D0u zQak{O2KulNRn~~Vxkr(D+}8J_ww2Py=qhvfviS?gDoG$64<~8CesNJ7vx`GW_PgO+K_nfA4)>TSP7Q1Q^ zwNE{_M<;CY;4IC&10B*#i@d%(zO>AZj7Pi(JR%VX3;cws~{czNhM3 zbMVp|r%4}&Ap4tw#ENGs&uDm~mIqp0a^xkr)90Xf7UEs@xtz0C7<~>ZbvF}}e5P%w zL1xD={+c*q|9v6-^)4<%YFrr@O>yno#%B4mf2r zx56Q%zPobOS$#4qM1DQDG7uY$7a-)xYSc&*KmSAu^rf@o7ohF*X1;8$DW8GC{WpS7FJ&6iAT;xBUpEt!P6Yem*m&|Yw&*l9MIQx*gD zF(ZJa(#4tXSYigCrcH@a(C9}26k9Mx|NX=zjxkb6Mut%u4U{LQ%XXv8$pYs!J1sR7 zknSVYu)*q#u79&r3)omq*>Yun=mIX; zs?+a2se8OESV&pe{}r2p|N}sasdZicSXIp|K}eNqny{%%$RLz%)SMW}Jve8C;z;$MOO>3+^&; zKL5rt)q7YKz-^&ENf2WTZ2Fbl2Mydj+tg_tx$Qp+bVbXmJ5q;+? zrROqJJO^~%EnI5HtDEzpO|leIuE1NqX%l`FBRLHs@c~|v8G|Nz-l6v;4wZN@2S;sc z&U>Op*gPgq{5%9QTouj;LaqbOz!860PX=$_JV!f3U|P$O*~{4BtI!_WmCidxZ8z)N|}X)B-;d$Wmm&OeGdBx1TU>O5^Np!@%$T>efvUg%&*O@?z)`za|N@f+UcOF&lOA_rLa) z2$1v*#{j(B8(!5C z3qy%rfFIRtfn92#-sp37HkgY8v^%8#j_T3hJlJdXwMdBdMfw*uif7mTzX3 zp9(3%5I|jrA(1h%g$gvov!A)ZGJu(ZD%=@CFi}}buyS=rTb84n6mV0LZ^O%FP=ji^?+bPSuMRGWFW8uHwNVje5Zmw9{<7Z*iyOPC2+VG-!sJE{EM37J`i!d zQ4>c$%H&+M@B_4QPy9&T09ZvDtD$YmtyV|iGdZx_2_?L3w=Wrmw?9?a=4?$=q6WDy zX=#o$bC=rlJM`XhdIlY4yF0`}>RM6mQg4#d{o5Er7m@Hx zOABPk(mZkVI(eC0soh4_1FS&#Gc{sSdFxY9X>{ z5}5(8Lp)vmMG!=aD~8NUnJzJWY>Oeaj<0QoQSf$XZ5bTJw7P}k@`H=E?Xwp**9+VY zwvYqv{VX5n@pw*h{oKJYayw2D1u-y>y5*4pySWa<2B=VTAaKdFpi$ ztzfW)F*DXQEpasPDcstC zsK;$vq$j3w-5xt&ms0C!d+Gl8R-tct3?+uEQ(`5I>*^uP+W>Az(T~x4WC0z3mN`0Lck&vgz=(D3id9)%;6X)-e$b17gGZb z{4nT#KzllT)vI5%!F&YjyuisS&T4TAX5YXJFyIXOmi!JH#C@DgnF;|%xI9YgJs|HB zIg(s6mwAhUX)X;cBJa%PkD#j1)(F0T(j#m&Z zWnO`Mb;x_MY5kfj%135l7Kf-SO#t&3uTEC^RGYtjWU$SWQYsq(Rh`Bus}Jea+l!Zk zV(9f{G}7Bi4H>6;jEpLF#o#?9hHu?&fXsv4UU4l2?qC$ldSa-m1&fiKZmgZ{p^4Z% zu*cI5P@WvsQfTWC0wa|Pk9o8h^x8=et(Yz-3eZD7kHGMgO;GM^t;>I3E+!slmJbBw zd%qmH+kWxE89BxeI{>4Hh{A=sO$?p2et^>rmU(`kOQS2MPk=$=Aa-x^wBN;q1FA!$ zJPjEU*w3lp4Q{xNiyT2Vd>pefJLCxDnqgE4?m(@g>O9mPw2SXsv13C0(wQ!|*{e5S zA@1`32!|aaxxS`4yZtOtyV9L@26gBxJCLGeZ}o)c7~xE3(Yp8ftC8l9`wp*qd|}b06o8meI5G%QX2+X~(!$aE^$$T7sk|lLA=hd(D1raz zIe;zR6_^qHeo6wpKUn!Y{4fLS0G4;%(EuIOdbsU7k`D3G>=cuj5bCv0cq4B-6m{)z ztX+f5Kzq}JeYi(auHvDJ&sXIk`TV82)^vaoHc3xGK)$49@i|M)Y$5T6nn+ruh_o^Q z%Bt1Y8Lo(Ikw||Aj`T9IfC|{@B(8{jewL4*2l@V?D)lFl=hZ7*B{-CG86>Dz^Y#q?yVh`REOmxrkVrUj0&sxddIjQQ}Y)LgLccx37 z@91y8eUY1Gx08)wzVy}?W1$v@~TB6;= zn^|a@6+Vy|04c%)a!}fhceFR3$6nTk$hm_=jObK4^)f=|o+=IpU)Wwt_ zk4GKs+Dv@-)oe2~2VH1}RrITlPvlx&0wV8RzkoeHk*lZ=MxghBcX)B301kEYL(I`+TC^{0A8 z$Q!@=Kq0<$0I6ehPn-(WYO6B?uzGgk+!{h|$1}2bXTSP7jyc#!W8F5E7#dHRJ}>Rs z*`YM_A_F^Ov_Sz|5B{X1bq^A7I{hj?^-%{DldmZUBmC5E$X%==b4`lb>vYU<99jaA z@R7-q{P6$|uUeuj62=P$)mArr2o0&&Zp6*w;QyV*0v%fq%j=U=_dE8qDJW9O%i(dL zXoGF@i~FqyN6o1B_~#8DeE;kxzn>~sQxGp_l!Z7o?!JuJFX{)lkihHZKe}xG@|pkH z$l>3h$bVtNuUBh|yKagkbYH06vcS91_K(6w+GvqTq?|s-SxKt6;^$F?fv#8p2ur*_ zA!`~?qFFV2(h*S+BVmq49Yu!yy>wrsTrKWM`0tz@?vK6Xm?v?pBl9YmYo1&)bWw32 zVspIWaPGFu+)w6Ks+9{Ot|fCcjBiJDGIP0Uv`i``)-=@o@c`6B8v$(aBOA?@y`CGN z%ate`p1vN{8J%tJkFWHAy;q@Z5)P&&J*2+J#I^S|-XGlDN&jc!x)XPYd$Ftw9tt3RN7T)LL-*OHrxiI&RIZUZ zl2`UgD*~JqW#kGrHJZw3xtU;xdWz3k>(i!OJLLtND4o{@KOf`_u2+wUOy-1nA&%)i zc&pGQnxoDt{VSXu11U7E0qiIj0=&+Ah-NrE6^aekMe|z(Dm7)c84eliv`>t4lDrj2 zMXXNbk{0159Np6_bV&VX4+XtsVRIX`T`DeVpmkL2ja?w!#FD-bxwgFZrmuTe)-5vP z5nKt?>Ql>cm69H)#2`#2BbV&t=Z~ojLybxtX17OJf4;rb=G!O7cfw~>KW5$Ombxy|NpD8rhjf!>8K@|S#!{^^Vc7G~RF!0!5dF+DkXVz#Qpdoi$b_|tcr(pv zt3D~hVLane*tV(o5az@RYAn-ljQF_sd-2dkxAtWk$H9qamA7%!d83{7hi@nQ{n7lw z#J1|bhJuQFFjlc1HxUR=j5pAYrpwS#A^B>M>>2UfvnZ$fZnfpXK|`N_WwpNj6h_xm z-s(8Nxldw~s~dOlzP(ca!uG`)7^;B=p96nf0RVrx!xcJuqb@K6mUB$yFW|oB8E)iGolZ{Q<6T!X3ZKL_VdM-1C-h-{r zER{?lMnNnpkd(?C2F0kZ0v#t9oXW0 zA-C714o$c20q$hCkU3K3z6pBkwscug4DeSX*(0qp5a}9yN%N;apY!*<#HVaRhcK6^ zKDP4ZJO_PHt^K$a0nF5EStuMdhB z@j-6NPfchU-3v|u<1y#!0oPK#gYpw1X}!2D*qNoDX?V+M!t?^(M!=-{`^&UJ3yfpi|v<`*I$kxFpkqnZhv zxUzVnH&i|;qVbcPx5XZT8TEs<2JrP2YOc@#ypzP3GJxT98*a={4w^kUNg<#7lQ$Cz zC@Lhu^mnpG41+&^{IGy&3VJXJ^40oL@80`z+*Fg_r?H-cNZJZnYYlj)BR&(wWMUG4 zdi))5s2C$aX16Q_Z}iH_C>!9KxtB~wl-w(m$)>-B5?yl@2w*z#j6ECYTkEBJQ9T}X<#be4=gx$M6>v1aq3J2d!xX0EXpz3hs@Uj za2(*9;9;jHfgaE?_$s}K)qpxCEC~>zLci?kYmHi4_Y+&L@=fL>qPHX>pi`o)<}9=V zi?}N#0ZAHElj4WzJ;pGIzxR5(=hU7Fw6y8iw$ZVjys>TDwrzE6+fF*RZQHi(^w)DT*UaoW*neOhu2rk* zuKT$GQV8o#X>IcMymJTGv~2NMV3P4yPlCkNudg!q{e8 zl->$@eZZS_`FtLJbE^!fPb}5`uYMmFw)RlleJ&6Iv4x~9g+M`Li7|=IRG)!R2iHvK zZ1pH7T?4%R4MFda4Uo(|DNIVK*JV~Hf6BK+R>C8nxj<%;FSAo4Jup~|cuaXjiQS)t z4UqTxDNmukrx6wkBJrk?FSuiev#6@Tqe2Ipw^t<5DZyQiCizd5KHl556@5{Ib~50Q zvo}>;*)V^ zaqYEj9e)gNj&z(fIv19-hi-y?+XNJCfGmqr_^|jdfrlSB_aZ@^zKbUQ#nxTQI8Y>o zMsnaDvu35TlyD+jcneot@MU7+LIdA%?Mt(x4H_oDFan>*at6Qf;b;ExGR@Cm{-Y^5tFgF2W~ryl&qcqX&K0B(hShGPjL zIf68APXpwjuIcR)md3OWT9%K3qfq|4Ml)>SlW3<$ay7QGpB$e&V>cgySe%iMeHQue zFZCF1OJ68~Z)w}O*H$J zLyV2ua8EGkt$B)du*!PHN+Yk-N-I?AANm=(5kHyL$P}dmWa{_KJmNpq>@Ej z2(WOP)RnN%XTPr~COx4?Lqb$y4eFE41yP^u5R&sdSpM+$qdb@QE$22L$YW4iu zRtkQ<0&F3>0r|Zp2PmfFdjx))s8QvFYJZ^A9-&u*>DyvLhcOe&p5S4%E{EKAc$HKtCXW?8X^++ss?_VT-C5wv=Ps?-CK}-l zf^Z8Qw*xx{LvLA72Sfj*=Y`_d0OU@BL-t|t2rxgF&zH0`C_ulH^GWU@%?-5eEGd{t3)O87SOW^Rp(h-z8xZu0hx zQPDmE&D*XK4ln@`WR0j#jQ3b3U*i%skMxqifq53@`L4muvaf1^ud3qm~`4@ccG9f^U($qpC!W} zhSGYWB5`mjgYsMl*Jj}48LJLC)Y`eP+@O_~X{|iJGu%4<7=Mwz8Nre4$T@PNQZID~bl?nSz z2EtSSz+1|JQbiLlInOrxbJI;)uihR^yGPdeaB39^i|Nqk9LXF+jVPjGQi^BKcggm6 zE=l85P9{;j0tN5QZ`%b@X~KX|Z%kUeOMkD}zi4R6PtEm-XPp|K4VXS*xXs4 za-s6&g2)#!3KnBgN4D)PhYLUHH6Hx~8Xb#5>KW54q5DSXW3Vst22VF^qO9u%&?@MP zV*5;-`$je}ZBZWA(px8f9Q{woVrjK?-sumBwRbX2Qj=k<%Pqs;s7>ZhqYqDn;^qCMC z8%?>68>$xVd7$anS5W(`2XjFCj-5H$$EpKQe7DR8S&TcSkNY2NG0gxPP7mteaZzl= zk31@Ay|-1Ffm~nN>eJP~H7+CYvqRkR+*&$CiJ_-`)#X}}ZcioeVZWd#nmdQ{LL8u= zJEWy&g~rI}V<8>ts7n4S8Lw91p5*rIhumQ4P=)|4y|?I~GA7fEOL#=Z0K&(G;!_ck z+J>QSOc=VivbD*`_j7-(9XG7Wn7QLLOb@xIb!^crFQjPkpAsy`GnX5?sm~Brr6NH- zxbYUNNZ$q~_VSz;&?@MWl=x3pr*@wITzJi3GLkRJ7%E+8%cD)cMRJq7>8Soy+s7xj zay{@h1-l}QoBS!s{FNjre+Umshb@)gsk=0Bbi_Dci!tT&YA#5^Nm`lu+24k!t0WCtUU=j0*ktq+ zJ*t3?{vam=OXzw4Pq_g>h3k0%7}N+!=S7^Camsur34TuJRXbby0Pi#3*rikALvM#a^>+ar(5^ za1yEbd(_LwDKhv{`-NEg_W3tB6|}<0BQ#VY+05p*6d@a5{QX~`Tx^y93}EA6{BM15 ztZV>||7$z0Mtj_CQ=(z}lg4A`1o$+alGF)kPnOU#k#3W1>>{(n3plAR{G=E}vh%3c zpM&|AU_98iQ}0f=fEmcx{zwdNLWPS9x0HBV+(OZA8An`?cSgxNrThesYEf2P(Nt-K zGv)Xssk@mA3;s7rM|IjHHG#P&vgJ>Egf78y(t2e?N(8xTb)-eV>T11Y(TCl(-J$=E z&UJ5wM#sSJq&R~e!S}mF0RX=uVG`w<{|traABaWxeVBJ{5!pe*${@}0aivW!PCj~= znyVeX!~bz^0-zXF^5CQUZgWt@^PO8O&YvI?^FZ(XCB+Ez^xcr#Jbm%Pw4E}Kt6y2T zdsx3PUws0TwLoG@nlgLfNKkWoQN#1(oV|J1;rkdc`TcK8isgK6KC1*(LLpw zSVHDEr=8@;P_>*)usClz(0hA0CH7i{zEfLR`GaOoU#VE8=+hmpsNwGuq^+aVa`_MK zvSS-wdpjTZ(t2Drs^6MRiO5X34VO}K-9l9*^{i;8c-DV5X|=Ujzu%zMn%^j!AH_PX zzO;84_HImqAe#TFAnRG9>fyN+`U7)3t@;gK}NnVa<*rp+T zT(mGr6gHW>1sc&wAXDSK;i@hV?0&QCA--E$UZ_n;qSmZ{wR=F0ikzX(8s^2UKCI4H z>d0klZB&q3Q5SRHf#6rb&7CQzaQP!4mFDc9>X<6tIoxuOd1<*DUQ(`S^D?-CNZ1lc zclltkrs>Ie#mZZ*6j5?tM*hJaV|WZ%pF4$JV^LRpFnE)Cc2lPXWF?)3RnjSGD)yq_WGELEZEZo$v_W`tkrG{_E#LE3VYqyEX^|1-;!9zd4oL^V z)U#QqcjlvQZ&06}v4_xmeC9aq&lH!6`)SVnJLE5~RQq`L))qX-XDZu*($s(|RN2TDJ%(mP*^rpE_3os6?~Yo8`IFM=J-6E($FEL=3X`$82gGqQD| zx}W6u0!NnF##|a(^j<6ARlk({mYVi(O^U|SLA31>M`8Lq60Yp$7yKJ2mls70eU>xU zpbBY5q8~Dmptv$K`Xz<_>rv=L(dEeJvMiZvIz(gb=js)U=ZDp@#PjAKE9h(D&|2tr zrTd>rUEWud-{XU2vk{1gQVbBj47Evp9B*%>R^$9BJ3xEEFS?_6FxXi9h)MiR!x{}7Kaf>B>L|3#$7;-S6oDjkg({}^Y_``1E<6J3_wn(xNl9l zA3MmlEz4Ge7ZIr<&oXm-YasAnGRSWa-c0DyPL6c20j*qJUl|NxmTJ~ifdXQS0rR%QFV0ExX8hT#vRf4wB9HF)nnDZqn zF#e@n3-U(ObNny zRnz&bbuXIXSy0o1gxAhv6l$k0J(ps0|L8?g(3m{6bS(Xu35#@HSG5njj~mxGZg||_ z+o}ySzDK`eBy$p_HPiW(Lj+9zNBKsW*0T-yrzdbs+N$doJ5l%^12Gc?yHVY2_h{hI zHb8uNxG6>6kZ5P>-N3HvR`{jaI5Tuw&Jj7{yrkVI{_ySWkjr!_VjU=J5RVea0+mrm zUkblsao6M8CLT7FgJb=M&r5FMGw`ou2jp%&coL*T7Ej1(^IR6cpL;K)U;};g2UMiW zum0lf{svp3V*#g@sRAJ)2=&DmKW2)+eIWVS$+=2-_iO58aG0m#>WzO@(uKhsrqVsP zw$JE*xHQZ-)Dtx9zrA)KbW{hH+97-XvVSnxD<9Lo`P<7}O{W~>yPI~%lLN|PO`dC4 z%b%GDf^>BwkViYWnmz2wj>2r9p>*}Orf6Dc?j9I1@uISXnRdMg>MGC#J8xjZ_K0($ zMbi$6$ilDEVh{@JKeNBUA00!`V#hglO)a&Al1WasA2mK4ps2<&iHx}UBl6T~9l78v zlf2**b^DM~Tn-%Ev#;8uxQ8I#B{mEeVbN1%FxQ?3_91S@ipRio==AFmSwSjHkS zl^lhqw4tM25KY&qCR_wGSA;d)0vZD7eAgIM4Ss`WfrRw102|NI<_~CgKM_p46tXN4 zseB3e8tG{}?VEMKE%9EWYJd_cwaeP%OBs$0_(#;1suH$6yJ4A#=9-WLoq8(`KL7ER zwGW`cLIs7}mpu))zpC(7L3E3QIZ4NS0RUTpsb$Gd|0p(oFrhs)@t~!iOcQ2|7mxGd zTD{WX?L4m=%QBZ?k5X8?rv6GQ|MOaV)^V53sF+hJmEo>SuDQ2lO{f|GN;NBmZx8)K z-mE*_X~p&$3&T7;a@8Pfg=Mw0$0518@Z7kbnVR2k`{(iOJu^zU11LxGv1lhg3F?Z= z_Wl0+_q$?9LfNS{VpMh#L_4B&d2f>KBok6v!&uE_XK#Y&g+XTF5Uv2Zjj-wk##YIct!SY%>e#Pu?m@ zSsxLuMCq{5TlDjxql-vGZPWYy??E5JaDTHpr=iHb5oyjZwXZ?N{y*EO)|5qHfgs=t z2h}-wvwoqm3JZd!7Z#_+y*nQF1|L{iWYT0-CteskBPP}EsKkQl`N=VzQVM?IfIL*n?x3bZ8Lw-Fdo52;ihf2wK zl5((N+;gqWWj$t|hj#H{fbBD&=1mk;LFhkbsi-WH4Jwdm>&xt^j1NU*mMt7K>@&`N z&g)KES=D*di@#Cmc*^Q@p)QEUA4Es_WvFic1!ur^s5Sr9VQ~pW({VX=SWAa_wOA#3 zly?{Jik7DE%-gRnbRakcu&(ZF$%2e#V#OrSMng;uDM8$#$E$Kd5HfOA)TeQ?yHIyTO+Z0J!s1 zNP1kM+jw&QP4z`lu~vn1&HIywr}0aJ;Lwf^-n-ya(%dFP2>OhEwKT)6ptlM`WYgn> zZ9cBXX5vrFKu?7T;5sa_r2)X892IpN;FB%GX)e$19#OAbCx?sIvAK5^j5ZAEEzs7x z9j2{x;I7zE_c%r`MzFI~<*+{d)dt}(O2K{%!_pA@U2=;xii5fX!-ZboD$0;*6n{^iuJ0jy6jsHM`i}IoFrNvmTT_tO2*TdrR5=d^I20I&L9Mzy6z5TrAucz*K3(4DhfFMubdfUt zI&w+PC*TYXsPR%3RUjmQg(jd~5M^2P6VUdi63|e3ESGrNxYQdU&i$TV7 z*b8HS?VC5FsUV41m<;aDx#t`%M4k{h8e>W>xE9@%F4+76nsD)V*y=msB^V5DUAXT^ zNH>mD@k|A_BzG;(sH}nfT5)eLz{#Q#_jv ztc*XJ@gedBn<-`LNIZ+Kac4_`7dCZyx9pfVDLi+yk_?_x^4AoX6h@XKWXlXX=JlKEYSB9H9~L`R^HkU61*Zh zSF&uA*=g2;Or%{p2+Ze^Y|3Wbcz^!JEVNx8Z$%Mq7*TcEQ=WI?fyOr3eF?#umC;tK zB%Pg3$YUR2j`wXyK)~{XU=vHM?-6X}b--*XE?=@2ww(#^`|BHZ?r=Q+>ieRd&mVri z^Qc9p)j4=dh!_dH$2ZPwcx@*g&@ytrvE{e9PRSGl$5b`$O`0vdik~jF4~G#wyRUF; ze(`00dk;S^%0Uhuq#gN4|Orz(PyCW%8?Nr@=Pf>Uc-VIzAN@<5%8+B ziJz#ec4#P4VhLjCnyJV8Z^}$6-}rY1BiL=%jZ5aP5~*CP=GCLb*bCC5MC4ex!UOx0 z)w4X`7EBP5I!~<%o*`L9FO*hI?o>Iz=^jXG=Eh)yqOrdT1Y9NZ*YdzWXtS&{xacmK zfji=dYsz(Ef|R9uP=l&}JM_~1+2$6cd|$ib&N5=DjGj@#za^%!ljX3yqfOVrreT}i zTa16DY$7>gzGZUxh#1mwxw>>akPu}r=il4XqX*spm_UhsEpJZz;lHsJ+xbZD6o1SB zltNe_+ZF~5BejWX=zVS&G*F6!Rzm$?kBauvA9P^gJ><=HR?aa5_q;%ulY75IDGfWE z8I026qa*SnLk1}ZNvn6Y3+%01_dB`6UFmg)@DonH>tZHC!6P=)%BNu&r?jpY_nv|C zd#Oo3DDq}z9h`HTxiBYCrK^pN)(9SiX!ferw)rSECL1&rkjX(S2@F>+>pyFJ!A6l) zlimH6IXKO<+kT$&@?PmZECs@L8iXL>R9fW0`F|7+NbgYo}u8cDiuj{PsC(%msw7sanLc=$Il z>79~jaW%8aBcKGvi0~{yg~;zq|v*?h62BLn0!`0Zvt)#X@CvSD*t>*hnLk^Uy48gtoj!}dCZ07yZWxgYiwGUQF&f-0~3bUN@UC?wb zViKrZ(Gs2=v zdzThQ_v`fomfRxI>vWdFhCwUkN?4j7OG9HC7CXtpm{}zI<6uv|eFYqX0KfK@;JpBY zKJ|vewMapE8(Z?Pwfo5~ccS>@28hb?JzSY+Q1PVR9%Odze#VS+iIR@q+OCfhxTL+@ znLWh(U)biTxLFcbvY@Z3^|ceWvJ2;B-N`Tz!;UsaA72W3q!MAQb(M<&ESd1ZDodEw zKlsRXq^b$bv<7|t@Dw?fOJIZvF{8r>yR7$!gnS{ALc%T%x?IFy30jQ31%o)SiR{xs zM%tLMkdFtb52=*=40=I#mdI0hvU{|aD`nD&CVd7w^95U1t7DkSQ7UzKCG|$Tkfe-|6tQ)H z2AW;P4W)EZJ}T+IgZp7659%Mhf+m-Sd#x|F)&01GyDhNS)4?qfF5p0JpyKc#h`rgv zOz}!UA%f?Cf<-ZS`gW3tYH!`j9S{w1@ZvYz$;OmY%YSbJ_E9%v_&}q9W1|cXcRbtR z{Gen{!t}#nLJa=tW4UH(G0n@$2{t9jn+9ok3fcNOm7H7k(zIEPxngs$2Xp1y?DSIH zX>I_gvFjf#+C(L2*2vD1IgiXgoU{yCGbI#{%675`m>eM3Q>|hq&o?DxnP4SdoDP z&xkP4@t=T5sf#de+IT$}w5!O^oL`tXaF0RJ8MwrTL#(XiZ=4~#k9&{k_wvpB=H@C_+-?W7SX{SPorlK8d)6n_aOXaPRGo2sIkc?lRlSV5Z+XV~LlACByE zce4faeo%MB(2+RNfGbc7Qp-Wj=pF=iRqo?ow+PC;1UV!4rG8Zz1V{_zlyYk?h4K;^ zL3?&vn&wa2+ARiEvU=N!%0=sML4-o;o4Nyphj)AIx(SFOrIlFA&P5GlP&<IDc>+FM2xMYdw2lfRCv0LPVdc@rv<(8D>D=h@T z9kp(%stpVd+md(67M|?oHym}WCAaTeny>g7j>+B1v{9~T+Ns~}dg6iWw~7t7-1?$g zy@F?>pn3^5)lih25r?^mIg0%CmP4mi4IoTYo=;PgmYzH%>0F?56smc8S{Hi<-kO|I zM|WxV>H^}7J-e}6%1cX9Bk0%WnSmKZD;I5}T8JD*$k2D2-3<1lB?X{L2Vihx2EG0T zafGYl8;v0NKxN2)T3;~2Q=I{rV~_H8A1{I7jN|1FiOGOB!T=AkK;sepIlQ}>CFb8> zGLY}{m$_GVyfsx_TU?j`m>~#mDHSkr>;T3x$g=oUjM#joxJ4v5h%fKxrl&?%DQjfx zVXkM~4T$6_IG0G)Uv}L!Qv%I#CDtkZ3|mf;Jzk^JCX@x=n0lwDjH3DtCT;$r3r*xP zqMZ;?`e|}u74I>H1^<*G=f3rW6XqA0VhNLQa>D5 zutjin9h!MBe^g)xSAJiMLk7M$w2Waw;;LGLWetrUz2KD-nV#*_iJ<}k6tGG{c;zRa zD)QhfY^_nw&<OXRfo`a%5yB}&ld-l7&6_gQ#D$UtC?QWt z`ySlO8@B#J+dfk7w*5&iLEo5d|69oNLcMFp`2_UOMS0idnCh#CY8o&gde{Vs76}|a z^jk7wp*_rkBCj?Qlv4{+kjbEuSVshTMkA!GHCd7p;IP>c-f|JRKZ^I22pFK^d&@^}JtOS8Ps6XjmnzPjL>E>w0n z@E9k)<}p#vwxH2l048_~jbd_Ckp}20CM0Z!Z*!S{cU;&sSU509nhzD67Gp*&1+6gK z5!77=HLOqN6yZ4kZl>)vW|B;`%17~mb_Q58t;}ii>Oy%(LJFO%S__YqPMvH@x`Fm> z-_9!zfaYT$6skP#@XCbD)k5t*+` zNJd`;lw9ah7k8Ief!Vm8bTAM6wpIQR8@psLSu|B-BzV{P)W-kAh1W`{uaIt|upO+hbRPJs=edq!PbZm$Y_Td}Wor?#)tkVIc(B|?yzwthSagW@kqi-<_3Q_Ex z5~IB)M!F*-K%JyN@VwUZj{9gZwy4X3lmL8}9;MH@8U<-t?KzHkq=`YX7H-%bx?aWo zpcCwnd-y)b5@g)a$6Uk9M%+swLq*>wq$NR;`{cF-{!@^f(OHef$CL6By&0iIV`HjH zZX_e^_%P(9sLOhZ15E@KoGCdhA5Wl#Pn?gK7?g%M1ni&`zbxt3UbXr#Xn7XY8k8O@ zr4$&UbAa>i_)|yDL;9uJiyJ8H(Kl;=!4w%IAB!MsBHYN9a4JX+OP&`H^f;50zr#2h zShawKhg$^|JWtQsv^HpAcC*`?cS2(g@n|q~hlYE@5aZB$XD#P5>j_vcX6JjGqa6HP z_G=3jj}RqCK%{(rA{e9Eia=xDd^}2{#Qo?pUkrix7c+tRc{#~lLlo7&LO3Oih7b!; z1JAofAwP#flC=FcbJITFtmN@|YjF?Og8(x+J$c)gShX5%v7nOXZWWq*yE6qkh;%a+ zTCxk8iB#_H6WD#PBxJfd38jD%B*`F?YPC^hECKuz-Ey0^w6W*JE}qM@m)o1QK2oV} zteaP;`nOV<@~Db$P{p=tayaW+;tsVrucz}6V}pL+8)$cnZz)AaC?f|xsZhU}ehPY{ zg<>_cb_&l)7-PhDdKQW4#%kOGtw+<8hI);Jky)6AoG>TTk zLrOD^cXw8fO>hB#o=0cC12(&&@myhYP@k)EgQcZT1RPLo#|}RIeQ0SuJnf$RI#JQ6 zJ_itl1`{`5U+n4*id44-H)Z$w{et#G7?ZNQGz8F(fp`(Ja-%C<5iPPm5_A8k5sB%` zU+9buR~d#AB$f)hVPNIAWJxhu{&vhoBn4ro)h>Q?q5EV*&S99%`N>webw7N7A?_1KK<)tIT3r`e!bcp zBbeU0%^XFu`{9o%VM<6rvir8~N`K+NRFq0>IXB9qALZl_G>cEtr{oX7k< zK&E3U4)JFw`k+{#!q2oWu)DXw0jx)d?9fc>5M$4?MH9{4lf)KqmEGCFc8>na_H2LV zkDg;f^`_3lKmn7pQ?y<}%Xtjw?x9jI7E=cc@;ijJz5Bwz7pw24qfV=xh7%cd4k|*j zL4UUljBE}@RiWonx~qss8sr3r!5@Ve7vL`!(mtp8Ds zh)zUrko8(v<;uXp{<>__VEzbgrJr&mzl-?F-i21fE?)S~;o-Jl*BysKw-iw8PQi*Z zpmv5+v4mAqFM}^%m`$~XpQ)FeAtF^n`cR_lc5!z>6X|EM^Y7LN#yJtwmsOwmC}c_r z53J@XMs`d8)V`5Yo1hG_i?Hu0gqbKPpBVWwYBr|lFhzcDh73&9<^Ft0y~{VTx8<>f zIEy)~Tki(VI?3@zN6AjI`_Z+%j3V!HPz)wmKAnh;#bJGf!rwy;C!iynGWvqDabq*@ z)q-i}d=~W{1#D>Lhk+fIrE{W8GTwxJC0m2{K)>PIB1efh3%IcX;-YC->dJfC_taC@ zIq9^@dZc0260wLmoI#^2)dzFxp@bp&4^~V-A`_QR8qY|Y**0K7tpn0&mXns?bkL)k zS~qnQoJ^-%^|>99dkYg_l7Rp+W*rH1af^5K9a*0JX%;4|_qK)%mG1*t;*C+j9+1+q zEo8q{1-1x)yP|xk#V{`dF3Kz?ji|0=+kWFE{WJ0#0(|OWo@|s(ynap;vyh!$Y>8I` z(!zEm_>Xg#?gO~|%QeyvC|tYki(h1#hS}4Ui)ORTUA=?g9f}@fT`)}8_sSY1mwsH; z%Kd&iP45=6fnMz?-E0@oYdrX{rKB=8lKg8!L-Kx0W`EU)H9z|uOn_V1XBOSSwnT8P?zs>=GG`U z^5%qCqnP7uZ7!#zqiF)IM~v@lwmnFhJ5RS_psAQXYDG=~n&wBjom>sw!=U@-4qyKa zxI%AvN2mgx5b=I4kpuKx9tKbJCtF6zAGD9tZycV+ej0X3A|4d7; zS;EN}TtRF;n|opvir7B9Sl9xGk{8^ppuUxI0&Ht?X5cKWM!zDDf1hpq2EOwxp8l0} z=GqOB{f!vLX*`rgVO=)v{&yDsv@5H6y}TSF4n0*nJ2XESWx1$eu2dI@4#Y+I%&fgF z$V>OFh;fN4q7R1$Xi&2F{;mT9!Vle)OW26`%}+WhBymAwWU{kp6-n>KJI4>r*J7mI ze{$E|HBFaW13_!daIHMuxd4qAluVoonP)e56M3)k^Xet-e==W_sV?QKYebK5Lueg><5cVG`Fov@%H}v6vY0*a z%z26wkV4R|GoWC2TsNOkyE~Kgn*r;>3<)tkx1&ArZli&nA9Tj4?jy_ehvt3%>HaE| z*K(!>Q0e!GTIcd>!!XsR7PsIAnd4KbP}?zp2+hj3#V`pD2Bz_plTiFV0`snIe=Wu` z8nH8&^9HA&;Peo0(?L^>g0RJ9;zZlm@D>y1bYi+r;rDP`rz(@2X{4lY*3s|AYdje# z*UPCuj!Pc`B^WY(8BIhw$Mh=AByJ>RaAf+lo&3>2`2V6CW(G^Bp%0-%|aJ zYNj-9_wXc{Mfq>EBN0+;U&R0HZ+2IhF!wj^FZ1KjUnu6fO{`kse}WNGB0J49#q}`W zAIPmwAdCNKRf_{{`TzN)3?ul9Vfq!*{L6vFzM%^$s z)H}17hmtx&Ln(z2jARtHX7w?^4r)7{C%)D>7DhACkh=@279>f`pCY9e>=%lavp7N? ziy+T8oZBNvKSWfjXOkij*n@L+GXUy`YZ)-WwE(cD8$MZ(hKDJ^Vdo;qB4M}y8wf}D z)1Z2QHPVK2GqSE!Mb6|yLy!YB69f&P`yx#^6CAkK@?(Hs0$14$Cv8aC4O2%Ta)M$()!bn|VPIYg6aRoT z?Xy~doz0#1Nt33dzM$8+uc2>(;{ZUT1-MioOpQ{(xpxv98Rr9Z0kD~Z!Xz_m)D}?? zuqM~uMsOI-=M2Ct32uOqMy6KL;#dTNIrv{y0*5e&(8IuE%`&ZioKto zgyBgL2xwgi1iv~K-+g+$9!yYh3ta#OMo0&+RlnO_7t@0%WIvuE~)Kp z#@KSuhv@&&Ubf#5_2|(i%WLuWcDGiQY4fIic8~B()?REcz8c^BWxC{3eO~kf*n~|f zT(9=7GF+OU85H>Lpt3fX*#^z`c~DA*Nn}#qk{A#=;PkaLvb&3Z7y56);(ZkbudhwK zR}YS_9h&jkBWxblMmfIhUsiMDY?%F&5T1lRngOf`8&7V-%pVftiPU%^BpNPx0l84p z%;M`7P+MjWrT|we^0Xeo*Ny^!oG!G?A-pR49qbQYZe3{X+;pdnE{y>g7j9H<5x`gj4 zfcC=SbftR5JY5u&yrF=MVan|E3UNj4UUZR+F@92Zd^5R@a~od8r}Yenxh=R$r5Tnr z&b7s)`B*|su`SU`y6t*W#L$rD$c)*oBfXzZWm&;%4s8OC|2j*@jBC=}-JGIc-io+Z ze7XHm%faw|J3s2kqxq$^YTl5stov!INC^L3rr+d}M_60`JbeY?#1~0+$rCMhXhu## z0efqZ^wQH_{~UUI7vQj1saPT%4D+d0t%_pG&uW8gWQ4tP;IaozrV;ElgsuOZt$L5S z{ixc+oU;GmH&se0GwnX>Aw+xIr&Q1VK~L~e^<-b0l$5D1G1lmm`th$iNjb`@f3(8u?61xijr1KQ+j*+iG=13xn#1jdo_-tNO$x+>hUxRKLh`=Qfx zKTk z5T<`Vsr5O~wlE(5 z*8H`dmn0hePSu}!vK7SJ*ebK=yVfCi;Ou_aclWKE5}LH0VfeBn;z0O)pVYWmx(7$B zg-6tPG)SpdPJBH~PW{4}7N0*mkZgK=y*e4UXK*PNmrN&1z}fb}v&0N_grk$hAg{;Y zo)Y_uK>u$wj!@nu5#smXt>{Bi${UOPT?^5 zyT4Hsv-Y_@euep*I2DT3!osK{#BhY$HF;m3{PPwN4gC4usl!FJOU}Fv&~WYmJGKtL zht=R&&pS<+5pitaG?*gF?X39@M$vN|zWa3z3c+xFq)E)=EYz>_AQsCWxcApvW7D8( z4blFa5VEpgoN2wQ@b;4^Enq(Id0%Xd{O7)Hi(hs4k5N zw3YF~%lgHh&6F?R%>xAAoH-{0{l)I%a#k7U!AZ?iTrAVQPWl`EQ~7;GvVJO`im_9$f*{{a-FJqw_TDjjX zYjSY_-kiUY8(Wl6=zXGGZ+fz;`u+kpY95bEz`+FRA&cC6X)+k#iEN5M{GF&o69%#X)ru4_AUz~2(IevwX*wA>Ycs}^S zK{2jqOW;#yO&7_eii|Xrc$b8cr3+sS>Dzlk-Fw*dIw5H#tc4r+8W@zySBY~2obwG| zX__eo&_PapacHzh`l8J_Huuwnzl;?crp@zR>KFPOjbf}iyQ`e)B)6h&kIiNn+UeA* zP~6R;E*diMl&aS<8Dl(wo5MJ>vt~2(`DnmCGN~Cj?)+4KSmE{T5UBH%5c0bDzEPWQ zKi;i1@S;8Z6@cM|iq@3{&Wd8surtdxm01;}N{0EMYn6rtTD$2gOZoOwcX{Ck9=X>Y zaxV6K>WhSjUSKV=QlB*{3>1$kw)XVBq5WwyU2qiQ$gZ?8d?pbs^$QJ?ifCOT@Noj! z*a5=TKxpm5s@K$D<52v&$G=NusE-; z`PLAnU+qKftzm)WX{Gf$% zWQ9{;q`K@BsSy4=b`HZWA;m}KlkXQnj&s_5rP5(%qf08Qc%X(PIbS4$)$-Vpw#-0cooQU%231ZR54(oP@b_ArtGDG+d5AlMFqpnNRBHIQGf-zn0{{h5D8gU z1R39blmap|9!7@3BV`A3)T>;5MJ``bvB(M@St(xiGIt#H(O*^1ch5}an_~nt8v$~N zG-aUw0wMdB__X$IaDrFSO#MU+;wFBVHcg#&);kICg*)|A=tq1d{*Z@T9*Id#B_j`; zNBJOtz!Qccbgo0YCfkkr77xcb-Oq^+j1IQjI!;QzRRrXK-|C^zca50-M4Wm%x_*3M zFGQbu2%Iq*lP2(R<@pl(X)X6LscNAlZT8?ZlK#ru?Cq?prlZ9gyO=UB0PoWj90aDykHxF5RYfiFQ& zu(g*f<0oQ24{aE>>IJB4Fc!V(37$WK>!rr5?{&K_GN9x|NhG{8t-`j)=4^?0XG8BP$|u$LGqpTuopNzOhIx85g>qWe8$o;KX___Hoc^hg87Eu$`BpEou{R7#s&!j zKxdrJoq(coN1MT^Da#V{<8X6pvixdKU} zgp|frfpPR(RGfDsNm@!rMd=L#;j!AWJ{oKnDt}~>e=wwRhh+eg`3Np)r2!n$Mi3zn zVjqKKx~1){mxS0e0m%9zJfMRqRKH?LI0d90me~>dc)>#>l zLlX>zNPK7iI;N`MDkE-@`cfQ3Z$FnG`WHknVo)A1nanllRpXu!YR(VdCxKO>oL~*f zAq!>&d^n3X3@sd3qJu`jk88{f;$b;W0zU~kzwtKFG=I;6*#@;D9vw&+7j-S}J`NXzu+w9o3ZQC8& z>e#kBM#pw~de&V0|2yAYyf^3mtaZ-XRkdqZIrNV=SF|g^IhbRhX?!7Y4hF}|iU0Y* zV2+LtfTnf`fjeV0Zvc@*Fa#+F>hmdINJ8bBE(o>7$@<1qXnYn0x^pj*sf7SX*zgE( zP8i4c>n6E}V4lVP1wP=f?k~|pG@un95upT8=7>tv1XY(Nft`1n|`E? zQ*3F^(&Yy|fbAFgB}l@y^?MrdFEG zDsg;vGu;2NADA0Eq=!^v<&~j$<-1ugV_8nGZbAWgZhkf)B-cc3T2^;jWt}x zH0K3!z>V7`19fDmwKRTF4qnx31vo4^@P=c^$vu+#n9;^FB#md7m8F!f127D7S!G#Y zb1+D=!Fg!<-zIW1Sv0{ep0`RuTu4}GYA$M`-eVPn3Yfh&cX2O|k^U1kkJ3W1(|m5A zICM)ZM!vAnbRbZ~ab{;+T)Yuh1=_uAu@b;VdtQ%<9H2zWla`B$MuV6m^sh1peF=Hq ztzd@ZjL`4Oh+-u>zj;r9$f=q8F&H#}Q@xSlRZ<;QTz6GeL;AwmTZ_?KuWL?>K`jtm zdr|z5k*~E`CKpjzB*R%Ky0-h~VaKBWPFy`z#Px(K7v7JtIR9Y)gWQl-V%85#HeaJS!&8 zMk8zBzwKZueCl{A;xAY4;&PqjrNciNR=&~bx0d-UakHZzT&Q7BsUjYFB27lbYRJZy zuh&?-bZexy;(9g~!}W2|glsg{)R6HS{Xn+iR2W2q(fFcQ_|^&ch#4rS@>0nu(Q$hY z=cOAXkz2IC6MFjzrkpnc-ZB8$ zIUTM8XQ4C`%CZ`x_X_vG;|U_4`PJbKxMqpcfpSq8y?dTnX&iL2O#w)LWol{1Z-N#$ z5>op4kC;5E$8Uj2xEV(wGPu8h*^*CpvCzZwfKR5(^`Wx(p?c{`g1;f8JHe%EBE^hc z*@KzJ)|{6a%9(UY2?%T5W8AOUb5C{lg^M$09vxeZrn(u}Zkp|?)-*dV!2X+D5|>`i zaufKkhB+_8IM*gUc9oqv!%l`&G9+yvLWi1 zwKEk=&8XE#)V}CaH4;>H zxW+%ek~PDwSj0-hZ{%5~&NDDy);@ztf|)4~{ESmi$wOiq=XR=#Y49f4k~7PrIQqwb zNL`rbX+|r}cao;r&Z*hP|0Yiny#f~`>zy~InoJ^W;!8Qrv`BxU;sm_jjRX+^1X%bi z<@WVe*vMRh3&|h|auDj}$p5gK$-d6BG9U?gN? zM_YZF9X6gu0V1*-BI~+e`jS?#C@QamjO(^{6A{LN;;-UbrnUW$62ixeA0lb(uPP^G z!XTnhO3dJ;QR(v{u1Y{idxHB1B@{YaZ^eumj>fgjo&1$PRtZldC#k1@$OWTr_prSx z%8pSxF4tZ7?^cw~Q_%H@nyS~;w|3jVAB~au(NC)?R&p%H5jarFT@-PyH1aj%aI=%; zQ$CTOYGzpK8_OdWooUaNEsFdIT!l!ZAd@(a+Vge0Cm=pQee3UGCW^b#9<4pnDgt(t zvq(P2W#8|ADTPqK1t!z|@Ouk+I_HY@1r@hvUlcD*y<9K0yFQ_-gHa!WrTeXWKCfVV z%Q5M(Tx;@`M=)BWCB@iJj5l6gF1}MIcGZkp0F$7b;;BoVxF1r71^n%6gyQ)hnUXN&@PQQR%zXZ*Y z+!tUJcP@N9TpFQ`A7ndU9HC6)bvq>@uBkecd5PC&*|mXs?JeD#mq59Ojo?H;DtaG| zHP7rG^ycaY_IZKmNB^miRN*+cUs2O_-WB?1$^%mJ z9-I&Qfp~JBi1hnmXk8WO;kJBQwab#I>>A5-ZtOG-K!ImMzGuGc?2o~jIYj^d6P@S6 zdSG34^5e45XV$SEkC&srRT#-(m`8OyDW&kcZ`;KGojUcAj>Gjq_)uSo08&48yut=z z$yKv);1muq>pUFi`R>LuEyJzdJC$kitj;8O&f!+%PrB#izOC-BXw{qa7-uq?)}?Y9 zjt}urHtLIA!Ah+O{db4VZPTMYsPDSLpQo;+$+sEbVJN!~;0lj|uK)?b*B4bpd>e@R ze%=Y`$<2ywVS-ThZ>*aS9-03s)3N`z25nYucBcQ7>2!2Gwj};ftBP0r$h6;h&t+rY zst0YIu?WJYK-f#ZT~+e3QH^p*#);ZYIRp3o_1?-uMa$wr;&Lx7UE=HGvj zLzr)O13i^H222xkkzynEF~?@0{snQq9l7QAq=()WL*In4zV%|n%{U*;?qe{rF84|K z%j@R@$K*XrXnNOb1V~Qotlb8K14?nSP3fP){?fe5Xxa06GloY+QsnmN&)HdieFc);W%hG8*(rL1jxN9z9iuRelIWh%u z7t0hxs!`eWi$$r@6DAHSrw8!$ZEl4p6}G%LQ}6pEgjD!;UTVx)mVNW3>+J9xB2*d2 z8LrUb%wt(`Z4)@G{&E8>lQZ$kc9FueL23*!N7*$$bnZ4|VE6`ffrj|1BI|NEqB42| z2DAcUFw@t@w6FghaaD?Vq-rg6#tZa7Se}&*Q#NaP5u&QO%E>GaiEM;&CGvtLQtgMV z1j1Ft78UKHuYL>`moSQ2fz^ikhJ$%6lowakqJ3iH-XCpNyd^Vjm64C9m~M614OlBY zL*n^=sr?q%PiKo|DyOB^3|nn?lMq5_H04{Z|BQq`UO5y!cu~e(Ao&!jAz!|JbboSGw>EPQ%;rrG!Kw9ju?P)y-p4&>l{vz)q03jrOXdu;(BHdahI@|JoZyuf~>(-u!?G?fqVBl!G?D0 z0&%dIrI{)yr~J{@T>go~y32fsv1u?e{Brh-Zw{{s#TR24;hFpQlKdMye!Q#bS`y?Y zx)ym?JPU1S{#@ITI(R;dS|@-Yc${yYSqJmmI-N-6IK|F71VvVVS1vrTvgOf~^VO1+oT* z;>?zpF(c|eZvaV79UoDT6_F#__t)<`t)r{h5o%98bhzebv0Z@ym31^+RqX z))|t@Gz}_bKu!CQR|DZvE=X0kVGKJ)`K+rr&#+ib0hJ?E{b)CJd`rP=k2{4i`~9~_ z&d5X%*O5ANgMy{NNqk3kxav2gVx>+-jvAnQwJI{nC6TdK`$L{Y%^*3sr(wipVJIw7dMw>V4uTj5$RbpJFLiwxI zpu9`fo?|Wk{^Bas=#qa_Lm9;N*;2--Itn3)qyQHIUecl9 ze8P{dl02$~qzog4j&O5q2jE_MEFhQ})_XlGSLd|&NWy9l;%+5mO38^3nhV*VPJ+#=KJh~#eLx_A{DA|IuK<+rP>lQqMV;6!O zLs3Tf+HpMydnSzy#f*R4jc7?tG9x6~35#T}=KKk5v-W_X^y<``1*ro`PjcJ?I?jZE zNg4WAWFusiny0iN1LPp2rnyaL6Dq;C+YnY^jbY)>GJoO;t#Xt{R-{~oXk3_s)V4v^ zCV*zM=P(YvK$GGO$wY@6r8|6}y}6TOIJ#z5)ZB<>{+sKHLs_vt3hY zWr3qu_Xu?KPuqItTI@MWmqaE{k3&`T!GbNv&xoHBkJ43_RfYJk(SIuE2gkvq)}g@< zaxZm4aUQP*r6QOOvqNw+X)F4df6H|8WMt7V*TE0SBhg^N&Oi0QW2y{4N?dZ>4L+#% zBA}v^Cf&!23?)xw$bEyp;Lc*}6;^WO{FIUh^~Sc!upD%Zhhu;QxXBC%E(^fM9sw7} zDxDUfPp5rDAgSSchNV#R)t%!78u5b183X9^TDZt+#=Lo$+bA;TnJtT!Q5B9FTkANW60x<&(H?-ecrBb5`C*9!?Vy z5^&Bv1$6~fW|$rsSQ{uBP_kNETBj`TKbLAQul}SQGAV5hH*-0I;VGwv^eT zd@7$7Rf9X+fZ8!rDB{_1O*mYey zKGK2@wt{3zR-GWXU{6yj0RFsApG3(O8jy#CNd`q3FI2O~7IpkvX+1@aZlkOmf6PmH z;||q-$1~etI>O(Qw~iPF7iuh(QN?e?(}6F`R}-vgg)5RJCX(?24?4W8a;Q_ zPjQvGQ8(4O&bcA%18D$@tDv)eZjGZ$_lWeaT}EM8e8OAOGDm1HG*KfPQq-0)O~_pL z=f=kly>TMn7)ep+Tl{kg6n5sz+OD}o?v>4zBuu)J)UV(E%MF=q&x~zEzXUBYy(}I~ z*4{ZgjeTH?2CNG{Q#X+f5j^+hVef#CGpnHMe87bXfpYGbE~dSxPym!ozp_Jv(E*MD z*q^asAnc`FVM*$k0?Mv})oQH`tc{d21_VMSM5@i6yTN8DJ}aeuhP!U8)!DEsdOQmE*RU zjW*~Hyw1E=XZ;r(Vea$}N5heLC)*4iz%Eb>1&u@I8fzE4i z3m>v{k&D?ozVe{KE@kTpl2V%_Sg*={I_fjwb(&Msem!3(nqjKrp>AL5+@+tsE=(1! z5xOL-)wThzFz5GA%jCX-^IZGx^9SKM(>HIyAZ-t!)XNPnTDbkXa~y^pY`46`p(d8> zWfi^3t|VJ>Q%*DZd@1~~QGk7rj4hEXXCGaUK$kqleKlJZ%jGxUFqv?p0NI%y7?W)g zic^YWF_ddzr|lkm`GrV1CQ_73;(onpU1~sDsbS*D5}|Emo3S5aN08~5<)f#9Bl-r3 zrv185Rlr_cGq<~T>M4#I4Ks6YxsrCCApyh6gIv|k9Pv7X=2uE9=H%kKukTpxJ@%N5 z{X#zT7tiie(G7?%cs*^Wy#FNqt}L)E-M6)&f{b=Q|3`h1|44JbdO@dGPOJPEl@A<4 zfo?ok`%@@Bo?c%O81MGlBkrM4-RUPb@jerWMbi+VCRz^e0gK_i z@46aRe&erVCUZXFYuOy{xeU0_@RBMC+|o_M{-(+wkwJQcCAApwq2C;PmYD1Bqp@vz z_EMe(MInW+?~0qvK@aJioW~)*lcMmU)n^R&-S1goiUl)hUonC_`@WWcxe*+nf5i(fm3rz4&(Cfl( zFZZ=B(TZe@oTmbpoo*|%zPhp!LXs!~Gej$F9SInq=auj6~yrm}B`S}r8H30Le%Tui4B z+Ib^%iRRi+2fQ6>Qq-Q4IrtcXc+H~7U4h71uV0I}Gl;RRU)o9Avmru;*bV^ii$Cxt z8r3?VPmtaiada$~s|51I5>oF}t|9%64vEvoUiV(&m2~sYBP)LD_R9~U>_NuQFFSdG zF=FVHT6k6>`b%MMaizkEChEW=;U=vr$;u!qAAV8d=c1dQJ4W~dRs9Y_WOU64(_aOB z72ne4#OX5|0%_ol$bf7MJ!QOB%Y}ylpkBKjpZ}A$b8!5ZEgCFLEG+-Q+w-)i+_yN8 z|E2MDkYkw)aCWw!N>=7QmbNKwvCV=dBcmiqbrGkjeZ3@|GQO#jD_QE~XDyQAaHMv|Nhf#bUj)Zmo1l=e{MQDM1G^s?6bTFh;F=&Dr z1yY;_UNO^l5a7Hq{X1+1$enIfubXhJFY8{+z8f+n%+w)UkCfiXW8urLfiM< zpRyy;V<+(%Ep$(i%s67~jGx3(dE)?wWdy}gF&;h^D3hNdP5}zDaAcT{ve=eJGAC4G zInEbh!*(({B`^*>Y))CoHO*N`{gBf3%!g%luU|s&vFT}i?LX8u`d2+^>k=CJu7oSoJSthfq>*L~;Kliov#Pt2hRSdCgiaB} z-p9So#MsBp7QnRn)Q7_Bh_(2G&53a(K3D<_N^d?Z!X@or>c^r-A#JL-*fyEbC=St+ zq#(mS@G*ou`zK$n#(-ypEsT?(0*eO`_+o7~n7e59Cd+)OR1m4c zNlo9W&}-6e3DhwccBnh@zV_JF81}Ap5}*~a9t@6N&Zw3B!%De3u1}o!^9Y z1@z7;tazp3U>0>`FZVjeGQuQ!R8PP8%;7MGovx#7qcB_oD7S~PVi>!P9^|IHp z8$>}3<4;y_FwNNt^;amHi>=J(q2EOn}x8eAtGWO zb&GE)%oMNx@RZ?XFA6jc-m1L>T7|e72NVUhKVS$s#A5PRK>`86L@HT-eJ3Qu&mL1w;IkxeEHEc0W->{>*Rbxvy-QOm?akoqOcbyhn$n5BoRM7@z6Jg#(`*d^sAveVFOY4-+i4B()nzCn?vra7pp=`n+4 zqoouWgBGvyBS?DbVytGW!R_)9QBApC^vwW{Fs6<+%BVnoi%i}4ekDntR&Guz`PHA= ztN>T&kI3|XQ3VMerA)!ZzO+A}p}o{8WRfj;()iCNKVvfYe0cyc`jv0cGDK_}J`#8~ zeQOxTPM7=ZXgB6wzEBcmXKN+$_XbOD5Dq^Y%C*;cX%mMEL|G7s=)z!j2)-mun5tio zx0l0ZD)C-4GCS6A@J)sri%l#>QG(!I8V(Lt*BjBR%sT%-6HMV7`~Id{F)N>=Nk?N_ zQ6M`)q4`Hz#S!#m-#LcsBI3`_$t8FT?QZB$wP2`Z4b_gm7B&0Vkv`IpI5pT^2H}NJ zXmr4uDdxT!BJEVEB7Tr_YGV)k19|y^>7{;}ECB=S%!*geBvwkV%t$^CpWN=>P4?kK z2Imf;!};%Auq#6hnr^bJVf;w{eZo>$d(8~WtMaSXiM9~PG{{I6^c6Pze7~V{E9jep zhuGc0Ya4~*dHk%=ii(Q`xrVUw&n@yc?p+MguceK|Z9dssd-ylzqWv|M4-mGRX7bg) z0?C&eO_3=soy31_u~df>!P9n=1A&Df+r8cgErJk0mrN(t{e8?D7~_}EdDG!1Z&?p5 zbdC(VT^!r-vK)=TWV?5WkIh15O)5s9(U-JpBd@*yxOjx|@P?q?xS*8S(bGtjn|{vz zkHlDFX@8myL0DF1b7uaWo#li2B9_Lf2sM;Sx~)`q$Y)Wa;}W1Z$#3x4P;oBr`vEbZ zlR?H=lYp}g)=SiI&=!DR(+=8I1fziNKm@oAEswylA`khLe`0>Yu(3V*NWC?rQ>sE&r_5gyFGW{{k+gY87dixnl@(kS^5CMalv(ae-+x0JsNgL`!=WSOQ zUiaGGz_Ej&<4Xw&TqeQ=GaHy4n^i_<{hxE2u1o{Zr}$bq2kd|jloKbYwqR?mH~0$` zpI;h^x(cWCP3WVfHMCEDb0g2uNLls&A_@C%W#UIXxYlv7uP3_qU99X8pzb|)Z-j|y zF5OsBzM7GG;ud6g>r>(nI+o97YuYoA{5WBE35)85Kv`zIC9f<^98(bR_7QbLkTChe z=9i>XGixy^tqgNZ2-f?6HyxNE!eq}vSPIWZwM-nX!i+iy1z+o!m+jW-ESDg^^JI^} zmLwXzA208(`>SUJEups=1*Ecl`$w_`!=yuN);JVzMU-*Y!`RI<4OW5SiHLB)1`Xd! za|F`+mcpL_{#V2g0n^fh>wwX-;Z7nm?k;3A4FfoiZ@86E`NjW<7dZc0ou8S5h4nx2 zf|jgL4iECqsb&K@Tz3z==f2x!fn*w?V#s&FuB8p68WT z9fr56AujySLVLUW<{Lo*y0G7MLcRh>wE&tdU15kntVQkZ>6SzaLyp3`SyNn(l>@f8 zF`T5a0hbfGjIBBZ2oxXhY`gVZQBMUm@{@<jNNEawEQL! zab~A-VLr94Vx8As1kenT-i<}?d*{5;duM>cOp8XIv2f4i9!LnMX4`3Ea`7p0+3C0y zxbYCx+?mzp zl$<^VYoHKY-v-VBWMz%I^KUUSPRgk@Qa113>H(&YH`z{pI0aWsl;)G>=cX4|Gcsqn zHKH47_kpqs0bJkHrA|Z9z=51kBSq3dTv5H4P=^Y8o-4IWlu*zH3AphiE39CFA-J(F zta6#Ixk;2e27V%KeO3GPDjNjiIx7K2Qqt*dJ!}!a5~MEP&=)tiO?my{rt%b%HFoQr zTc0gB82PwPLu#fu)aZ^5>aF0o#}|>KwX#-Nwl2llj=?C z6>GHqOF=sy`_WOYl_bV-9cQh?9K^mpw_^b4o4a)1#MxJeg60sIs_VVEcmlbqxP=e1 z@{1_@0aXsL40eeZ!Xvooo_9;rYx8{HZ5O?kdp+mn$ryvoRP;*{bf=jUjS+Wn%> zvS-?@6TBeCFAL9@E+Sh&(wS^bb$Y0ZJ9wdQIo{VQ&>ByFM=MBoE~5i65BsLvtg5|U z{wSvgqd|tOVO(#nd4&K4EA==tu`{f#T+&NlyU`J`)(m#R>=4rA8Pjgo3%8ICdA6Ns z;R{VW+pUDA689ECi*!`0ECOqh!o~|Wyy$w2Ury^}9U!PUAtL7lE2YAiONrDUS_gyZk%U6N*-YT`_q7CkkwwGw=%5j6z_$i# zI3<_+9n8QYbJl@N9we8i(;BOTrsz@N3^@&zaKDQuFSFR>3}{&5b5YavI=FA*m%bKx zMEqgdJ{zCaEawJYVTr#$H1FH!1IHQibgm^P^JF52?evcP3_`H!Sa92y5M^yoW~5tP zi(HlJ+L6_(MM-p+`a-T@XroUveIBvlBn0jko_{QH-Ma-4JX!{&`0eN!dV_B7t!|m_ zvJ<1-i@{%O5nx-F@2fqXtx7>bxKS5DufW$dzC6{o)m`71k5P9yk$a*wG%keZ`DQT^-vlRZa~jPq5{@K^5NZzqQnNL4^Qw24remed)GlJsD1i@Uinl<-OV-9sbG9<9nstH z0=@F0f&6p&gnMaIk)_J`X3wMLPE#z>1S?@5c_jOEc5=<3a)AtD@I$fi;@HE=@eQgr zAJY&&M_^GnZ8KF{b?8De`9EYzHem3|TPkULt@Cyg0SoyzaFpD3YUHf-X95tsH(GV!iU;@qf6|5vbw%%>) zqFX({Qn%`~29mI0}jFX^LbK+>@m+tJ^Fw{gC|)?(5*T zX0#j0?V_SqR^@MM=rNrO?cZQ5k#}A4jr<50Nz;D>eWSj$6y<^{LZtv)A^CfO41U&2xFst&av;1m`Ki;^~0iC;8nk3 z0~)*3+FEQGGS&)*s=ZOdtXLbXbYfwu8FsjEdia^;4SKq{nZ$Sg)TlmNyV+>5f@*rTlcf7>vrX2uspNiJVbkKwm9d; z7~KwCfm7|;sOD$>m~YJmm_iWe%^tMz>G`op{kyq6)+jvh<=D6+KKqF>hJE2w2v2BS z^1LN_$9dbZZ_yuc0vALBk7-umNkK;`7<$eJgW_$)($>u@)zpB*hp6enJ*xZ)9 zvB*uAJnFb*-X23y1?2knh6x!o-6uUWnC48Xqe!EfQOGTq9t5HKkJswJ3qS0bQLvua zxcZH^@DU;KWjlb&4fnR--&?-XTl|wJH4E8q6o>?#DPKor>+C+r^J|V#@%yXR$ixKB0jEIEKNori z)^soKDU99PnY-XKJ1=eO7+3&%!6Ge~(b=f&<<_ioq-U<#oZEewF3>xNF*Vuk);bgL z>(jp7qNouvU{1lnApg^AaGyQrHVP#S9xfX!T(K^l>eu%yrOWFxf$Phz9HGeEv6wb? zozwQ!(ZSIUnY;JKp@Liobq|#@Bj} zSX*h$w+d$pKLQi^NeYLbkzDjGTpRz4!tJ7l+I*l!ddJZ(8>^J@0G75Tbvl;;UV#M^ zv{Hlz0RaZ+jr-}_+vf*Jc4lc_XPqhe!Ip23O3fB0m$J1JT<6#u3%xE(VS}1Stnlsu zI!8o(x3&RkG|MG9)i+}2ndg$!D|+z+q>d7;dUL`91;cAZ(FkUfVi1Tz)o^qoGb4Gi z9TvAIO0s61SxVJ`DjE{w0ir#Nb(X4RuhD0fpRKns-+=oRELu)WuOA9FI zEe0;aS2l2zI}Z92V5~N<#!5ct_XL zL|FTuag(ygGmOra(6nm58Gg{W$ZbP$Q7OL;FkJG)FCaFoleLJd-W0ghvAV8N>K3fP z;$%RujN%tEtx?O* z#7l)C`sai8%ymEZH>?%78fh)LLG}^kyS4O}E;h#Ow3VABhMvZ{@o-h!?rw;mPa<)) zTBKUCc}dnu{-r9Ti2*ryoROswM-m^GnnWUlLu&16KfEC?xnjc;_bZ?&X~3MqL#i*h zraqceChCnN9heba_9eWs`1c@`-xIPJk6m!zMc4n%OKl^j+>Wp^gL&XIc zm9#FlEnhlk4+`gko~+S+6>$jrLb%c}&0*UkN{I(odVs)zvuir-nZ$2W4OBTyaxv3D z^{H)8N;p)%)nqSKa}fRB8^kSTg_N+Ex__RU{}X6a+SK9=m=)YRgm*OUtS!BK&> z!N@g9_OXmNB>PEG95c4bQlZZ!0|Gol40_^rF0&oHkErB{%T+4?djSsH+CA^Dc}reK zWMYFsbRlwuTS4zWqr|1OG4V(SMmfAJ{q=1eP%fx&2;mC=dfg*?$!iHDcm0FI`lz)x zQW~Hv;=j96YCKWT0pwEyzMw|+nB4dSkb6zG>BxNk+jD~+R-+*#2*G{Y^Mz2Il5}8_ z&R4{pU_pGB`_KM5aI@~@RBk9pW-C2egSQy)hz1k3ZSr&>1z(^Fza$liqy)AUjT8vh zttD*(bmrlMu8v^iP4RAwo-a}5c0pdj)1md%mU#aK=O~jB+xrSQ?mDctAN974Y2i1_ ze*oiMd3|d^4K;=IrNh5&L7g^!{9sE_uEV z`!VF`>lB#q@vHtuQ@-mm#TDWlwYZ>;oOB~S>9#8{FvIK-Ot}9;uksRM@f(wd+pN?8 zq(USPQ9sJ_iTogf-pcVF=o6LVkI2A!iBrVQR{_(Eit_NhLe~SDsr*5;wEtTeWRUz$ zkdae!flbH0iu}%zCLw8_1^-w`=nlD46iJ~B+`Yhqq425{6 z?+Ol+82U2bXf>69&UIt?triRj=Nw@Y6cl`*H>7LBm(_T;NH=ylS|KRCHL1KO{2rJ; z=#OaAL`wK`$?UxVJgFs1&*RYE!zW`ahspKK1*CW3Fn`BpaQ8f30AL_Ew#OC}SOjBE zk8Tblz7PS`QgtQ|j<-kFxH;9oEwdZTnN`wB}5UwfvkeJ~2~e%MhO=k2*A1yOh4vTg534#sFm4u~`3MNLfL@M-S)T@mD>aK%M)a^xEz{o6jhwo>^Jr4$;F&Ewf082)Y?RSFZzg? zIo@Nx$gHvZ=JF3e!iT@Ox-^HF54M|#WsO_pIIPj7I#PjpazYF;qPY|Dlef|-P03>5 z(o*aYTnZw#OnF<93d3a4(p-H!=1KI`Pm(LrC;B3I%Q109BT*%f01~MlMaZeU;5uZy ztPbv4#97s`Y;blZ;7}RFI0Y)fAo<3XJl8{ZK+%$ckv(^L7Rov6+J-y?@qVzB_OWuO zmOei!h1Ggp$8hP~t#hvPc?tRJAAv%chCxTfBGJ?o6L6Zt_*}3BGFm)qj=lAARf46v zUdnl<#A1)Jjsm~)6R4I%re?_e7Vwl&I~mTGAb?{b?dU+rn?nWJ6hVvN-wN~NR`m9(`>S9IF#vel+EZ>tf63U*s4hq zG7EXz!WHU{w65Q8On2c&RngS9-*#)lX04evn=wN32swUNq+u_%s&DO=?u&7q0_ga;@0k3YggA816Mbd zvS~)V{b)1}a7AAN$EULx1{J;EhCwJp*{PP;x;H$B?6~K#%UfMd*5lQ;N<);aP~7{3{K+Yb^Yp z(5n2MNpUZ*YoJ#(je1kDZwsw9KuI_!kD)Tk;%m(f>(8)H(=GF!f>g_b8ONTU3fryg z>mw#h-q!>L1py!x2$#L^p3#`5hnXvsD?L~GKrq@Wi@!EoCn?|`JZf!WWpOw{8F^)K zyfU+D42sHUbDf|&RraS*P>$1Jy-5m}NEp&?8yTV$IX+fg0R#-vOyvF6Ee*thCCYNu zIxrISua~W!K{23arPlimS|Cqkn9U(&e!VeyyVF%y_L{9@?D9IQWw`C&Hi*Wx-|RWr zoEpvPp8Tk4&YZU4%(RXzy9C(r}3xHKN?ZpL7T{*RK% zC^o$#)q*lq-nDdStV+UWqTYKENc8mK`T8rZV`AI29@4PAEOCIyQm>5^bZy(5szFHt zM`RXLlhjGxmJ=##{P^Y5{9quA>-+&fWQB9dvepuL?eZz&s`DWJ=UPMe*r4eAmf}&z?JlSQ^#= z3EXBFGv>`%nO4zPh3VG^M!dm9#Mk@F$@!(RwXdt*OAX8$2Y<(K4!L3i)LOG@Vaa{I z(35*NGKNw?9Ei&o<1(WkAvAfFXaR&*;XEAUylugA7rl^Cj+rz^I6U(+d|CwASsGU1 z`8IMqUK|~@H7Fi&6@qzRamaOg48=J+E7_Yrm$PBn@#LNpzJJ<*vxj>Pk zTLp}9$X^jk!H366PvD(cb&wCyl*El5 z<|{E19*+2+$z;Neij7AqQbNYUS-CLfk_=&E1)~^$GEk;Wnx~}9{#-JNN0oyyfiRUV z(oQxS_kxEFg)>U+507Ma17VZ#2C%>?1r~7qIfHmaToS_Y@@3{Zf-@%7gD9{-Z5*ta z7v)e2iHTI^M%QD4;_3wqchJX#Uj^`TWha&^HnWNRxECK=-h?Rn&r9&|= z6UJPh#F4ubp))5&=rXQdLez0;Ot5f~gn}?~XrifEW}afeDjck0yo{8n%@m*`W-FgS zlomTy3N{@wyi|~p<)t=mJIrPZ7Z6!Pmb)BBfD*%vgDWnPM_L)65p%v%$Q#K&bh7V` zvsN#N0Xarl9S3`BA$cpl3b#E%IL*Sx{87x(C1o|sFsKNr0Ec#3V>8xw3RZ1tL@VY^ zl@pvd1ewc?oF1#Vu)(SUrp?LAmHBUTqdABu`H!1?Ki&K_lI%5aCE%`x)6<(ht+)K` z_fqJ1KVT8H6bd?U;HrRzSh*gmE{A4e2}f<3%%l*RM=P_ygYA*bgxEI1{gKk}!~g8` z>;9~m|5~nt@S%qw+`g0PyX#}^WvIENh=6D4Fi!iS#Ss2vub)j(vajC>2eJS)9%TPg z|HUyGA&u{uN&CTfgNVp2#48NP-`6@jW9MVQR_NE~SMgG%VmA&keYibyO}_|PsrEy$ z?o-Cpp*=h5lIO+E&V<*8-{0My#j;UU`oq){A&!i-%vyaB$Xs&>$0fGi0490Tixo6! z;Ovqe>uxH->?o6S3W8A^O;e@W#Q|II1XWHb)r7>}suGj*D))tHCOO=5vp8kcJ9^Cn znmNH1`cHaw*d@Dq(7(!gbxVLzbMOVqK1msxf=93S9uSI&vm20;L z)d!acaGvo21G-GpnqZO9P6-Pz&IPO4FyN0#mFO8^Vh`6hi@@0vhtrt$nf-wQE>Rax zzTB6XlZv;~|Harl28j}NTY_cVwr|-sZ`pR;vTfV8ZQHhO+cu`Yj_&F1coP%v{K$;l zCx2x`?z6G>S`ojLdQ)rkT9x1P%&MxYXcIb56S~J=NmnT)Qy*?0G_ziK{Q6wQRr^(9 zwPfRl6|QZEHNLVuH0@_3o{G-ckUNAKNN9=0XCgqs(rF}EdM$}Y@s%MfTM~#aW968p zSXzZ$$@Xa^l0fPCW)?zwdSfRc|JWwSZE++P0+CU%6*I|j;tZ0+k%Qt4+~^hph2U}l zv&k-@1##!L@5$ykW4lA)72AhGC_M@B$$kLfRif#MB{ruxnVnf1F#?{{FJif`8AN6a zRLlX81bsL6Ov{NExG!{{!8#tMWP2XJe9t&9dRTmp6PliiZ^xw7$5;*M^nw)bRX6u4 zyBY^3)vU!jmAdJflFbS~m#81snnPPG3BMC8{lcFNH3NSnH4it^6U*BHdVPt)VQC&{?e$Hw^ZJ! zc0Glj6-3%)Iy6c@K(RKo=aM^m8VqbRJ*sGKPlIgXftw>g9SuDQXAF}2pZmD%N2*s zxG=uYcBi>Kw|32H%`3D?T;zm{Hmqac1tE&nBI228w0RqZ5ztbU6YWd3Ay3_L2u|Q{ zd2Z9F%C_fa@#%{ljbUClR#ZGYhMd|rw|`kUzT=SZyMEf_E@&|B&RWkd#sB-$&gRAU z-M_zO`l5uA;5|eDu)`xW0)I?gcITl3nUMmD7_)4mHD%N zJxi%o4?5WfxF`RUSZjiCD;`2$3t0C&86r^W3}tYYOqjQ;=QMG+Bq?t^?4|FkS^NnY z(Eg9A-UNZ9PvH<2>KJ4=MpGVU;$dfcBkMiLB^jZaO*|j1;~qjBLOeWM8V6oFFtzvb zotIMW5ch>xy>Z|ODf9c{U(38+>w2CY26HrtEifgD(n}0f*eWsBMMbOs*Ldmo<3A{R zw|bm6Z>bRz9-!UaxEt-2YTA@7I04ecLL@$41$%+&=h9rY9KTVph2Yy}{dP{>$C3$W zyZNi^R~#zvd6zNg#$+`+?;i2TJVzCuGC3m6qFph+_$Ln9nmk(=72Q$mq5I=0^$zZ} zyaM0z{9-axaC?@K7~g`>B_9A={fTajd6)81sLlm7#Oo0|`?c*+bJ^stA-ETaNOV#! zfT9^ep>?*>m~3BAVX$RRN@C}NTX3!z48(QqR5@C^HQdz7w?G9vI3yxhzlX@5BR%Y! zupE4SyAJ6;f4vNU3o&!Ug$H+)ZY!TqRKqH^n ziP@>%ZW_SMowJ^4{}!?ep!@?mBsL@rClK*u!&PdwSOU66>4~d9u=Buf73kRRp0abz z*b`>xt*B2=NMf|k1>?1ZDbG-;Un%>}ib2=@5Y&FxaPq^>?b$s1pnFEZ)cs%LBaUAP zFg<~dfjJa6HvyffnWf`D``^2zzT-dPe}*FzksMI-Ldh|nEKwRONZ{*(5!soOfC34Soe#OHQ)R?xnk-y2i<48T3yq8?}trRN1OZY1v$)`A)dIz zJPXZ{r8tJxCg<~AmLYv_D~Ewwl6+#f(xIs0S4=Gt^4|beRkvk2n{2(!j=FwhYrdGIis}->qVgJt>=nz` zu&R&q;_E9^Vcw#c;q##<$ELRlwUP5R4khnYq_m5r8)hSui?9|f z*#g%K;Z~<}#J~mWT6I{2>&B{Y(Lj`bvrpBbnFDOshR>|Ay}ln^q#`~kgX8E%uFJT* zXL%-%>;(QEAL!OxFsRReRN6ZqsH)>a&{2=J*_a{F@|DvU$q zvq5qbY*Y*@U3efBT=Cl?9TsSSz_0vW7{4n+2COk~19vk65G+p9>IG`N@F$E*6lo{A1|Y4LDA2>FCMtN)SVA zIz$6&WaH|FGMlp@h9rIA&3!6BU7h#be9)2QF;9BwAS_t8E1&6=Gy09*7Q2rJ2i{w+ zqFsX?mWc?c#h9~aOi5Z5*2e23HLJ{O@*|t&Vq)pjfywZIRTt$09i#?)f!`gP+A3Q6 z)>r%TI&UVVTi%fX6y9(6kb6tZggwIi6740TY27?9 zT)w9i#%{XQ!Nk$OZq3TcCgpZ0Ip)e6pyFIqEmTXIFr#bX1t|F-HS)Um1q)2~&d|DG z8W09EM3@HdO4-@M$P96HF$=fHjUjYF&WXB|B{(Zl<=uMy^-38dUshkyB(nzAIJk8j zt9@pxR;z2zbqrVUoyW6zwN<8)W}4Zf7H;5d8g8zb>RbyaUTw@eRQFt50F_@M3^ZPW z(5K|=*t5Q?$&e}wCJO)MGY#OLZ$hF_Y~Kjp2CK4bCn?o8o0$9_6yt|$+)Fr`3)F5Qh zrO8gsT@Bf(YSSBz(;qO)Z=5jD0YtAw-vs);JB8ZYCo^>3#z`|WTiQFZqR4+3$wN+K zR-G-!QfymXd&-=A=VnnvU4}25J4$v@R{T()m$;o|hc{@&DS_#G-kNLTyG&Hpb;X|t5 z5eeYT6Nvm0Mdldp#oZk<`1(gp)7ola36nw%>gg=QS0@NrOa8G!*naaWrs&yZzC4lP zp}=4lu{0NxFvpJhUDsyaDp09eh5S`Lju7PBxSu^E@`rqyn+N17%9cNFO*4y@u{6i} z)lBL&+UL_yQe!0QmawK{A3u#blHa1~8uYgZ6+Uu=j${C6J53BC!f%S{#>}^(HHVt6!Q6z}7Qy`=SwW^FMu#1{EbhouKJHBRD z7UCLQf4ja3h<4LiCpX*sn!CWb*uj<6_m%rrADa5R)%tsY6+NiTQ7Sj-%=TaL3~Pi! z6LCb0)!vkFJ=kE|G3s^I8oT0%hi!}1|k zq+}SI7EA*>{~OANpMN(Or8?!cpf?nn%Xy40cniy^I8z?Ta+x@i-iL=J(=VKMBrd&k z>dsaKsW3G(ijy_G0s5=$ zkSzqm?oH1ZM(Mz=j#Q_VK?Zw%WY zb3s55e6uF77^;%<{I4_jXkVpvev}qUR?!=>E)DESWAPw&OUw znIuNc(^9ZDwIgZYq01EKn#TKFKm2-gb^%iL6V>vv+H*zLo z`}^(j0=T;uRmn%#;jR0$E>WR`BHk};v|DgyZA4x(VY27e-r%_6vXPCeV$RzjIX-V^ z3HHy**oT{6B6%}_j1hF7+!`;Dl~@BLxeuPqne$Y1WdJrPKTX!l>kB;k_~$J!WI3O} z&BU>HLwDzKUM9^w^(K6Ns&QH57Q7wW$y<8jiwC3nQv3z!@(IGInSE@-fyp%-PpZOv zfBzM>8#Fow=ZRXS7;x)rEk4KPsnQi__p#{q={iP>D!E`Cd&I=zAKbMFJ~Mt2zcn3T zG91|-5DYsXf*_;D3gYAJ??4nP@X2V)iLmvBmBg~FxGd&)|7^lgBazO$=573WeF(nIeXiF7 zf88>fwnp7dNI{oM63F&u-MFkn@+B}KuJyRmirGXQa~I+zMO+nn)H^spc~D%jlv=TLQnzl-LKc9>YPzNXPZ`PyZzy^S>j-(T8MhcDZINf z7_#dnByMJ&rIW)1u74-CgYE= zy>|WXJ&PO$e*njVAtIjt*c=1#2g7TzH(4f>4KzDt*Uah!(mBKdV8Luy(9?U?hDc~L z50IEh#@OHvd8Cg0W*OPfI4lT{CSi_XWf>DvoP?h_BjR(I9Z1OysZZClD3lowd;A;_ zgtGLaZcErIMIRX-8+ijZH!9@NA$I5_sfv{hq8!SSelob1e=?ZIsc>%OZ{Xsb%m#Uy z87>AYVBNvS+sd2f3+J?JoV80~fTGeh(&8@Mk7S1wv@s@GH={^72op;>2s5Nu>yx}5 ze|k=D&60-H^~hjbO7dopJ82^qILhaG!*~H{80ATW%k%R5!gthEv>Kr6l+tWy39EniSOqus7<5gAJcyG5NNIchme{xz(Ao}?% zr^zqKDI{o&X~T207eA5{U2l^*csnQN%^j?+JjAgq=P>W;g|q*RF|earM6x!bCe?Y; z_ZeMR{EjUs|A>tr84fCdlOOC`7lK2SM|k4cVV@udas)cMZIB|m@)bk*_Z$jybc=t4 zh=~d?5wo(A%)bLZUGgIS|*4B-}oc|qsmjiF?z@g=wSdea{Ha)gueX* zXg*gCJkW%0pG}(l%dxxe&{(Y<*V@`muoROS~+5TfG!v+k^ItO!3jGw#v8~FJt7fUa%fQqoGceJ<34n4U1iHCDm1n!Av9{c$XKI#*^ScT!I0AC}ec+-Ok zfoGeS=3&uNhtRp8{44uu);N7xKbLh?hK~bo-*U+d>1%E4y4KC2_tlDL6q%ejqmdB= zbb~6LFlYvT8{QuOKZC?fo!@x6B{8FC*SUmsH&Moq(3U8YL^%h1A=&##D{HOXR}Z83 z;BB_iGuaS(n zh6pt=RY@*>*nSKm>Qka?w^}*j0)P3_fT>tqLSp?IVR34$SRv``*n7yov^Cpi`LO43 z0*oRFt@qWoN)-xC!4R&h@w_3Zy(S}Lt#HvMIiqzV$-3H^b;>!3Mx*=*Xz|N=%9w>~ zR4cye*hTUC^U0p2&D=h3Be8(fwPU)o>u|4L^PJ=fj&uv=%6&n~A?TFV#>zhW^Wo5; zm>xcjPUE0kHHz>xhAF4#Jx)OIB@oF((Qd|f)G?uDW+y(fOXB*x5SWfa?B|>-5{1pD zknbX++W7Ng5FbkRCj|vAI#G;`ZDt`w9N+lpA?N56* zgf{=-A7K9=rOf|YsA6LOZx*T;S=s;ZMqQVNWWok3Quj>Ft{HS?I6^0WQo;d=&WPQ3 zT~eWQ7LI8c)Bd%1Iw^;9rf$y`fOs5^JTb?1S15tbm#|M%v6^#2-Q^l;26vB+j@Mh3 z9#O-h=5WK26B%>CFn`R`B32U3%9`eV<)(FnCt)QqBX4qBU7?nhv+^{mIx2_DAuC+h zG%E4YR=4%TPRb6xsX`RZtC#cB)%`i2Do(rlFcWbp3UGx` zZ(!Pnl)75A-Imq!@p%dOKKG^~c6n>o^;zV_3yOjwA)LoE)gFJwTP|`n_0q7hibQ#0 z+QL}HzwTX~G-9C{hiU^Wq(`?y`(z$YzhuRjQd2Fv5wsMF|AC!@ zh;SzkTPRg~AZn&7dPLLrCV2^C{NdD3%%g=WIB{e_8paqmwzA}xkhz#KGQ6d@bwNMt z_WVMbs;IfRbKMtJpsbmibU%g z4johKm<6p&=VS1r}vB2ks`_RZf} z-QzssSvnWCtKz%^5QBT1wmcC$tzuk?$+iURQ4CatOfXNFX`OK6BBI2fQzc~&57 zRlT`_(d9b-F{lLcf^E!7#|{A;R^B2!I^FJ14l3xV4?I*fR z5nyl<)JdHDq;sH2W(_Cgkh$}Wuk#cw`g`PJ4_SaSmQpZ<$TVN*vIKnJxGX@vveIXs zN_J$97#zKO#{R(*E_OfHU21Y>^XP z0QnI!I8sKiQ-zb$oqNoHm?!v!Rm3lsR_(?NUHVF8*kO935|bL53}?-& z@=;J<^eKNrP?T*@;gKk0j7|+YNx{KB9++rR*To@U7MIv*sQ0zne*cFQmNgg}`>jK}UM%M9Vox4(wkV z34A|aL=y2Hq?ZF-iAe;&cMG-CgfCO#o+ZvZEkDA89sNCG@{dr@pYfEq25&HaIrt+!Nk z?o0YJ8bvnLtcIQw2Ixiz{4=u59y&7CBJ1P3 zwfEVrMr1mCZ;z+4eB{LM*B*9b6)orEpGq|I+;V{sW&17B9g=br`r1Dbr27E8KNByQ z_E;$u{F$DimRAcC2$6I*E5koA${MbIb70}8KIH*2T~BL0pK07wGf|sIN|)yb;|7X$ zrQRN%60rD+S67Tt1dbRo5je19<)R*g2?)nh(e92u4sok-)!yG@2*1#SENUx!TV_4n z?i2e}Z%J4;Pdg796z*o&hdS3EAr}nAGzEK9$VvP~i0?Ns=pY51QpZCTM&Ue*ROzN$ zHQ{yHy;C*e&M@ya;)k+$e@MF}qSsO#olOBo2Sk$0`!7*;`J$W+{@5$Rv?G>`icDe@ zM-j@*0P3urp|&xH#j!F!v)mSvrnK35QtmU@F3^D;b5n>~j`Aw;G`{|$A94LaNi81! zRVUw2A}{)lloL~i`*4yGCAgQG!4U7UrzTw=F9%>*meKHf_tu?BH!++oWJBo+Db+LB z9UZ2~@NAk>z~zZ|FmH+1>-#SpE6u5$r33JZ;+oEYErW0i5{NZ>ogL@&Z#`2;j7iQZQKfQRA_|-; zT<1;-2&z>4Y%09$KFOXe<-{V5zv0mp_t$w$BmOE0)rNFA!G(HCTjx|5#TEwtXjrtV z6zU|LsM3nf>zE~YzcKhbwH-C7;Jv~3H1V8OwG{^$*CXS7+1bvK0cqL-eL)IXYD&LeYD;%2C0?&^{5nMNi`{BQg{X5kt(ndxvX9@ zbBPGE`|fPt`u3pU%Pv?tlk^08de~{RHm;FCmVe0aFw$HjZ)v=K0R~_L zl+TX3p|#p6h`MO_{zw-aPM0wp;FoF3l@sdTI03Cmxz%OXoEEgZo`pCZ%n2H?lOd}P z=mWhx-n%hv!&f8h3RfDv7sasUun`r^R(G?KMCikEG{|Vbh*xlkyFFr6(?KJG<_{zG zMvq=h&vk$2K*J+A%2{onM?F_iBK<2CquGBY#M9t1m%en6b%Py)x+$~j3*fAlF`snK zA}~xKi*>NuRq#76xm(A2Qyri&Hbdr4y66=#wU99!)~rSYSgwC%lcdngMu>>P_Db^u z?L(Lp7b)p_+APpZ9ugPiURQVQnT@EmzLI>7GVe-=X#jHcpdk`Ai)XA7!q)-Xf1rPo zxFh~c1k3&_0Q$dMt^aK(+J8E=I?{8+^u7AAoQt(J)s#&rZ@XS8r5F#hB&XixiOb554KS4b%Kok6{f*X_XeV*c2`ZWaZ5kDG(_00g6AI z+fmB{h7djoj21ZX50rnUbEk=X-duw=WbsWUh$N1*%%>j|N+*%BJ*L(GwM49`L{rH# z6y~b{&W=T0zC}p1-4g)!S*9Y-A3(kUK<}O14`b=4oI+P&mxfGa(5!&)vfbk+)HpvWrduF+|5EV!qsD^8D-G4719Z6fXG%LxIO@R%HcxNal3{| z#=2!|C+K{FVS$o`fnnQ5K6Q1BhGKe}^eF~522Ju^BS(Y*ixddcQ#anVB&enFC+;JU zM6HDQ1`xh=+oVI3nKBwy(#Dihv7B%V{?Uf z13-rmg^mIcBUa0Nw)P4(0F8ntn^oiwzc1MUDG33ZO5_KF@DdaG96$_HTxvO&Pn05=O!gr zC@e{pT#8;`eEl?=v74Uu&h&GV=>^FLmFO7o+B_i_N@7p5f=Cyzj3wC(v~byASwbHM z`Urs=-HPWmKG$@;o|JS%mn4*kaz+I>NHVtBIr#MQ?x10A0=`8(ayp~_Z=dJV#oUhAj3|2RTq_4Q&&+{L=e>r;%mRJ=iZ6xsA!61b&g_L2 zw>PyY-QcO&M?GqRUvc-$>>8dPY2;#@4njT)5ym65y*LkdJuFSa=v*Z5a$hE}%kgu?PhkghchQKBPl_5ANyCIvs88uY*r>acoB< z9ZVddv2TWqT)Vw)mWPUbKTZz|XVcX`Q142nI37Hg#MZN|04SF*xcm*}8D}sPis$Pt zOZN3x2y)C_eW?6{REhJDfP^ULU--KQ=v$)XG|lL(0JpI>4@ebnJ?lrF_YZHe^Y`&z zul_@%utRX*b)Rxy$>=PLBRn&zGho^cgk%*{Xb70e@n4F*v_lo*+=mVf?=N&eh+d1m zd3@r;mgdV3Zx?jWEM7am1Sa47x*)51ctncO?T$*iK-wX*07s`)3p8@j5K2?&AuZ@N8di2lG#LqZ1+zJ*J7q_LX(VSQ23&|Q~XS6iQQ z0pI1Es|rmAAx~|*IV9P*aOO~4bc1cJ)yXEL9ie3qi>1EV z0g2uI?P06q<|~h;QLs`D4rl0Pak}ahyR3H*@Yh8ard$if--2hNU-C|Na63+6h!LO$ zapG>cOjIQ=BkbA}!?QQWTyl%;)1IHZHCaBbFZSF~9E^Ok7;;nB`e!3o7*8e{HLJVS z)Iz?(dREs9ftn0~yzG|pPM~#=AhW8)5QI3QWb&xkVtet=ChQ|(YE%So8gWoF z0qrqS(?i{YqDk}{R5ZL$$5qg-NbB5}dudKxnCVcL3%F=3Fqwh>(c2SkeA%t#P0E6t zr3eI55rbqh+L?Eo*6D*8!%5J>M~IBZD;O{o3e2i)#-;}HWUbD-Hj3tStp)x&Y1giw zqkCAD{ObB5=WoYyP#6#tz^qLyhv&XQ!%;En&lIAlq6-}<1NO&hwVxq+1~q2-43jOZ z#g+&?;>~?auT)u;1-Y|=Ea9JyU5&m~%qE^WNm=6;S>AnJ;0YrL4G;cz9})HDj!;>( zgpNxELqL&B#B}TDw{w8qpBFoil$3#S{A0a@Eux{~EwQ2QehpgET8!uOq7NJNDnQ`WrdN?IR+Zrn3A9qyZY5~;+z=`#*YQx%)A6zZ-a zml8K}{U*}3zTGs5%XUkCH!)z;TydGAA+b#VSf4(&{6M?Weu>_F~?-N$0j}5UWA*z( zb$qefiwEk)F?2HBRd zIdJfvTs1Cn=#;=!vfu}4Y|5(RgzcT@!CHs}*|pH>YsgmtS9~xh3Z45qG&q_WcV;`% zR>36@Y^m2b9=WUsFYomp7^65#D|%%z3|aZnz&Evd7YgOKVilaMNhmo=PL|;`-@?jb zR7((LO2jC=p9}uoSOR79=kw|F>+{J}2u*1k_8Z>ajYa8#L-T0u?XycoJ+zKac@@yw zT}2&Ux~J!Ys_4IFnk7mz%`5}(s%Q%E%S__sI%;2tJj>qfxa&WVGZo6$#Czpw)En-j ze_5==H9in27`*_m%mm_6K0C^2D0oE`#PrsyW}VYFhO~96gD1KC6k&|P!}ah&LuDhw z#rxNtb8Ck@etv4lw;Gr18LQCV{w&6;jW|_&Y7#D)pwmDvZ-H0ftz__TMprzU&*B^1 z0%cF)A=86>V{TJ2xX}r1K8%?Xzda)q7EgD5tVV+;ru9Wn^5Jay32dlh=YT~W7zJ(> zP`Yggn5rlPm%OuyGS_6BwOgO>J*5kI5AppAycou5Anym(O|I(dox^ga$V7m@F-w2; z_4hkCh66}f_A>n_v-^Ut$mdx5FPQ}g^MAKC&cMjX@qdFjRV9CiSYWy@RBuPKrWtoL zxK%Lu;#YB7)@0z#;KG}%7d7nvOjwolbOTV@KZQ4BKi5aBf%?Vtf+K)DLjyZA_yxQ) zW^{6@=BA?01sHANDxw8Cybg)&W$ABadhMcr*>hNE909MqEwM~Ld_O;!&xsG%m_)&R z^8UQ%G4y`y;4fz!8@@Q-Qc_F2cBW=JCGe3U@c}1HQsyNHk=t@~Xv^?=g0PPG*vRvU zj(q=3mo(<4ZE3vD?#l7>Y0T;~h9PPlt(>|6&gcs=R}`bGgj+I(4HMo$aF9wwT<0{7 zLM03?NG&Z+QUL3~Ctv^E7X2qDm?u)f&?t|eKR>Rbq!8c>xTq&&L2MLSV5z5<N9uzcvN>{$`jLMxx z4~F?yyhNzOQ)61iM5)<_70H!S?~1^FQW-MBFMQ!|xMsguVJ$d=D8nkyu6kx)LDn35 zk75mj`!>OW)>Hsn>=H|Sr{92`FlPS)yG{-hE=M4VwSEDYA z!o$W)83xb`q~tkVtUjS2sswYoDd*=3YO_iKW0j#iHgaFY%gP=uT8MM7p(F(ijOI0Q zC540(gK!YiA;KTv0?ec}Q(YyT9oD(KYot7p+-v!*G;!282@^{YVWqE}oq)S2J zN|D8jB9%%5)(DcSVL~a2ETd{w-dauVDfwK)rlRgLo}>B^VJeiCWKD=j4#Q<&g_ZIN zGN*{GM%3oS=TERA{yF$9T-Z&;aQead?9z@Be_dPAiWP@4@2_nI0Tctkg&<*xIKztW z2|l>ojLk#xY@dBNnVO1RU#(;*LX16{Rv*RfA<8O71W6J$0GtBl{vepd)Pq}`L;4mr z7)FzS1jS~N%&%Si*@wQ_af-UKuNawnFN=%bu|@-V_hVLlJDJJ#(pYQBD50L5z=yWMGII-w zpWI0{`o$G}j2N;#fUeg!=IXvwNPoY!_G*IP`lPeocGF^Qngm>Q6Kp+Rpl&I?UTa%5 zr<04~Zw@K(BWWZR%>8)TpOrA)Qkz`t;0=9i-`svBb^J0l>ZJeJKVjQ7G`U6$*fLQQ zp0%W~7s>96M*aXD46uIxSGUOW-^I2wFfuX!Uv6pwGA{O zh(JFdDj61W1v9`#uST|M)|)ak;cYpBZwV$Bx8pO>%F zySrG#GfVWon& zkHw+PT%+`9`%j+t##u~=50Dk-0#uf7YdH)uyeAUqe!)B#y|xu>w(j5D2fy3P|7=+N zCNGuaxz+!uzZ%;uB`QMfnA(U6je?Me(kyq1I8Ea`NXq&O=7bSCMQ(~4sy&R-Gv6^+ z@LHl8cp%Y1VnV|+hEibqnd{O57r5~-7p7AZH+r(Hvy7`vq^G(t@T!aN;k<0=bBloN!qqK&T6tZ*0$N{d8X>wpK^FJ}4ZM@KJ9Py*%XSXz!a9{6T#;Mi%t)TnwjNp4|c@@X|8Iv<>0DoN1 zg)fh`bD<87X8`)dcHMH8v*bWPmSVwq?*488JGSeiu}OT?q6;2lB&bzJ-Zeh9o=6#y zM^7t9D%9mSWz)Yk+T8ai*lvuIF61X#`sU*X#y7h^cEziMX}Vm92l%{~^!+LgkKZSw z^NpW9+9}kSMX1{)=*!5);wlXFq(HWifS0!H6ZSqvlGw3N3<0{AXYX3(Pb<4CVRC_k z2NFN3DwlyP(5oh_XpR;Ao`?&1jCv?p?^O#sTR=Eej!sPhDxpttZ!LQW0Ia7I5)~a@ z8pPPjkz2={OU-U9HRTa*6Ly4&B%aOJx+~O%N}$4lHD(~Z=W(?9LF8ShI`ML@i>1C) z$07&&G5k!bX}X5S6Am3MdXdMW>GQ5K=EEuT6nlR2?X=f5tJR4A4=eoNJcm zH#~R2%AJcV;DeoiW_zmhRBqDN$9@G;+|krGx{_2Fmh=hKPcJJEfV!z|`=EERWImZZ z7OgEWDg7mx#jlb#x8UsAETE3aicGnu{4@o+th(HNilbA%74{M!CM;1s`wxu))KB|pCj$&;_4c)6+uTAySi`spD}b1{xZ1cUV5XR%v&eFz2c zzdhhvG%NgVhO!R$O;c&NI^}Jb-fv4YLsFG&sRN;ymDSAJa26>VAjZS`HbX^b{gKVp z_z5}cKq-~fs8b=B_tcQjBsd&dc7hTKbicSGVgBCdeK5dMiY3s;Z&EBuKTIxwfT&l= zdHQ4oBep0NNH9A%!WL&&f-xu~j+;|o+QTZ;-joYq`X%jk2S1B^^!w$PYNOa~_`-*J zdMpkgKRxQydC37gHuoqFSv=OLiQK`tR&p@1q9?9d#nS3s7xYAN{0VjWkmgKoXzRUjoo zaEh28qkhV2@EEcPiF1Azn)QsoDM2m~?&_1}U%9MWq7}smKwa8Us}o~w3WnDr26Pp~ ztZXZ9A4uG?!vz|R8%T6VH7=}Fh;>KlB`Yfr|Fj@QMylv{aMz9JR1cvZn5(S5`F^)% zw^-$4bJo7&m8tJB!N4#C%IX;6d1CWDg(aU0vdFF>Y^t5tYa0Uo*|Y{bVztlc0}wH^ zHH~&=1F=K3G>F1C+zA(Ip~?H%Rb-~2w06HQx;YLg0MoPvh8xz(DB)>bOx65q{4oLw zIDl>4UzMwC3t|W@td+SW`m)-Ooi^@K03fJR2kXrN-5p>7 zz?m5tGkOc_2EnR_O}8&$H@Q-k)kd^qg+aCLMfuwW^0EN_r2V2mTBgk$q6ompCuu$Z z*Ce$J>?@Q~mk4KH@Z1>mw4@#K5y1F!&k^Zb=Y#RMmYM2Y%W3K?;`xb8T*b-lr2cvu z?(><;+5YA!|A$P@`Gvq=3)t8lRSaazd2^ zb;6?NyCR$M{#Hj*3HLm$l)=YpTHB%F{KNwF{rY862R9LqeM!mO`9cmVfGRd7mEMKE zIks-IUtaN~9x*HZ;v);plP%*!Lt8_0*JoVAH*%zYT}81x?+g0ZIlhF9AeB6fs-qD8 zHxb->o1(Q@9oWMMaL6Wh=ANW&i5y#}y?%MrN!nOaE8xLTR!+0Ve~l#BnE#vJl9iF+ zHyQt*{W=B$Mpg#q|MkR3z{i(x?7nux-@?6-p5(h5iCVQ&x!z3svof|xzK?V;L8L)gEGWIh77nf^kVV>>F=I{P2Tl(`mGuvw@IsIZDs#cz*^&nsdAy$i70LSthiP&p=sdcadmH4I)f zcTwM$9`M8kwx6BAQ(oDKjnq}3?}*m8hAp2smp79cz|rqHheKZo%PM}uN~Z<1+k^qoXYQwhwz_u&wZJ9mE+(~)?yW(j7eOP z$*st!!^td|DFCu}mFVH0#y=Yvm|SXU8yFL7oasMKH-M#QXRAMkvSX8*v-88NbBMj) zGq%I5qCW!stHZO)qnpDhy}gq_vo5x?E+NGq7&2hS#=hh{y`RMK*uAS)#B4NCQB?~g zh`w1332eKD$9X^LFruOWG(WnYJ1 z5P^MF&XB!q<$vGPQsSKhM_-bC>=U{AkLd@y&eQeWCm&wV>c#Hj)TgthCkkIBVCDed z5fD@Hvr`~gNIb>-4U02QX^nvb- z4++aB`=@l_b!Wf9o5J|M?MGl>aPvqP?z742;_~+FXHWnC0YyN%zxs(jvYUN!`OwtN z-OkMTlOF4b$@~+2q__A)AL3blqL0$7KG8?n)}QF3q|cZPALnd7#^rPSqek0L79U4# z|7Dl$qXfH8^a1o8jBWl+efIxt{CDZ;KiGb}O>^5%HR(U9x3h9~{0#SDu>V9Ka(qg~ z_EGz%C&ORJ*yUfeVfgTN{P>do9sHv%M=O2DPeIu}82k&L51LM94#uCQ(SKCqR3`p0MY z(txW4luCj7 zERS|f`fZCsa-&lwV077&yyC~A4#%MO+hMUc!LK%$gF?Qz5_wc3%&`azFk-@HyAUwF z(zHwcT;ff@X76}l^XR1rbu$6;@TsJGU){b0({TCJM7pPRNd}bvAt-aQYdLx9GO0OE z{bJZ4$@X*2u>e(K^CcGVXZN%3Og#m4X>ry?)#gl8w8Jqx%*m@xAE(MW7Nmo$Fih>W z%evYGu6k7Z8NAP`6?@h>iI;6@JR%aVAyy_31Ws7AFsJA9nE89rw~A*92xts4r~-^L zap<({4um<6!6(X>{wvPvmzBlCNZto2yFxI(tl413Z1~RbBkF;EE)8NjS5h4~za&Z0 zFDp7aG>NAUU4+H0{f3#?*gQ8za7B$O6B0~X$2aGH&KLglk- zUSP#52`2WdE^GZ7g^l%!35NBkLS2ausgJ@9n@*bGrsaLi^>ZY;VU!y9@DsM183dE- z)2o#<(?W=2+DwjU<}QAef5mk#>)&mv%21ZU4xXgrF9nOtjBz&y^!bnznunm7Z zlv|kVG@-SBGL;J&bDm^l2x57vz|0SC-oc8L`IYBO760BFOlR0 zh@irIJtk6JA@uBNj88Ux%kF8MY(_J;GLjOl`0agQQ`)0z+n*Vpltrb7)&4jp$XG^R zOtp>q7qoZ?v$wUgp7aH%!`mfXdiy#3V$jW9qrj6+KO0raZtTN~X6GE*ZC$QR$rjqj z$&>iX^G8Hng}FOZJM2)*LW31a%{CjrIQAR#9iCU2<>0RB#u*X#j~5DdUHakI!na}= zk)J(MgmzS}tsD9|YJC-aPz7skEQJ!jVY4RO1eat_*6YaJ)dgBzq$c^9ca1K}g(#lw z)CSgf?Ph_naKs)*j{K2s+hrH&Eod~^6^7!4xX_QO1@0g3xG398V!5)jY%^weuTyi?_69tBV+>f;Ave&c|8K2ev(1Jy=;;MvF?lO+bBJo}Dtt zt&Y^V)0I}k6^l{KBz}&$GY#j;mScwS_i$N(u-ks`H>%bJwXgY-igLr7e~ujbP#x|V zBY1RC`_9-To5_lO&yE#Xw=_=J$2{*d6B4Ws&g6XDe^*4p!Fc?5u4&YV(ka)ZPb40S zH=dU^SPtH33&Td;WB7ps$;)RpY9@?+Q9^)_LKBXt8*ACnI>85aTH3Ikm#Wkb5ma`o zA2&ERt%^iZ4AH9*&8Mvd-=fr8f?qT7qI6?1D89^M85vbrsQ%vBCaC227EqmBN{C8D z^2W8fc|MieN>Gp0lUWL|!g=-5f$;{q6DG(7=c6XOI*_K>|%TdA73JAbhLZuhjq z83k&_|CbiC9awvIW)Q@|pzy3ig}GM(CDI{8dWUc8!6MwE3iTGAp`YVpJr6=N?+QGi zx)IKGS>kE0RuP-PgfHB_p&Qp0z7C=c6wy>S?WyZ2F)=@%+Qv_TP8IQ03C0T9eZdCe-@|@JPWV496ay>waG2kbmVM(jR7~`_Y zGMtKv2)Tcc+850nDIvO|HoOeFdAl2qiuDw3M&^Rgj(B_fv!>d9$Dc=UpABt>D7q5V z_be6(2?+pZ+i@(>mJ6cuVlcCO=;@ZI4~9XGlKp+2;}A}nbWM41Gq)OpTyL5YRzGk} zYMrFX#Dp>K86{X?u2|$g6TkyvO3OF#UXVTHF7F7kLck&~sSZ@z86ZMt7cOKae`C<# z0!ME3^SO9DuxotQjfjAJhDlHPiYR(326v%V_D7Ewd8GU3ldr+&49 zSdrN_2R3wC%;p;&RII$Mik^3^pvR+F>+!F5l~a(vO@1$fjjLy{R(fd7eteFtmeUm zvUFQMdbD1}3Wr$-srN(qzk#!UW@`3mz7aw)xp z@p}ByWUIltBj>hl&kkpIuB@FBv68?@gCyGpGV@EvWON{uU<-gBHwZ;fDm`3rn8!g6 z!w^}xqp{Fynn2++mdDG2JDNs~^Ru_)4{jVH`H=-bKd(8d@rye3l-u^zyi%50>KZlK z7c){#`Vrs<*B|S+ZrYXszvz#_`8HN3Jq&$ogJr@yCh($j<7l0R+=q@CyL7?%em)qM zi#A>_wiWV^Yo)`)v8*A+stXfgJ-4SS_H8=FgJV`)_&^b)d)Y&K)C2T<(80?PG_8C2 z>Y7DGH|k#cF(Zp(C1m3C9XF$fXVf50eyX_S(lziQY%sz%9o#G|;$WK-(dRZGNQS{| zYvR}GcDbT*vk_9?v}s|fWPtat655=dJ~HX2%SlD-yCgUc2%Sz}%^THiwX@L1~C zyKhoL*0s27^DKbc3LUK0hcPZ=3P0R$81&xL6%=#7qf)SYNfS?`4@f8I^2UZKn|X)_ zg{UoQbcCEjG2biB2?f6@_Mp+Nn&j**Yv$U@ya2!j1W2#IqY?k8?vcH{?m6~UNzT36};|x zw8Dy?jZf!ETE%!5Pl(K$p5e)qKNG4RP6ahLzH7aRx5N&$D+(#N4tNxrpH_bj!wE&* zNb70ymapkUpgbhi+Osgz>gi{CmzH#y*iFt#Q}$V$ogCR7KLWmm-{d_6-cU$856uT3)bEd zV57WeGrq&Vy4zA3xQkNQ^Sh8(SZ?=xxgz!Z#MZjCON7n9l~-jxd5v?L?(39`pb*YG~dgOUz*mfXGoBNM?sEKE#$RpYJRE?cMOQr z6-(T*)ZRH%Qp5ZSkh3H);pWXM_$;*0EZR5nJ!mGQjuu@KA7}7rp4sB}eIZ}Ju%-2Q zJLk5PE8O_TtlXA+$BZH3G8K@rLI3#lO$kAHWGjrIqUq}hode}j)&4rks_x!Z3w4E3Z-nA)tMwsHN^b0H> zQrTXS<3XT_#0IugC$FNwy3R1z2qIWXd2(Wl_ewt4zF7hJqccO&u!1SL&7fu+YRpV9 z050V5-B1xi(o8nmu~*+D=g@75n=_!f6RA;bq@hz~960}Kp4UR-72XP=v_ife!Vwjl zjfB|fp(0LTq2@On=XoY(;`n3K4JR()De3Tj244!e@WXha88*L0WeGu@4VG$J!|i0M zo2|d;R_Haz!olp=j2Q0e_Bhm-yP-dN{B)wPC>2m^Ipd&fF++JC5q~=`4paZ2?$TRm zYw!qq9GC}?jCv#F58&O2s|2PH(@FN9NGt-rWiohPEVcGSD|+U(j6{fJt5dS+s|q9U z?T25t$NNXK{dVYEFp(f>q4D4!F@u&?j;sUpblg;dpsPD~2WbCKJ!zuXuim?AepqB&%=A6&*O9q84%bj53{+#4y{ls%P!<9 z-m=KT5OrER7C)}SX_Ap*f!|Z}Jriw*4d$`A%WLtFHek9KwZX~99GQK_CxEJY^%<4m z5tHPbCzd&ehsz~*_?pSc)uetV1G1PVE9*$x+m9J8ehcHPvC%VpCK2`0c5`>qG|`Ku z+dGeV=B%`Jhf;upMZ9LjRAarv(ai6*=D;SZIbepaDVoHqn#Y9w^8W*LXmVCF{Rr6A zg}0o+E+viH`paLUcy`~m=4n86%$ef8>%F<{rdtrK~F?Oy8C`qLnHEsE^ zFNGarStK56x^W`%nW2>M%qKQrr1CnZJ0xkb`6e7dxf9dR^%*^kxBzjn!%LZ1`>H(s zeibmOP+yw+F()qUN#nda1zJTZq491Cp*)fc%UUf@3MI5`bhdG|^T6!EESuo&_W|eWl(BIPc_cHD!Yx;yA_piZWx&dhefxX&mK+lRV zU26qpxMrHlX2nQ*52F2ax}HuEe66}#`fGxAblo;N_Bg`@ekS)cQc?MkV(?7UBFif) z<+nKk(JFP1rlgV6M8U#a7zyy`LTo+W$SBaRY~Kq{`2FSmA4ociW-Kd6E*>2O3b%64 zc@VE_ww_K?-!@7Y<-b)3ZQ`3FYTjh~I$}_4?@^BpDeCz;9Bgqd^U# zHPtxTK5q4@mI{Myvt)AcmRZyHTf$dIO+jBeV>xbnD*)XV`l}>|nO32GNi%Bf500RA z<4!?=6$FC|U&Bfw78%GL3-*m@-KPeHiwu^g*Huw1SYRUQfM34?^}mSRkCF>=Yh6co zCZ<@K{COa?*&g-tHUkqN`~#@i$+azsOun%n27m!)W=T6a1{9&Wy!s|N7p*a@_a#|< zwBE5nVA$C8xhrju)XU^ zVRJ=z>zO!RZYUbr-@I#Y>{MW(|D?SVhC-@0se+{p74v7Qd^@kUK-0Weh&i`$3Q7G_ zv_Leb3Io!?JZjvh7QzPEZF_XGz>QfSI4*+t7KQkuYwR?STdgmtCun={fw;C6(!$&W zBr?QqADrm%z8vzKQ5l~7+=%UkYOor+(!f};acf)V*CO028VgyIoD4qm=k8yV)|d15 zOR5r+087blllmvwQX71636f%ra+!FOtP2f<2^=|Mao*||&d1JlvZ-2rfu#wra=Pzh zaoBo@YS@ggDdmWE%S)-o+Z|QDRN}fzzO*?#VBRRPXPSgKzFZ#!ep`C&}&GVA`^_Y)xw21rNe%Q~wU5beB3H z>@gAaE3Uo?Ldm1KqKdCq*nzeTF&tP~`(w!$V=X z);%S-Boac$VOoM<_M`=2f0*xyknB&%0>MN@OFap z&Jd>YIZN;aaS)ZM8pd)yWh=jC803cZ9sFGKrybDobpYfFhY zc0v2Jl`5SzO%2Ehw_*gt81#ZCZE~RSX==lQ!0SxqgT~a>Ug-4NYm)e)c?oKxo0{y7Q zh)8!VM@#fe2qdZY+B{si1!xUuXrV=Bd^dbI_vnl_E?}ywA1VI9-xLW1NW|o9f<^-l zq?C5NghDINMuz(iTD(Ek3+vi}_24BCUz>8wGE)woBK-IIza9nt+}{zwLulv#)vR>y zWjj-uQ6eGBXJAGSd6FaLlPoz)W6Q+`h`)G&M(46Yp(j#doWGbl-7Q1br}QRT72tkd z+=if)X%PZHk_>LvO}Y>#Iv5cV+UfGeWgP@bj9rh6zk6dBmD%JtJ8?I%zVS&(yL-1S zLy^0EP7^3CV}ZMx6;H0JLX-Iez3u4H5zoqti*M%3RO4`2hmd?E-MVD$g}?}vR`Y;! zvM{9Ax?+=oehnSML$usEoG1(w84_)$u5*4R$<7{du;gm?12@$e_0;oedZ-ocM|T@R z@_Ji;ShuaKNdEVBn*R4!86o9+jO;SV&28YcR|SmY{RFpc2N4nkM*^kyyRO)*VV4|c zJDrYTuyj0ZIMI}LcbNjGp{bKxHSF2YWs54MrTqk-b8FiAO9gtyB~;e_%stMd;Yvd@ zzbd!y9hQS{@x2X6q7AyZ2;Y6$b}82HO(fII{uD=U#x63zyZ*4ibc9X1l`0~N_eoqe z)x6LpJ~f8fpfy2alk(?b#um1?<5SB89WfkIc39(F4FuLaF)h=*3jy4@)%K`Kd@ErW z;;li_k9||LYGdX>Lz9!>0$aTtTrj9^b0pLeoxWH;z=0~fi-2;~abgJmb8&t#M-T}p zV`cOhGacTGjRKjkRa=rTcw56;^IVLrRa61jAo&#pMU+#N-Ut$Aw;3;% zhBslfi#i%v(lR3!8FiVCqiAO(gVcA!Q|mzBPiZJf&)(8s!A!w)6 z@}RtiB_)Gv?6s0LidRXnbW?DGP@-r?L{p@g^Elsd4hKi#-v;jAo7rusb!Ms zP6c;kHCnf$y97QVy`{G(N|0d2s1{y!nt%Zk>ei>@G33?Cvuvl5u=Ax?V><`|-$~cs zLP+3;VqYHwz9B*FFwik#5~FhiTiQiaLUm4Nbh8+suKXIK>K6MK8Sh}fo^Mzsug@ZQ za(5UG4Qy(v-!+ub?MkbPboKeND%4rRT*q?{QWm5Y%OK{-ZB)*EXwV(4{lRtsx~ zmOxGg-C2R^l7zP#m~G;>X#SaVVBTCD2IS>TRZEY_ zU+5^oh?A_42H>SrgAFovzAJ2-M9birv5}W00sR4J2-2Y?VO@zG6FZQH1PAw=i3<;} zv;`D8GqsUtxbHfw?5J~OmW~KF8sxju_gf4Gy4A|qa3Jusj%#^+BOZ*5O^V|$4Dixp z5U}Pzwg#`mNloZfc3iQZsQ`9{V2PvfeI(;S{9L@_Hg1&+!}sA{3W&1e-s zSUeK!r{vLxS&zyN9z-1jsVM{I6)zBnl<)Imk_HE6+rrL%CWr+J{QP-=$)SpwWBqZ)~7>T^7khl)oa#GPB}Q zU7=lYiz8ExuM@3TC}E=uvGHLp|gW8lcNqgU0MC%vp03btIN zYwD`=ozvP|JwMECPptT={tjvWGtjm8O`!1l(A!&x2%Tq`g1WV3_xro>Hrz2?Ob@L` zH}HzbWwLFn&)!d%V6DjB!9WX&FARzrmka{W+01x*?DSkJ*bVr-sy-fVi9yt2F)a$7 z!Da&dk-vf{JIx;{LLfX-aWXwrWb!IgI^vg1sWQL-^3OUDY?=xJQr3CCHR*Pl-;zP)QmMIcujjB@Vn74dP9$T|vbtYmtA>i}R^6Hr<=4kl+slL>> zX7j}i?N+xefe-JAi+pM>I4H3}Q%t ztJ=5Tq{?*;{u1<{4-M8T(91Use*9fq_qEq=@V5;(TRbpjvcD&)h>UmF!Ocwr*L&Ev z9Iq?gPLSBK-ftoax^x9rmPAZJPq zrQ-+Dv3b9YbsIM?eO=Nb?r;}Y*r0d@=Wa8U9=&F_(62Bp0+=_M2mK*MEk1^Fu%V9H z*J$~EEIZ7ICIQ~N)s<+uHQqx2E-RbeD;4wUE4*@cw|k36q=FtSow<@PfxP~z2KkTt z?5EZ8aTdAUAP?-TXozMiI-mtF+&vbPCJA^HsR5ozkJMTF5m0IY?MuFi%%Y@40z;e= zoNAfsugp5x<-Pr4zA|{12)j*zNvx@)b{_Sz(o$AP7TK9J9hxQZV9w#+%|rI+&z3f3 zc@hRp&UtN69T0x!T1e0#%7Rj6lP>_=3uQ#0L;hegPC*%|g@>GEhA7I~lqE@4w=Y(t z_}K3Yd0V9^wJSfrbtD;0+6G~2vM$DrbfwS;F-`taX;nGBeF8RO#7&$9^8>aQE$=wJ z5Q8S^Hxr+xXH)RG1IY{mvE^)#pPYZc`T5=9%p*l^;`WiM-p5U_W2U9kY36wjcYn2^ zdl+Fp2p+on$31R&dVVGXr`-d)!Y$NUTVV-Y-3aT?P$P#v;4W0q@A0J}{7Oraj`#S@ zBP7E$9`sH>mYz`vfAkf}PQreP_+@_Y$oWU_CUF^Ajsz{4~^xbJG9@wbxHC^YfDQR9^e2XDPXLNuo zG!A8PV{bnzaJ|X*E-KtfXM_LJ5*abLp#l#QI)#hNDd?M|=Q0V%gmX}-7a|rTHcv2* zICPkO(;U!3$|8cot8dw%i@9pgAE+mn78XbWAax4jv_ZL{rO7o@HK6G=ko3afbH$KhSi_s-CSiMnVqX>`Jz zuEkQr{1i4%my_4@5GA$Sg*L57oRM~4V9*?FTjRBtlttf=Iut_C4;XwJ>Z(ATqP-$h z$>Oyfu(!<9I?M~(qWm04&;PiacQM<>1?#1SV1e3WjXEl;Oa9Qq7tX4Cz$1d}NH74@ z8QzM2y-ywN3;5<5EjYK@av(xL>soo#A!I&H<@WtVDZYNp6!wj9{yGuh<~^q_UXBe( z!>b8sH`1Ic*eefh0|{>Ub_mtkCx)fZhdob)VvWr4XJ`oQ0=huX>29K*gJF9z3=Z9C zC#tw}B~U6!jRIApF*b|`!es;*yIJ6@nXT!+na!VPyIfT-NBGYn5IT$DXD!f_XtT$I zBF{x;l`@;%s{89h>bqqJeB=!NL&fvCoe)0RyNl$6#_mhA`7H>Vkp_s}cljey$(3aF zkR2%T<9}=w*r!-__4*9U2f|q8__Ye*1EO!K5AB!gR5o%s#&C>Cq#$o9cJz01&Ow1h z>|jK7fMzh(%WUVrL8G-KNk>7Nu4WZahl+Sg7VdfFEEa`=qI*!#bcN0{oLCwwdBNr@ z_Bv!O+@Hx8^{$z@#ns}9RL4jas9&Xk@Wq-Yb-c418Zr=`p-5c?Csx8B94)O+?yGAo zxSC1F4j1@MKw1ja<%qV~wiAJ<;o17Pg%)$|7eVy#yhxpY5#vTy`)w=&qfv;Gqjjsc zyyi=S6f2VCj2#IZE59mbMqo?g1%i{?ahRTaqF&G5esT=`tQlHiTTIvDy?#h|Zqbs) zE)g$z+y@%oZ42u9P#PVjy5`y`L!W96@F*iy5}wXL1Acg0(^hRWQ^OqFV3wz0Zm>ea#E zNy?dxl3Yr5E@bjYyt@q@QcmrL1aW%pNo}`$v%}Cx+S%X(iF5_8ZfV2Gw`W-y!VA%R zhXJVc)!OUXz{c95#nB9pL3;rUZ{S~P^I!aiM3Vd1-)uU_Zs~kAyxHw2U*%51`F%=p zP1};U#k%mdkl@1Eh#i|_1&uB$O;tv5sEA@G;6SNnTE~CA0MZsM9j2#9U3?(Awhq6mRh4aaHr7-NlHx zIjCu&GfDM$^as*11Y~*xgq!X3?dseJ^4`51LG{LMsyREp+%o#3G8Ad5>oB~Nb<^#0 zQ0waHFjiG=fPru93T|41M2fT)HC5|}m;cU(qIWIxq_W`O2wX2E5N(5!2v$_+hrv0y zdW!sJf1ATdo$7@m8cqD%Clo>_Yc4%YPkB0BEkS-Jrz`3ymlG)EfZf!d!_IOwqPM#JKMDr~!1a@7&BJYY(R}JPhe~ zt#R;syXuV{w21!*5bN)L;Bh-Pk$#Up8%co^rsF}evlT)7%{iI63-N$|!RH}zJFr76 zE!rJ{i^(W_xmfA_EAcPxGC@Mx?>h^8H7xkfaP`j8^3SuQ3891fl&o9slwj3Yjl&Py zn}ViFc6iBzi$3fdxG(efoGW}*H+AVSzU;83bvQqDo5(K%IxrB$rj}7_cZx+}-}#xy z{|v8@kk$MK?kPXJ^t|#E7ynbcxq|;a6t6YSFDz1f4bh2~QJk)(xZeVqieaT~l)#>8 z|6a8Gsl{US&MnyWHv*qs7a=+@UxB>!&m(Ihb1DVOhuvpkdPaDV!NTKFD~@?AJiB>A z>Nxjn5PB9|(Ds;naj<>_OWVlWP*-Bp+NuF_j8vub!(;V$>r4<^O z{+>fcce09EeiXl5ysikZYv8RzLNG5#QA`L%?KDd-HcL#s)>$rg`r~6+lnvxU1^&daRo*0oQ@}cdsc(FLb)+ z=^2T93;xz_@d#`V;w?1t7mb$38@_>UbX5f85=+YGSjc$#v5h!fZrTPTyetxRRz8<7 ze;S)vqwQ6wnBmmM+%JApF%@Ym0{y;;Y;;X;(pFQ<7Tlzaw~~{X;Q5yi3Os#FGqCk2j*eq4RuSscDuTvRL`mpHoGc%2m{w2qvy-JYPsaX!0KQ!jm2ZKbV} zZGNqLIqr2&6Z;~c1{$VvWud+V@nx(I_LdG&Z2DcVV+yj6kOKs0+$Yk;!Zy15NPB4j z%bp|VgpctdvMv9%r$B;}cQ*J-k0b=J&Fz*cbPU#}=!iy4_H=-M6sUi|nH}yMDx|eh ztcXN$-6K>3IC0+3B8+MF&hWs8xsno5T-J9J6MFl*tHJV zWC&ThKpxX=qTB%kEIX@pbQ6Giq}e_cUXDrEMUv%NuM@;ztT?U~G88EKky0@Ei3Znd z^E$b-skL_P{QYL3Qu4RfSIByWH+-gdjX>JIpG(;r9Uwe9SIn)ex+7QQB6jT{t3+Crbl~YSM^S>0oO=D&l=Bd?s1Vi~2*btuEgW+~jB;nRqVkS_E>}CDVGnU8--x)<=c_ z>z9x7w5@%74<1G}!ssrIVw~jzDU#r=oT9mi4}^(L9aji<|L*VAYdlHs0NCMd@qp)w zE~kgzRT0OOMZanq7EbSK27wz!E`dkTDh$eu#4Y^W(NW-48U?!DU}jSvL1kNN9;C2l zqQVRnG%6%tIhi6-t5G@WAaj15C+*hm^eaB!P~jz6f{EmRMW)J)M`vj0Mo+2Pvj^EU z2#B4X^Bh2w8mLN9S-tvlXgd^888Ec`xV8!vm2bFJN2X_rC_pd1cpZ0p;$zU|IFpS> zvJ;dyI)kDnbm~cwAu?>9dX&P66=|6S|RPt;^-7 zM5V(d`-52&9mup67qq-t)uDcOJDE(G+&P4Fw#8HQ=1PPV4(((L9 zcSpKQ6F-j?;|(n!m9NaGaKOA5HQU@Gk_RnqvqIZxj|U|)&m#Vt^zkJNh9$9`Th3-~ zlRAE}Xqu+jgQwxfZxt2x;YC~tn#1T_GH2GjEe){m!ozP7C%(b!!}MQo+F)9|)r!cN z{WUvxPupFB@bH+{9WLI|w;PzN71}05Z1MTtF>iCamBL?bYr;-1<7S;t6Pm?QX7b*% zmQl}s>xf80Q@ES=bZ*IzQpEK3!!cyCHH$nD*TIf`XYaDc?A};QDOOzI}4hu^`pTj)fhw|uWwPU+qEnopP z9S-C}w)Gf$!Nvp!+t?fj9n2^Xd`a5RUWs!M>vNoZ_FIf%s)c>!x#5o`0!~t*ikkVg z^F#u_P0JKl$ec)UhH5()${R{aoI`4uUPrN-)^9B;VHkCCH}34xYbQr;CsA;S(^5)n zqx?Adi_539X|g5CeJK7BhfA}N95hjF=d%Vj3@f(~0dVKwKg+|hcPib~^o6!ff6OS@ zAMUABoRyO`(c_~cUSK_cp-!`f&t#&`!rf@pwz)9h&pPVfolxc}96~j?$m(f<^75TJ z0HZDlB=~>7$zOa!jef>SDJhaFdB;of4p6Lkvt z>rG&-QlovLmnxSdMz00w0P4hmWBQ_iQu^E3!0_z?5tl6^eo~z^zIU0ywlf+QLH-v_ zc7@@L_K)lST6_p*!6c(WtyD69yzz0;%oV5gfk0-;clc6-U~)eYHivLSaA%o|){!vh z7$w&+!tM7j4WrEKhJasZ-$=jq@UX(tB{lYu(IhWTb(ifgI$zeQ<@u`n1G`J{4J+`(=>u&gkgS6H+p&!4kW**7N91Oq02~1$<_*8&$)R(_E&Q45Ru4=vuJZ9n6Ay&rS(_e$Az#sa3Tr-W3Em1brgIrmESl%mZ3OK~ z+;5nk4GXG#htBQ6xY4DK9X~SiForBV%}kd4?{52ugb7TFA6q{woco@Z)1;0XNW@=Z z)tfwq-W|955v;eNVYbg_9Q22`F6_ETEnVYx@i&FM?;Nj5J3#UHRSX&)>k8qZ=$?sC zxaR|~mDvxy%UfVo_l9QSSiH${LT;b4p+@I^A&z=GrZr5EZBz;XeIWqT6IqF`1@;!U3Dm9LLF+lh zlG6A(s*QGG?4y5ZtnsUX!4?Dg?ax4g_wd)n-092#z($=K7SSczB~VzKq1p* z;IvX4+v{4k=NzpxcjSI(f5#>J)|Gy9c*}w``}tRxe5c`egRFi1L)N*H#`R~DZNS2}Ov}wqK zNj&t#++~nrVL0~1wvc&myaoit$Tabz3Jrh8DzuKgICf2zYzGm;JSbs1*Wbg&*Kz4- zJ6?bdZhUGM7D1(ZCz@g*ar$vA%WT3usDF4(n3DkW2#8pU##2QvzI@yWn)3~-TlU$L zbOOtdQ54R`Nw+@3Dep_?i7fcd4XlhN8w3jTB4&2om5(<*Z!(W6Sj6|hAOlcXuk3I5 zLT2B*<`}^(`@Iv2&~61{RCU;(`k#l-*e6NSZxdoR;zXJFo(Nn{Ioj}*`L}c3F5-Bq z$d7h}{5Skt*WAx05=>zF^6v%rtk<9=*mZr-Z)X_~7e>}!74wyqRUlKBYL*@wNLmyZ zJwjf><;LS)R zm+%DdUN|$n_qnr!s~Ldfv5YDwHGU@nxc<4AgRIZ3=U{$ApW@D+=BFEr*r}Tp=}z1n-5mSCzm@TP~}Fs+sq2>v6=f zH^3OrD-pa#?TlJm#oP@hPxq5`vlfm8HwoKO^X^+u%JK93aOzDP6Mm#6@d006d@oz^4}}2H*zUra$WE4(Ak%t2;&a^!QD{Vh@#-Y6rK~0sJ9blk8lyby+Y-IaT%9#QhARwj{x47MR01W(20gWi?h6TD{D70W$KsFi*|F99E4` z{28A^wYiN+Cf>vDA(D<%{e?7lh%J947euuN1CePsSk#7LN!lbC*?)z`(DhaYmb)lI zmtCVB|A2=$Uh=NWS)^$&Fs-A}9JQ-#N~hg*xf}BV<#$*IhTgT~Hto*j>bjVAQ)7t5 zPTN2d@U3EdL_z|nW}7@+30+JxMA~faA~ReO=H^z^xY|PV5~}1&oLD|s8P24UFcK*= z+&FSh#$J7c#J%Q^eltz9>uV16uEJHjojG*u#bVAQ-xy8bUaMJft@&G`WzP$$L@GJR z#O+0*qOxb{ew4Y1pG3#lQBPrbG0WnYz8AlAzJk5N`LS#k;MQgxJv{-BZ^5X!6z^Ar z)q)Wi)tz))Ti+el5h`{Ud8Q4RjJJwoL)uAMR}#~2;0c{1liF)XIBP&Pv1NAy(9+t% zO9owO13*?2LV_|D9A=zcoo7c6m;e?aFd=SELC8v{smFEMV)lS9A_a^p`;ewZogRO- zS4!W_FzBET*_b6DQKT)nHh3S;a0KGA1=Os(wXY#sL4TPIR%OK^u0?X0Q6;v+;(SH> zg11MM9MUS}w~aE%6cHYTtNT@R*@uGp$lJ3mFHMT}bb33>9?x)7!|!IMRJpyDG3CGQ z$(rnA9Awk|(4625o5$6s6c$5r#P^0XXYO+set2cY z4MLRbQ?~!OX@z!a0PbZpKc_gyBqZf~+8)ATj!o#FO0-X?m|B!98~Ya1o;x(x>Yw*T zQjGzG=SSKPzOcqR92$S3grF^Q%^9a)``O>(tkA#jRBALe*y+Q}u?_mh{Gj>-2BM5; zNcoAL>QPd7L8c*Euj5K)Uu#~;@=y6^A9GN34@GBiaPL)nmh7m+p~npx%FbJ<-(vyR z8}+V0W^gV&DXHK8Jf|xJb-PIH7R0=^+TD{cqPB!v$fulnUM!EF?^JbB94)ksc945 z`FN)Up1Oj2<#Ph?rJIK*6D&`Q%fg?be|2OXvpLZNKMy9P0---EBR-BkP$+eu`KcEC z)^Im40o$K(nAyZ6A++`n9+T-A;!`v$s{m@IN@xN_=Nzv?y*}G?N-BM(TR@6rRdAuo zCY_SiSn%v}jGg}lyyd8b9rYTT6Qi{-KpM1x*}tE5wW_|LSnxw&o( z@m+0?i~-$fD$!MGqk=9Gd5E#nIfyT(StiB&MzQ4}nmC~^2oCqpAQ0<4X9!$n?<{#? z^?G~f895EhHIlcImcB4(9QeQ#HoxG~Bb>0y-0WQ~Eo2Vaq#L1VqHUarMhuEG^>ZE6 zvIiTAqW8N8X3{tn?ZcC2!_z>~aWoim@!X0>`%0^0ECb_tFh_-j%${p7yj)3zjS00@ z`j+@ok`W~zX;P(w5}z}g{})^Dv@8n40}C$Owr$(CZQHi3y=>dIZQHhOod04@)zr-Q z3`wd}-JMSP%tPj!_;QaI*!nd*z-dOvwd#Iz_|H|->m1B7g{T6j*J%Lj9slT*Q0-B6 z(UI3++;olIgEavI`147LDa-nwq_0Yl zWOVLnhf#;viq-QL9Q3FB-l73K+o;8>1Y(Duewr>4d%8*SG|CbJk7V-cTqx04EOX}! zysV3fkQRy)f&qQM{o^*$7Z~scI(y|tK;mSqZ`q8Q)D_8uZRw+mT9fi6Ed3PlPuPzY z7M8^@CU)0YSgUUK^7zb%7j!phdQ%m!DV0^RI-*eb*7?6V%88J0>$^9tZ_{LNkvzhM z9HZf#k?ISr@UV2H7#TRG!!e%rj{~i`vFqVKfT%#?&-o_U&o^{JtdTrS{0 zbE%dh{*GX6SiI)e#}O$_L^0{Y)fwXK$}9>Ln-R3?b;v`{t#heqp}fV#zK$*h`DuE< z28xF`qyd{eITLY491$uK=RuLB%XEMbPcIobI(*Q=mN$hPEMebQ3Ftxm3}8&XO5zXb z7e-ih9pPx&p9Q8>Bs{;5fH16QN2ZkT8^0>{r$iKC=$`}NU}3dVSKNaO=-u>9Jz46p zxaF&2oZx|#%|N&vfu*Qy3`AKu6rsaTnHfc z%I5rm?!4QE;@|*KK(D_Wfn!?)TnwsGt%Xov5|wOfqOZU=Iqyr#f4B-5=Ec5Se~8A)hFV|0+RNsi2`=;9~{ z?@QW0)j2)hL#_S>Z&?FioIPI=Y_Eg0UMiMgs~sSpJteb);HQnhZ4nQD#|^?UjZy;K z{^?Rsx2~)S&oG``g$0OmpbH!o&6nBlPB+l*20Ifg0N2=;Rfv|b0TNf-CV}Z|+6}jd z*5~L##eE2{GG1U$*<)|=4B@$2PfnnkTC1({YSf zr1xf11&z9-!CKvPAXiaBtiOq@enb75hWl`9S1|Q7|4KFfUPDgp%g<*3>dFb(sdmKB zR{CTW0?u_JAoQfiL}P3I7;h?AR(^J9*6?}w|6tO$6T4x1IMWY4KeRc9eD9|;CY+9n zb}sJigs3NvQC`a`-|Cy4h+#GX{;_|p35W7)(=#7?DyC~owmdDI$X3S|^<^k$54%dRLR=^Uj>RY>S?chokt<+Gf2ODL))qY3()y`j$Tzj9dY89F#mvr(J_qLP~lUnfWq}RY4XR@IY6xA(_VOp-uWt|ibTeGOyx2B^5FFdT3T6Pu z09d>1#Dc+`{6fRk@~5G=ce!jF_9kbP2 zfiywhtY?CO=@PK))Mk5gya1K|ugH(mW~)bmPr%43w&OE@0i;TrhK|vz{dtsgn7@Bw zMf}kH5WsdtkX%xpIX2Snv|L4b#|#vmnX))0%G-%)M~+2pKrbNqh%gjG1`FX7w&Irg zXjYTrLx%ExGQl}1gU_lo*RMPw@1P1XQZOBn2qI{?4QNERl9abTIiq~#A0FVw=aCKk zja|yC>nbC)LTwST9luv?U5XqPhZ2N))~UDbAjA>e~g`|2OnNw@JOB*OVW{=!0TAin^atTu^u;NOL+fINpdSBce$Poz#;DH87Qs4_*+}Tzq z>3B-^xB)y#jfMHXLIBG8iXEdD?sSKklqJdl@Za40VP=ZHA4^!6h9owWKAPk| za027`;W~s`pZM5mknNx6hq$uO;$%A-lFYk#M-=km7BA1rc_dOK-4W*PO<}{i!3zVCw zw+P=169U@D_8(pQR3QR?|CsEN&({@0hK)NuKm-!rVTJXO&2DLc0Vb zJ$1)6_o&d0QuE|Tu$+B(xCL}Ul29IG?eCK;ged2HOm7dbJepvCz;WNOUppTZdiR?6Q;7~nxqo9^gxS770E z2;m;=c#kYVwop4Ht%W{wXJYq#7m5Vhv|jf*HD!VF^O12gK`%TTj$aU{-9#PrhI1w!>#rU{JM0N@ z9+u5^Z7#KfWYRRYR+GfZF*+Dbsf-G2@Aw=$b94|ZH`>E&VO@nDq zkdWC1qUtq|@~5MW@~=ttqAS}Lrc)L%WtI{|wE~C0yohxU*?xp#2u_=LNe!xya?MoQ z>{i93aflkCU3Si66ld^Mt1e*9b$11ES9d;9F{1>Eon&|X0B7THd8N1WlWj2Z1%est zKt6!yNh(v-v|nZD%PUUxuYnDTJ$u_`TW@+B!>7>YULrV*1(dVs4?9 zS02Ly@4IiqR}wAOH6Zwv*Msc{~ZM7MBENs5l(#Z;8S;*md9{Tdx&fBDZ1 zu5bD|+t+kr^9@masov`IO9~b?dveY4Dc0wd6q zzll!|g9f}3O5!sqLnIZAoZDCDJB^64x+$u2UO&8JJ)N#o(k4jIj$&Ut2$zc2pChzqE`|oZ`!qn2a3rn{=gvdjC_i^ z5|AQ8uWibNYbHHqlsG1WC9z;Lh!M{E`CjEx{NZ(l!`T1UG(c+O*?(m|??mxIC`H!} zdRQL1Y82jSmZmLvW!(-71am_@%SP-}T2B2js9={svcb5RBFgf{ZkGgx4rf)wYq~&T zUYoQtJ7=3-(;7T_iI7Vt{kx+Vc2goE@`g@~44Z6~1^@}(cZ zy{zSal!__eD~mCkW0?rmZGbVAdRm=gRXac`J!SPfj(_+)P1G9jSXHUF@|SHXll^Sg z*0%w`m`VnnU-nFjX%ZEs={823eNQ+g{5S7=@WUj1-_XWfrX&@W&&lVY1m9 z`&rnmoYF9xEY^~$A7YqR5z1Uxw?$qCa-?8RHHU7E&clB~+nJmoZVcyBeu=dq2ktjG z$;E{U+fT-rQZsEw!h3MXK7M-n2ph8#>d)k2Jgc)$^0vGiw>c#=LN@oT8 z{8zkdE>^G%7-t7G;CyI$vUeOe)`VV2ems7typzWkCz12Ca*AS=au=z8=26R3gBr^1 z{jT2ld7nxP`yY}sD@tpGKuj@~yCBPv-EI!!)8h5~(NmO1zhHfycqeO$q7acW~}<&G&B3z4D*;QM&g ze^`P>^0DgexHc&YhRt&v65*XxnF`WWP>GA+1lUiQ6kI_^?e_L19LqM0%Bp1L0UFFY9P@^$()i6({V)|6Y7HNBR+GXZ4rJ}{?>N#hG>vx)d@Hentq_K06)Of zidvs;OYMpVOjLN=U%bO@wv$vx7WTfMlJD51jf9`g9}N>q6;o9Tj=?gOY;FB&5Bf!Z z?p8NLS?msT`5Z%A;k}%e;$P>M)b1ChZj@?e)a&g5SlR{8v!#!GzCcPW zZ9_Zs8tH`o+FOv8`w4c|s@ja^Fb*Q0v(v%QAKwZ#FrqP;A}Nbtv<2(07P6351>%~J zgBkXlB!LMN6?$oro!ge?A9kvczJ_frflM3Q94g53bWJ{F?+S9;UI94foo(w;?CvSd6*vN3wK{AJo z0NoJVmhVkNl5;ixBD8pAieOv}`G7#{h%2d;W8{ltu-efDKOMT^prm^cWc;-HbrW>P zum@ z=c{4%=~0jMk(F<5^ua;a{g?!+u%S-qBcq5V89xwKmZzc1BGL$988-j1hfidL(t#kGNp0 zqBGiossVd2d5m7Sa5VG*Azh?qMkC#Hj#~rQW4!r>Jg^o(ScgifVY{~*bvz)R8lNfu zOY{mK`tEQ_AGlvZTSKpn%*uR`@bNH5Q1|12^c=Ih}#?fD@P9%sYbh(b|2)2 zgrM-eW{I1asiA@w0*9%(m&2xadd89W2 zqV@)i|9t!9o}tm=JL9Rz?%;2W=OJ2?^}ZH$;UPflFF|e)o|c8wxztQz;(K^!U-nV( zCakyG-jHUKst@B1`_Ags*T;QDBeo>fckn1|Ma^yUrn4hueuB`sBTqaZ8yxdG9TOpp zM6C~qsa+H(5&bwV%489#1uBF*D>d+ke;P;{ur26_bMVoyH^W?mnz=q+#wQDC^XyKF z?FwBFo9MX$s*^GlSCTyQ->!a2-oHhB80f#U4=N}2#_|@%Vw#}nlX4S$q&*)!b~F;# z(ekx_#=!oR#n!bh#=r>@0z{b(6iG%L-l?2W%0n=-%^D{TrxWf_2MZI*i;?MN)dgAh zAR{$E1er|FQf8FqGB5{n(*kdofZsiEP0!DqGu*#DB5kynNb3P zVF}?VQsJbj#1%gB#A=wa`t{xcWtt`%3w9I=`9yf57}RMO3rH0jR}n2Ra1Gbe&?L80 zAw+12<-!|=a=e{5eMJF%ZRp9p{@{|vhl`Gc^k1oaQB|(dt)M}CrV%Wa{KEod3tiVo z-$O4cFwi}TnIZhr%SQ!*M^EtKpkE*;J(yn~saU>}Esv+?NN$Xj*e_S~D+Z>?&xD_M z$i+6>tjqw`yktSc3^3S}RiVI~n>^}4!`{o|ML5!)JzoaBs}li<_}}e%A7=AgtxN;Q zjbrs?rErdzcmD)#4jwAV#+&2S7_zcCAk)$R#9Mv*x$)Xq|9^@jO~ip2hkH~_Z^I9q zet@Q;ktN<+x%U0hEd9>OHhHpx?-*T?y@{Tr;!#<8?Z~mlp}E&+?S1HS{{&S4p&?Gp z1sHCTN(AP-3XAT8h%@dYGc~-wUdXW3U)wqT+M`b>P1@{%F;qq7SJIM7u*Sy3Jhr|e0CfPQy5SmQA5Zcccvx_fY9D2>D+dfhm`&~(! zaR2WXksKQ|{5Z6bf>pJ-xx)7Ce8#D*P$WaSgw#4p0?VKz)EjoI7f%#<`PN6j?SGroR=C>Df#S=DS`si{xrkb+1R>!D{ zkirHN$}MQ*7CXOeW82w$S!G`PKK`#G;WhzRNh zx7vHP98=?-I+c=PX@01(`>Zbn$_rSZX2gYt1W)HQ$O~?ovAt(GgX2orOmHI|9&NL& zn4vXUGfZNM2?!SBt$Sd!?~K{ufelcMENO`Tq!EsmXZkV_dIt%~HMIR&w%5(`Z566@ zr(cqzm?k+O$tZ22CuCnyf*qn0E%opx3J%v`rq|*|*WJO6?UE1bbVCH9SWn*?DG@us z(ne`QYZ)7VcbU_C-`u8zD|_U?#vS%A(Kq!!ROOrIv)%Z1v}y-Xb#)`5A$Ob<%1615 zHc78C+I#ivFau6W&LP4IUonx@a>S%1iN1E9&0M13WC;>qfkrO&y()jfC6W&l%)2tQ zbM33D433XX;^fB`=6^l0sEfA&J})jSlZPf^y$(>!{h;asx0~Oo3Wsbqcnk241NQ2- z@dyt2B&+edMV6z3am>l(ZZf$TdSQ?iltL|Ygbo^cM~E<&eLAOk8ptI?0BI%wh^~Z+ zV5Ea|G)eW-2wvPuHyfo^OzR4HtY7bE{4;gYix6&mNJgm`zQ`t5jH-r^e}%+qFv`b+ zzCtXr+`l&Iw*-L>GI4LV+CW;~ZuXz1wIwm`+j6ThC)t4-wk}=^_ilVZSRfg>)*#ba+HLBb z!Sj2GAn-}5Q}+3V~QA5b5;uTU!pw^-m$!;R1 zB0W)vv+>)|@bY9y;?1Rk#M*qWzs;VE{7|=_eoWLml{&^Wd}$;qBf+R1k1e4EJ6QOf zRIbOnY}nZ4+BD?ZsWSy2(jcA@12G5WJ(>V0FQPZB!NmuWW* zo?=IIk1;mXS<;pgP}QBPj-TxE!46KLV?#Y2I#n3-ouDG3(I_^BaB7jMVOTM65`R`n zOwE@VKm>GTOW+F2pH5f03Jw{wO;4kwx_&^b|3WkF@(7W%+Tua`grZ4Qgp;J~W&4B9 z!g;#{$e}Q^o)1hqgZ0+SJ)Bil7aJ1x)N8p!63wZ&8M=JGV;^nH-(2~-07P0n;&TaQfY|?vx^jR56=3&7Xfl|$rYo@4bz9&8Z(W&>V z*%i$ZkCxE%w4%wTBedNszW)ZcQvk)0aaB;MG?M2J#FiIxZMi00#OcAfVmdNE;lTzG zW3gjXi9=D{<6Cf5k~VgUV6rM4N#|6FIZ{TGBDHmtK`H^O=m56Q>K&>@Vs%w{1~fD@ zJK{ImLXLAo_>ZejsL|m!E+Y(?VBwBr2HGU?zc6NbwANl(d2f^&*o&x$s8HwP@37fn z88{Lk>PVay&APBto{p6Q-IcTOwTfV|mP;h$vU?u6r8REI^1Z%PONFSt0Z3(Z zCIxGWW=$M)`x9y_u|sAsqkyCYqcmX>O%%g1DL*a;N^YFN~`bi^NJkejU+o`u6>(aBUWV|EB)#><~fp0!DvF&myMk0d>h5?vU(AGbQ zFJ_5k3l_vpIybW^xuIl)&Q=mDPG?1!ZP#M_&Wmb%<7$H8vSlO=jX9<8!3(1$bK zH>rfJ!dK|gkjC)oED<%XY;6Bx?dV3?e1qVMrtYVB`Cu0k>i=BQV0`xP&~HYiC`U@NhqiGNIM zy)x^|MbG+BaXAg0W-!o+B!|!sl_kJ$f9Wcq@HDUL!=6>0PY&ruuDsWsIQ5uF!OvN2 zX7OeKm|+2K*OPGdREYJID@#)vJ1lE% zYx^^X1DjVvf(m9L&dYMi+9kDqLmFE5H-wcmqnC0-Mg$Q5BASz1ehRIxaSf_Xk6#ju z@FG8Je>^WU;FeGZ8g&FJON)#^AJW#?jVcS}(NqyS%fUWP<<&E~ter?N+}Jz^kT$Q) zp}3ya!&&fatgvSu%)-<)eR5L8BLj~ud0E!i=|`%G(Dt>Op~wo?$b(W@^>Fmszntea z-6oHe*tigUJ*w5p2e!BXtOlN~$2Ikc5GCF47uZJ3VS?6)Z3Y)J+mKWhEqd-q^PH99atN9f zED83Hs2SJB)iM_229@V=ZmInS4fJI)#|X()`IcRSX~aKw`gMH(+xpiLQ_C&s76e0D zjK{y!xTO&lx!`hxgkXLG>MR{BAW;3oKNS7~u74|!HpKrZUw9~qq}+SfyjklBxo<+{ z0!)$bpvsmFci>WpUAtXP#XD#lz+C)SH#Jlh*(S)+o-z}H@R%lTTH$nfb)af9Uv!gI ztaIH}aW-uEaLWz+-t==4u+KySW(>DCjES=MXs^|wWq7U(22~rn4q(0kvK6G+PSmEU z97<~FJwZX!zgu2>-t_wNOex8~542 z=q~(~;->)s#BG3BpJr%>qIM|JdB^lT?+{}x8O9hCDl24T3OcVbKmV<>6r5Ly{vEL> z)Bo8WDUwnU9P&apVncMM>==Ns?f2*T^QQ3L`j)5j&XMkQzL%^=&?uprWyh!)&^v$>>`PvrvWqxoDbhCuAbE@;YeR zM7%aa%I3?BS@x*#=V-lP22!8kIneXsabL7`suKy}CD8_(`oxQ{Jk5B^UsgH$TSxc? zzq{MHv6yA_a6d|^mwWm@%R<^v`NM^WgjgkJ(oJVCD60C*A0o&QKRU{(kH1zX{cr0V z%|&rWWKFT%nJ{`G8v%Hxwz?=1&T~HYBq@}{D8Js{0SK=LRkv9UCwG+V-fY;n{8FVR zktE!}^T57f!dV$q*_FvrPlJJSn3@8>)*^{7&83^*J9ezu_V%uuxt75P} zvdX-mcXIdEog%7td}M%~Ei(u;l}-+oQYbdJSq(9WKf69BFDpV?6Cs{O-)T3L=ouObLJcgVB8Dz7VKpSPNP!Mg zoXYm8vAstvC#t_)55LD&5HK7-jNT&jB_sHaojxBCwz&hDTqzJryZ~MlI`*^bQmaN! z_6V(1bXk0P$e4@ZCG~V%ntTQ0scUWhnN=)o5%=R}F;ldNU+lPc|EFAEeku8IOr@j$ zIBs(Pc0q)=T*FXv70|Pj=t3u27fjxfYN{hTXKs8Qk-_Tq+K7?<%ZSQl_Fk|x0BK0C zrw+NJ_md^`QBoqCvx6~&oRyj$Y?9R@JJH|5bnH1OrGQ6(IFVO%rMX8yE0(Mw3cL!) zB@7bNv=UoYhss)8GLf(;VDS3w$wM>_b+U_(uJT1zR}hfszwdld?4<>lWCkjcq`m~4 zBI3W~wke)3__pELZl(hW0zvYsxrv<6b>+1%J`1PgDH(!Bqu#3x$VlIB?FXiLpgzye z2X;B$RCb@ROw+A7iNOlvRc`hD+ohK9xy$yC_C3((~x2~;a zRLjI>+F&%Pf(3fU%j1NMHa+HFAo3!6{R^ZyR{GkJPZ{=nw^`wfnb@_a-9m{AYyObOe@YE27Q|A>y-u$__ z_YWBbEQcdJh!Ld0T}&L^?(qrhe!7^tJw9KV8+NF0$K|5ZHXGX}yNE~|WiPGxG0Pfb z;T>jUHSX!?cHcCUSG4=U$3a>axu~5`LqewA2>40ME2S%(1Bl_f9zBF=D5R|}hDcz9 zdwtqtp#f!go@rt}q_Qq6kVFC!u_P&q4Ox|;a=TuSk%Q7J^NbT<5@cwNNU=2nVDR;= zz)OXyw5x;jSrQ8~I0WMJZL4qUgFpaqmKaKv-nv&^{u6q>wcX%nhfvca_ur@~r)W|QzR!ispo%#El6y*RbBJwD3L*ZP-` zDc!5;Ta0#-;JPxAkXfo|59dDOr^dq;wcFa*e|H|>H*AxZma~9rfamn1k}KDEmc7=N z?~(GQN$s#<$4~dN;g)Zan_C!nV6z~7ANutI^)^R~$`RO+Tvk5zN5vOr;*~#Hf4-pp z+PgF`{~IMAK(5^P@uik9m8jM~BQwh%V9*8-MAx7`+#7pjvgmsT=-^Ys;sl`z`yM~1 zNz$#bBw08K4G{y__5tet#=Z;sMzJ~N)k@0By&^rdB2l6*2MWBDU|Pb!D5Rr@&n{%O z8y(}WfG-=8%rh9llfD^^Nab1;?<1c`Su5Xv@eyhKt!8x&QA;pc>!JzGy9lSoqFv&U z9gq%_w8S+RUwvm>5p0Ca^|wle7J;AVh zJw_e~W)M2S^+Lx`YX>%0z2ne)lELJ%bedWEiYVj1_3`zOyk1~7;VItj7OZcnU;cx6 zR-)GMMuUHbb##<2`$038w4BG11F3P^KxGC;pIM^2Wt&5WQVFu@V!SCZOplsRT`D)z zGD`X*8jXURx@Zl#{_SyKB+4xnE&3Ddip8-eAVF)9Z%oG(u|v%gyW-#})OidTr2KFm zsS4YvxFmB;WBv_2(4PVP$2#HaLE(ZBX}Tv+%U}{Qx7UxoI`Cu7{aC}ZxnMxNODqVx zl=6jpkTz}rZg{QVkFQJwban}Q{#7SVmEbz4!Pjq|iEc6PN4LW;% zqg{mTQADoT;}4)1j@a6Jk}DXKHm!j|F;`}eK#^&Td%FMe9oK8Bv!D$@Z60G%XYah* zU`(~-o2_gxq1emvV#KSBS@`A00*k?>Xn$QbR)sKyk;rbrEC>E~$|Cs?zMYZa@&U~o zAcpWCJ)*^IepQ)VGn1(hRVUZSR#7WF6GGH+or%yWM*s;S6{Dl0`3hETryL9-=h0)P z%kNQ3@Jw;cQ;|kMZu#E>Wo{2#{P3j!>#7rMwPC5!;}+C) zE_r~NNsuy2Uvu`Xi6Nho%SN0$HSxB1x7`Kmt1@W1syjHDPwUA)+w9Vp_PD286u3jC zn(U(E-zMb91h`V-Nua@rSfJ{UOM5<#5Zc$ulMtTd45eO)kCSl)0^Lr(nFED5%FB4= zk*B-*O9q$Vcfmn!H(UJeKa0sHkW;l+&C%o-3<%DrxBP&|nA-B0_{$m&?RH()bb53j zjGiH5>Dg`|TvMd_(jaw^Exz-1t3-g3Fm;RwjBPfo0a#K~Yv+c7Ys$lF?r1L%hT4z5 zobL{@tHYgTrBS#6^0;ys{i;su+;qVxSaWN6eo%Nw@S|4joJFPYXw(*4uUq|TPgbwo zvjm!@$IC`QKqWTrk6GVTR&~N&Sl1UjJT$CP(>c{dCKn;&oHL!I<5luIyEAy%y!nxi zi>Ctltglj-QdMgZ=WRfsaf5@$V1YgMO4lvJD@n>Kqj1`~vaS5UzT7Y67;-rt6AO)q zQk=zKDo!NV0F!)~JDciww!Akiz6QI`VO*kxK51P2_y83qb(u_Uv&|Z)WSEZ%W7E!3 zI&#o7oED)(LsH7+Uy((|A|Gmon+AP*k`36Sh1uaG&s0L=!sb5pk;qxz)5gR0zEV&B z$g;t01NlQ{T=C}J@RP7U@=4Kb!OGr!)veCY|6!nqoy@4{-->}PO%7V<=%uQ2JqPw1 z&t=B)zFjpr#EiYM(XH!&=mP`sjzb%!6etCB+lH~GS#;7t9KKHj4f^BumddbOnN*~ zg#6WQ-XwOkx9C@^-M7QhPg+1R-I5jag}*J9Q0}*9&X#g+hHJ|SVa9juFSa*cJAM_w z;Is-?KkX|}y*at!da1^+9(adpoV#7}HDp2)#*!5hR*;~pqo3C5!BAlFcu>>0H!L0m zTvsG{02iup)Um_2Swo#;j_g7Bvwn<|NOFvs9-0+}b^}nhg>vaOmyK18J}^WLiDOx; zh;c{CoUx~g25B-*v>!GKU`=rAAw5$Mb_BoM=-06PXSGs12a554Q;XD~db7;ZxD1sD zMkZCfkPY~&1Gf|)FXL)~wO`dBkESrB_QN?<{7s@pgkGikxHJS{Gg&`05l@>GjJ8r9H0wqY?Db z)U-GGhG85?;jJCJ$Xbysi)bKMK0>I=$d^YiTo~%*jHo$h$SMRHQ+^F9Bu-YOAwHVN z=_ft7_@|nZ5~K6qVncG_KC@H5-|(uk3c5R;+4CygR5_@Gwe*;dyz5pFQOPdknr@(?S7JAMau3p7L#Lw2ow71pM?2s9t}BUQPV&!5lqHS3=%+6d`NX0 zAim|S{sOy?5|(fIz^RFDOT2Bt>-dr~NYGsC4KH!Hj+Z3+iTA zVbY9(qq1u@i6`Jy`Iv#=SWE04{GX7*GV)wBaL!l!Pf?=0WAIbi<_SRl1c>szP#acn zH|FhP@#U|(&>A*#;5u*)c+YE|Rg3venqRcm2E|i~Ov__jZtxur@M#j0J9iT&)hfe7 zXaVzln^$};h0uPrZVvc7mULCmVYS1rx_V70N*zDjp8ndAX<8}*zcwImoWiUrIZThYX$7V(;*ufRKddVKIQDS3}_$MpcJW}DP5S{8ofFL8WTgHEU~m~@6KNf&ITJ4m{677)@dml1$LzYRn9y;}97Sb7^N4N)(foBX+3Bb$o9 z1=5^N5F{%amZLm4aD+0Bc1M%B-MMnvs^Ene4NlWa%$1SxM{sD33joo-zqO{jOF_;k zpd4F>*@|>d!!^SyTN!oD+pDIl7RJdwq?n|UJ2NgQOQ4Xk#zVPyUrhkU=_p~AlIpN|p2{`*h1{oH>cn(ID zmjGC^Kw3nY(ms_w(U8dc%UJ6nokxI~7r&>?911AFhH?SEI|&$;kL;NP9e~Tw!0N-o zr1q`SS5)?sT;J+yQK>bYt=|-!%Ed&`{5(g%6oT4FU=#;FZ{E0UW;XqK60=VSO=k^m9^cT1))`)5%t4l$8$LLIykCgtr{sgjq{+yc1-Q1>!0{rOP z#)PBnWahLV*NjtG%yBjhu6G5teKVG3N$0=%`|ENs0pL@6A>pZj&{t26P+`*s7vQQ+ z(J2YJE>857s`lw!6 z|1J;@s5C=&L{LDaCrDpk+ODE&7?1P3#c^3*;fQy>;uhx{s@9-J54=;Il<|K(h7v2AoGw@JZ zqOnyv=O-zT@6Zm#p*r;Uziw3Q_k!s&CP7%+kPz~J^~(9iHSx}8HP|;!=()%zMcK+i z5fdzFt;qZK2iWD<^j<^9-^FYc@Q>tG;%f^&3ViRXupfI-N(57h8Vg6BcjDN7%czc3 z?pX$vsF()G3Kx(RY#4}ss#fZuS)sWMOewqBvFNHW*1Qc#0?pU&NRMA0ty$h&Cy!wF zG?C&-riS&6rHrfIum>%&P37s+N{MDp!!}=IljVX;gCJLpO!o~kCxm;X1$Jx339!mt z3Emn_B#8OKmB@ZO>%36-+tpRBY1na!0dk>*Q(VnyI(b8sBsO5;a!I_i3=8`Tw~4sI6?y zOYzlCnvG3zLE{jlLfMzr5tKJ}cK+xLfb?JDE_-E>j8p2md%(HjCmBk50mBfdxejj# z-Adi)QlkVcggZXPC;z<{9<@?wAZDCuAF`j&-~x#XehrWu z13&pjaX#BisDQsY4dC^OikM<$lU}pqPXhr}$a@IlO__9!fQtR4XQ8{r1 zjLq9)S0HXETXoNaXeWjptgDm3bTei)_9B zSYFVwvX+YTNARPQTdIR%;+NV2VS-NcJoyH7b;>^Va`zeKk;$cB5u^_3cLP)3rLj5% z^2O zM7Xcr{Q{FMMO+j3wIx!}8ynbdk16Rzephxbcjiy2)6eB3@zQDf81j0TycoGRLMd@T zajUibm^3q{a;Fpp*hsn6k0!TJ*J_qo~jTZlA6LFq-jB6*AQ}(Qq z{PVy zI!Z)KDr=xo2)>_4m~OdUWNTl5dtWt97oPvuUAIpqU-g@d+};f@)k#qMFr;tEvEvDn zK|WW}UGRz~qugc)Izg(~M}E&c`x5O}W5Et51!ccg-^iWfwV|_FZ-~t#5p270BBpRl zOV8Iq67z?qM{^IzkS;h`DkA41IveIB;?U7mAtULf{2Tf{VugZ`JB}C6N(ACVvurk< zvX{#4fP)~|UXoqMo-l~{!SI(SR2DPXzJ_9OA+_0ZqE}b7bqD#|%^oDvA6Ltw5BE%^@JkE3F9L`PtBgUjaHmO5f!60Bfj zhlsbGV!jK46~-Zqb6CNM42;(d4_EyGDan@GNn7s;j}f_}atmluikm3!jlPkK=GoHL zKx&Ln16m%ULMIUYbEYNI#`mpa1Nlb0E%CmB|+7! z72Xz4O>xo}1dg`Q1|OwO=+hXBedrO6W)!>Q75OK=FWKA;cSmV;g`2*{jw8bA+SaztbVWFxv-~=v8 zerTZNsYYYlb0@KV%Fi!hxtZfWc_llLMG$u9*Wzxt>n!QTEkTrfl{tcPd{0`6N^Q1k zDrfNQn-{q-ux$0hAWZfKKo^V#MVbyK?L8dUxuoh7rK$FOgRS`n$4=-%jh0$-&>IeBPc8%Xd*<(BqiCL8Nlk=P=8BKHmwyjnVvngI`&+%CAmOEcf-5W3=QWrLUkZ6${{Iohv$axxVakK^&r|rTUzNo*j|LNS zY*ysK2D)~0mjeSo4S-!0vsQu~SPXyr>{N6w;{SdE-d-Tx)vdioB4%YwDiGdKdYMWd zFZ|h*gIqG12L?)L;K}!QYmvJk9j`%h#RS>s9immugNH87nf}Ukdl7fm+kb{7!zMXR z#C8IwFjst*U*qr7hRDOtO8imXeDBP;UUc?3=P+wplnlHMp66Gf^X(^~F4btcBF9lrqK85v11jSha$uaiHG1+> zxpLdsDCc{k%+d-f_|O~zz)t2Xn8ROANN4^6kvA=<?Amy`Z7iLrI@WX~e?}F^e(?Q*2$B;9EiOHv68Le?p;Qo4gxmi)@7yXDp*yOnq zIL;UZTy9icVS3D-85hmw*z|}K2MB~*j>%RT5b06!T0W-bhbuYIJ?RACFLJxzkq%_AKN&RHMVgvm~MWI;{LHP{>~h&FtHp zfdosisIGBWzblgVbJnLT1@L|uO3;(AY{9l5hHsjGnk|C_B2E38cjB zasM!sM+z(NE~eN4;dPh$B{;mE&TQr}TO0EPyS zLB=~+`nJNYXK#w?nj4%-X}*?MdUgepr1M8069|eRLM>1pYg)?RTV18ke-7|2|08nh zjhs>sSpG`%LP)poB{;&vvo?9isMrhSH~2C!7Z%bsjH>a4qV}HvLWjXU^e{H|y?`>w zY(wcLN(MCkF_(;tn%&k|g#va@x{?`kw2z_%=DiO-;4Rb4Y&c6?28UHk1dH;J0m>bi z31*TknN~-knekN!vUqT|iy*eQ6m#e%uwLFdI!R$xw?DRDq4E;e6xkZnk4kUw(Qqg* z6&SkZ5>H|ge^B^ln}k9s(GoXgQVu{%49)X3K#$y5@Ad}?XK~&4!wT@LpAJ5Y4k)bn z^OZ*#_&;`M>Xmc~%{F9Ltzt@wa=iuP){6Bs?$as`s0{TprXrRTAYn&Yp$`ZImgDgF zM4cCi&VfCMy5^>c7}Gi;D&vYKXTAlg_KS!9H)*^4#JtwKG`ZtS%Y-@yNr%seo{}6# zd}}yQO?jL`G4@`D4@{X!4=JFRZ%n@CN1%=8FW~U?*tB10=+5}gk+f*m0PXHvKai2nue+ za3i3LNESXBKU5>li~F~S@@ad5;|omYQXd83OyD)I|*s()z{WzqO9qKkFYyK zVh6)#ZmQn3pKRlBWaG=n)TPQ@U{AYZT!$nL#|8@IZ||$Zu0)|40}RFhLr3U8=nH32O78yk9;W=!zj5Bpc8(jMN zSlcT|WMHipOIuYH1x^HcyEBww|4UP_BA|A5XV4|WzrS}h#HI9ZJ!74x5WPS(*i!x0 z6=80>=_LfW&E`x+Ya2J%`3TTx#dcj>)Ksey?PooJ&jPa7iD}d-&(k0wXm5~1UWwvg zAsj~PvK$?40w{^QhBPG=a3P)V`sw>nHUD8vkCbpOiW}`$rWayu4Ai(1M_b+OD!BLm zOleZ|LpDKKQebr^p=72#Wi5dN!SKJS*B}l#x*Ijr3efCn`Q|FC3ichoE(#bYq`~gJUES}F^m2q zKmL=TeuGEENNKO$@jjN+nG`Ea*bwnPcp?jq^T^8y1-DkQL9pn2Us1Gazi6BEN->+N zNkb&wF?-VagZ>nzvu5n@Xi1K&FN!IhuZ8C6=^Y>+EeV!WNNx6#o`qw4ImhQsH4ZBT~SYTsep5j39|GsM3BvixJMKSslGEVk-K<7{0Z^^**)kXQ0Ri9Hg| z%q_IcsGma>TVYQg>DI=HmC((|W@;N(HVQPuO+Zm&Lx?U}gtArZyqfs4EXY3+X=p3J zI1DUly#!wH0*T{zaT3@&s|M#h!Cxg!9qxo=CMW-Ud}kvb2`+kt>wJLzD^v(mxIBWX zWS6=#^YJEVU6DxnUzq59A0DZI^gA-LXMsAINnmq{rx|Sc4~`S$rTI*=gWJJn-2z3R zFn46ai592s{Y6Gzugp2e^flHsb9u;)Ofz80IOa-T|odla%Rnv^=eNmKNHz&i4?y#Q+pwc!gO1A;aESo0x)0~CjQR59=X?FP!>@5Fa; zQ-zb-@GQ6+h5ffzm_83hoDTk+{5EA%G6#(3fEsR^>n z6Vov<5_oRUwl#&z$$|8=i7#$`glN*TzdDA!Af5bA-j=`sQs2l?kph%28l^yW^DUzB zWh?7#+8o&QHg2fKKCRQ0=Wr>K8e>K<}QV; z-h4jc;XDs(z%K3{f7HlxEc}D}_af=3NaKNc@L+E~x}1ap1OE#4RMZw-5%H6)*p9eR ztLk{AsMNLx%UM8fq>?U+P_MStlv-7nGsJT#vHNZRQ)YeUbyZ?i00I8 z%AQcXISdoz`=f7do7c|SI*(xQdHOzrP_`DkO6x#&(F)ooPW`|OvD)nSgi&ONXEL#z z-`?Mu<1jFw9-~rtL~%g7uEyah+N!*EjFx}GYx#l@5?2TjXVf#@R~hEoT8oOY&0u^G zcm)GBbs1}s$;+$MQvvfQwF~H%3Mtg4BehA1#o>C5pGxE4JGLGPOg(uO&a1;etp)?)FzQ+-N3id?&d+vjXS-#vZ~wU% z=#&kWXyU>&oY_l{5dZTB7M-LsM7~H`>=W6^M%v_*f6^C7Z;PY-hYnKM9!dl5P|*@= zDTcY!_U0SN9?v7WtwhGQ(*9-lW&-JjzUidH_3$^OSj=U$Vh4HQI1S|%CN5~jRTN~5 zPSoa$%Qto#flOvx*r;g2fk4!4BKl!yXadH9nTKm%jvplt60d0!e?xKau3E8Fy|HZI zlWo<|;5yhpqswzTuD+4`7SPba!kcjh{x7*_3(F0E>uW}RnjB5NFF1+bGlt%8IFklj zL1aJ))BB1uh5boefR@B#nCuNf4Jx}Mwl`7iq3oBhZd;Gc;Qn>B=^FjD)KK##qeUUW zZUO;HFrp1dgaE?XU$8dz09L5IA`uMC0T!#{q$RI$Ad#h-$CAcO{Il7R>ZxvT6C6x1 z+i}^y*0P}Wj@&}Zc|Pf-=1sKmNAkn4$BzTm+)-e>Fs^maX<{~q-A7X~MtHTHl#|SwOmw8B7k^4P zZVT9;w%h)^QUpV0k$<_a{LdN5Cj zbwut#42LUMCg~@CL(lX{xEWGh)dAa_`3LKBrJ56*nGW!XkwCZxs3`0;!%CZo2fE05 zKAOqmbaB{#4w{sWG{0*!z5;Sk7qmZTc5yexFBEtivj)Mm zBj)dGkE7ojuGd1o8Dfbz=AI>iqN5`(VLMpGopJ4U=E~Q`GSMsLW&D|AwnhBS=Y2+B zhf7w(UsMC(8mxIquP4tLnCMX%I&V!C)eYa^;@qunir;lvt@%McXRH7SZok8tuYKTk4Qtm(+Z8K92%nVhWvS~&}wHxRCO zXLofRC%)t>qX7FTi5{nYSJkba1WqquSMaw>AZPBrW6)s!Xw|>}5uyddi$R=zGZJgi zo6dWb14Xl&d;PpOX3y~VQA1CH?r1-u<$DK|?Q9H|Yb2^^ulQy;Z6GGn<<`0SoLoOY zO4ydyu0x`(`6hmnLPcdQ=ry?UZPlbD1H*GP153eHY#vJPXJiPLFSw$T3lwSg!CJg zBGIjKcXA2Jl*SdC(@rPLF7~LqQd|q1!5~&rO^|avd-7w&YW(gOA}Z~M4fo$y?2YS zL1tfo)HIl_5M9AI{_w$vx4h|Q)WMeQU42N@(kc`dn(UtdO%ylv75Tc)--A91MW zp}kl*`+;|@*9y#jMh&iG;3|8m#VBeGd*b>Dq!5KiKUaxCxWy1KFBE)B+j{=}y_1`; zw0SIe+ho<^U#Y`dIf+sUUn?!_Ns0+&vw}NxnXUZ> z+42g0)5nVc*eg61X~Tp$Shv>&!GH#c1g&K;{XRgY%Ef7Yf0>bXV4>hp{lX-uyLYPv zkgGxLxV8VN&P?kUte|jUbS72dn}ou$lB7pP#&wK1(0jfa)KXM;);Z$o7$5J)Fiqp( zZ}tX(U)P$58yK{b^6)pLOu9e7AS-s{vr?DKlm+LPp-?((GxlDH_*tH6Fw<|b(K;t{ zO?hJ-rv%AAK5BzkZ?HKP$>yKHi``H-e80De{`q2pm3Qzpt4D-C81lHx<#X)O3b+b# zC&dygP&qE~zehk=PFn?07cvtC``P?go*Hn zS)n%*mz9(x6rF5AAvZH;ZAtbOb`qwgcDtH&>czir4hEZazpF9&<|=d0K=e`{1gnM ztEzwLj#)(gFH1N%Ht;X@*}M;F?5zEjx2lZ}<-FpTXH@SM60~l%J^MSY^<)zC4bA|v z|3a0TqMP0FM~W@R^f(ng5~h4E;+wvJs3t-@Yezh)pS1&2hN;Jni zXiPz4_+P6v9;;71YX=5;YKZ+Bk$lDY=*bn4~7foQECagUYqa1Si z2jlY1xPtV;xe_Y|)uz!Q{Dj5T$Y*r~#Joo%S{e8r_bzo2dL?xc6`#8a`u+?|pwYUk zonWK4Ic1?7g3Uw-+>YvBJ(%8;GlWMohAwMO>1_2}rL%U$LhzLK5{B+q)Sc2j(5E|0 z(?gOTD?hzLbrNie2$(7LCG+;Dd(y&HKwi z-KR&xL=eDF@JESt3Y`N0mzpU!DVgiOjY)osio1Cx4mP9P3zxPRPPhB2f zLwm!PFb=T-cl4!9ozHy&5UUnIK?VOIN?17+@`ONY~d zj1ahlE)}M@u2DaqV24;`hyhNO^R#?WUURf_zmP7Rrcv4 zGinp@(ofp zi)?<1ikm0Xe3~Y>$VUARE>tu)t4UGE5O|I3MDFfa9>=0 z$({bQ)j*yZpvpvO-2&4UI{t^0#N(e14JW1)!SCUO@#?k;zoG{17gVBkzIr@If{%It zwSMx7;{{6&Ed*uv{DA0T!rax#%)sRfZlr81Br6xZlneumxY~z0**3dP3AGRQt1osg!NvULXbKk=%5))OrcWBu8>V z>ESDHah%3zgFmgF7Vin8=PA)nBXw1h_GcXTCezW+t8dNu{Z5_PWs}{K(2QM+tg9M- zt20al&sXEHg$68w_I>tGidRmA7^%&9cv)lqhRjyvbPKy!d8JN;%FS_U12eraH}!-f zAtK%Z=upo{ci5ezuqLD;uVm~?Qs>FsU|~{AZOX4XeTsl*~)lofRHaVT}ZrwGB;lOndojfaMXZ4$YgX$*d$6Ey^1;lbyW}&c3-Ug6Z1^ z9A6)A>8|e$zQP5zw~p($RM@wuL3~a@#KyW8b(pBTc zievYa<7xVT2}C_bLi9BSBOlD4;cj5xP+?nOsZnsJv5jQ;`CdQ})Jpgh=1)s}NC^i( z<6_Jr<;ObUhsYhMk%?LVD5Ca^)Z-aurssm}B$<2AGzV2VsUlqnNZDiFm0v3`LRlU@ z>S)4e&bPuz7G!0Mh-Vh;Oi}N^k`32yQVC;kh0KHO4zrJFZiaxoC2FnM4 zQ(8VLoVwiueesAiuHvMSAQ4UcX=Ukkm21jkROoy~OFbuAFN^8y`Ii5~Vn6zc8GQjn z`s@_Y_~&4II@gOh z?t{fb{J8n=VMVm`%rF)d2aAy!DD+j(c*dM6S<&!X|CSA7cn+o56cZP-pEr z02a(eN6z2m+yi5-!Bp}RtT8X~G83bN*1NZG=T4PLMcE1NsQ^ps1a0nu8h1WWmVLHphi%dJ$>3W+)PUYbBkNrNL2G!$@LqB|tBwKnm3K5#6lK6=V?)X~ zW@=0mL+JnpeH#eRJYo3gs(yz=yIot!J2iEC3rbg$d&|6NL$hI#=x{ zM~R$xYE++Bh|MUR)4_*2(T%u` z8SVT7<9GpSZ?gd2-*4wYF#7o_LNOpdO&4(_rr3U7!8-65tSSHu<-hsYv-b0!h^_z| ziRkY2#m?ExIw7AF@kW{PM|DDwt&x7*uL?u zt7Ycu<*$HF(Xz$DOHb=MuA`IhQJ#hOFny7s1Kuzhw^LHI+%(Djp9$`xoI9Y6l1QOd8v2hWEy56L+Q?L7)1kK+lv#^ zo=iDc@L&h6GI7U`_9cIoY$UYdbR}k1d(7!95R*C7 zA?7`~fDE{@0`WQjFcsdxn5L?JXL;y{>YZ#Vak_t@q`K9Ws$?6Eh--?Ep-P+5!}WJd zR~eb$hfCB*&-ef+F;9e5=!Q$5 z{yStMXIb(`|9aqQ`2w6B)z`dQ3M)SYz$w}u1#Ij-fieM7P^awMD*vC+_cS%xH-LGbNsaD7PLY1{8?0p=x=oXjb z@lr##|3nOAtJj?0a~gLLo4oo{`MHkHh<HF%6gp#(d(t*P*z9{Y4;K2JhkK1=H5l8TEJrJ_;i{pu+HF#qpg z<%ez$&AW5Y`NIhHvwoIc#1JAI$HA|29Q!%*~zvXKXJ}kS52T0~}X`s!(kKiXE zmPWf)@>FgR$o{lW%7*ITbKY9?^WYjfzBh% ze#NiAGhkmDVla?YeY)n0?ojq4L0T9L_U&s=U;_Cw@Kt$F>*^DP2xl?`*>>A#1nRn; zRP_VF4Fwqwj(#P3Hl6|paTIV7_x}XNbC3|6J)lkm#Wd62qdR}mu*ndyN`tV;waNIdWSQB*j-u!mD117bab;)HrEaJp z6?-+BB{mT_=o;4>Uo!j5HT-5NG?*Wv^6A`AT1O3CNVS+*e*rjvL%jpURHUDr_)l7( zKJ~3B>~kQ%W8&@vJ;{EmSq|w!ycIRCtO$-5a|Aa5v0~Eiet)5!;98Mm@R(QQ-`XDZXsh3Cz|R(Jv2VQdRlBzw#AM) zgZHB9vV8MLWFmEFQ}fS+Qt}J$VE5Bdtp6gIZDUQsKfuWHCHoSx*;%vXPOl;|3}>Sp zB>GUxiF(!(K1EReAb{a5$28uR50nlp(nr%c?#JeMb3KXg&|eNLU^O&EgRH+Vs5p9~qo~Do~3$ zc+QVTjYm8sE-TB)ZBX(EAGZbe2NM0pmL#6B*47*<1V#IX$?OFiMkuXi?10w%WjDP zC?mo%fsjdK^czpMnFs9k1ZHKQ9vHdr4k4i9lxG0^;ShBTMfJW{|J(bSK^!@SdR7rD z7T1+sBomaV7;DEUv?Pg0J;V386<9qfpe3 zEe_KEY?8j+*_@ndHtDF9$^)j%!RJrSsa>s$WJ|HAkg*jliC1S#tc0orEzPxoQ#yKs zO(^5{hC8Q`?uU|Xpp8u^kqrY|#;g^}gg5LN{E;|cz@eR;@#UlHzkc<4CMA$(DBu7m zF=c{AH@@7q^f_hR$#*=|2HBmAHY#_iKBQb^v|T4@4Ms4IDwJP$+Uy|Po2TN9g2<25 zz#oLGUlC|s09ah{fRlcy7`90bp`vQc)!JFDyX7`6thC_)SO#;6vQUG;Jw;=7dIX(6 zaJAB-771OWN>QqfJl!P9oL2G!V^~p+hGD8JrefMQMPn&roLem2btkOE-7WYx%=$Lh z*e%ZP0(s`LWdSC0d%3T(T8gq<82^w&u|LkRO3mv1)=_FYzkSmEi!RTOU~cZz=Pbdc zg9)i#{989AW#XEZ3P-6@6=AVg1m%JlQ6z#(=Fp)WJa0Es9RuCyOYa!KP2Hmw9vtXQ z+!uA>E<P|eVb3OXz{(X0o?Rc6IGB=MEEydrh}&x-U;jDLuP0OQ{`)Oj+M ziK1^0CDFKp)3>vD06O{<#E2lT$*Ll}~5koW@43VdoWUzRSB!gKU6gUTcykEgQl+JA%MAUv)Yj;pn7&f* zg;YwNr&&Wef$ZVQnQ)~Ri*>e0+{Hk zoeoH$++cg*>aSvHOIi|@ZSHdM^5xh60r1%qQ?iTK}*u|+}Z4jh#b-j6V<)tk|_q)klktVJ%xm~f*XA;50zX16216E%ju zA&Q_l-lP){wXDnBgAZ&pE=y@Lvqwy4VjI@9)p{5o!9DI?f3NIUM8LdE%REtFG1A@M zyN}!O>J=B4f+^#XZ%5{MsZ#OmtcESsTd>6rcjlIJrfIvoYD;8cxeNI#3z=v9A& zC*<$@M7Rt7D^e}Aoo4FxZk0LQ)|^jcO}}ND$^!n@qEFyN$`rypC1O`@v{|Vm3-FXH zcbQzgF44eViQ2MiRM|XB^}qCiyYb?-enq5V9Zcnya{Ja#r~-_B{hqPNY34|=Zz%;j z55=VULVvu|+}MB`moU2AeLFNdq7>Ltnm1M^K0o5!3_~eO`!5cZ6W?up1p8B)Lism| z432}EgBk#oVDGkL53>!4L}_IHg+P%uWv5^znHq}6@2glq-l#N4*CI7$*>Pow4$-qY zVH9}`%&$U=)=qOMN=>Bvw^R0I=a5IZ_9pC+Qfe$ga4BiYf4NB5Y(K%7CwTd-iNND3%-t7c>gHOve|OeQu{dWlI`k=5~Rg-Rc$Yp1H_* zz2~n}=$EE-YPq33%N3;iwaZ3wtoNJx`Fq^82=$zCIij`HCjMe%|s zRap`h542PjmaIKJ{txVatri#~m39UNGV$1zmKAn~oW@zwkkLKo2@`4hF6nj(5y?A5 z_KuKV7yXp>Y|3E=Nc;t?-o`ajNffuRzT(TLKO2^_Q0CTFT?#r=#}ImE%c&#Kfl+AE z%BuG`%2GmWe^C{E>anK~DJe@>^uOMv8bfa6S&_Y|DEdezAusV+(-HN=8uPuZy*h`z zeew5HzS1`ifG&zJsMKc6(1~U%*SX-Ko|P%T^`wVVJzzg^h0~|W&RN%8t|<(iG7Fd5 z`m!|s-HwH#iGH8Yr`K`6Z@3Eo#tld)X<;+D`$peUZUQZJ;drrpJaU;Z2sW4wc(_o* z1m^)hLY~8!G;RZ+EuU$)B)_+H<>d?Zb1umm^`)pt$w=Or2fAsyir(Z%N#Q77R)oc9 zt{lrSuOaRKnszeQV=+}~Yw9umQ4BGhanb4<=rK1o9KIP~tDhA@{8~!Ic;T1+&CA%q+QB!^Nx?a>sg~R zed4a)8*zCVNpS7#o&AHB0k_~E z`mg1(N7!+Vi|iIeo5@DaU2`gc;irjxZZ#eL*|@iKxBhs$37q@>9iLarDitCpJU*hq zdI2*r&*P4e35U8*DgxKS>KNL2vh=#rQ}EjQ^K~)!;rQm9Kr)H=B8{#@1Omy9m8VH# z#gN*P>2|MLNHy`RP!Q7K(On0kkwzWJ2IOan8;?8J<`TBvlVhq>ZCdb1QLHIF3vZ!d4Hg=;w**_;O`q;G@d-aUbjGP zIA5pBpjB?S)roLVPD8-R3P6>n*^s+y0c8 zPd9l+sR8Ro7Z~g;7G)_^Icg9!hWWqz*Sjyc(b22*0y!*tZSmeNN5jT1{#jL7@&7Uf|KyKr(-S$Qrrrk#?@2e zh5pa#hXmk;1u~{n&39<2qDcY5!Jvk0g05@<$mSg@{R@ogilfOoet45i2~xfh+>9b< z96^P;S#0CH+&J7@a&9_b+D8eG$zr+Mz}_*#^j#xW)Bm^^FDD4zDKp{vOC1-G*X90Ruq{J+?FkCAksa2 zhQd(H&I3&C>m)@k7s_Qm7}1l~mXhPmnHy3i0%op1_)2sbby*p9RO(B|O{@binTbu< zZSSgS8fTE!co2QP3K-5j&VC~w)8iDm$q!!@-jXy~VmkNPLAC?|s#k7s zTbm+Q%RiK`-o*l!96N1vfrindT((svVKl$mBVN+8s8J3B#uVIc3l>O3uVbZUs)QZL zE`yVeY;h=3D1QALaL;w-SH^!e-lfnuOZ?7m#3;AUgM}oRV6v9XQ0ZwOo0`eb zjLiFVrf2osSD5&%IJlE%Qu<+rMdP`DhLHZQ2vXNJA*-NAz>UAc={IH!nF{soX&TE# zDnlG>0KK#T;cAOE4P_+G3{|cJIAhPWnU)ZrBfxAV^q$)BeFEy(0VEvjQm74~5&qcE zM6GhW$To?#&=$yY3`FdCI!LE?{q!^V36|Dbk{-xm^ z;zNxCRQa0In0Wa9{bzs3#nlsQcfjrxYrNCS-_Y+7KRUfMuE1t|!ro5lqU8OQiCmA{ zPugJ#L^c$-1}1JHhSlPZ7$-}nZeRl4=#Ef&y}3oRg#=An+IQwH zFnfBCD3VUjq1%rNMUCDPPKz2Bam%j>3E#=3E`C$$5qX+Ln6eDlW@FUS7e}m%fjLdo zCTHQ7EbAj$an&3LU+jth4!Wb2EtJSdAVU-u_~MQJ=#w zd&ilF(%mc3+)xZf=${x;|3tcq5Ql?q$fMNe z0JK2>ru2PUGN{55B`Swn$Ra4oKX-q7?GZ9e)4J4ZSfXO|#_jD%^}u)6qLi}znXO5p zajk2Si}gu+yrXKDrW$88t)OHf8I4aEn^)jT0&83&5(Ko8FZ1c8t(?3RKklE(Y&-Qg~hz^*{&T8*^ z(PSY>0_?=2GkIb$-AEAp-Sy}gHS77>Zq2eI}Bx;zRYrDRxO+I8ifOC8Qf?Xnc7dPHKd#~K!yFlM_c=^mfwW=o#iX9%6 z2RfGuvMJA~c5Ga!?$Hexif>&E)Ca5nE9gpiAzhg0k%Y}WsxcXZw(tI;qWM6jBhe`+Bs*>ts!l1cw zL%6gX$KuD0ZQ}L@av69_TQkkiFKX40-r=XqbGOgsL+&_VzEP^)Fgc3CH(MvOs{u8oJ8 zsT!WKo}fKQhV_aSFi|DzpuByzWS)du8X{ItV?G@@p;u*xgO5`qS=Rf(g%V*8$WpL= z71XjvTXfh4JfXd2WS?1hAk|r$RF1Ux{o^PXfFP4_564RcIX6!wAB*o1RQCb%{!;!= z(Ejc_8kZB^=|B%(btfTW4Y7a}EX>F5|JAul$W9*-sFQoDHfrd~pi8-OB>yB;uqa%S ziTikX$xyH=l2xyRUa_iWdb6bieXVL;D~og0U>E3a*T75zklp z@s-eJH7jQnD4I~pYLr2VS+(S)4lCD_)O~WmfdZk@UUClry zLJpz&XCHXJN{voJ7AP{8h$Zb~vlk|9Pamy=zb$t4e0A%f>7hK=eV^}# z&+8LLmKNp!=V$Vvz0$flt#liEvYzToOL4;2{5-3Ihd6LcP?LgB&VJ-Po{wa%DWy)MDMvnC@*BwGDN8B=fqmellTBMf?39RT-diYUrE;?rk@>g-rpIX| zI0`b)z;r!Q+75BMdVZ!G(ZxC(JBqRCG z){8!gmF4HSxsH4^HWA>PxB#^R-694(}t)w$1?gKd;aK;Chvzfk|ypyFyo3 z{BEvae0-5b9L-mXHW9q*xSJL(HpDocfH89fo>Q0^Rnz94{0lGJGe*$D-snX2ehz2Y z&WG@y@eoB1p@Ayq+e%^=`xQ_Mws-%$cdj{T+Fq7QtyW&f<=Xokx8RX*FeN0;P+!iw zU^d?4YncIpq`HF6JI$M`d>1#1gaHGx3#36N0()3?Nn zj{Eh_GD8)>qN7a{ub>azS#=JIV~M@ZS?*^Vh1IVSmz*B~>;no}$>lpKJ7|OD7hH-@ zSYRg-_u|;~>tl7v2xgTsGy^%PDMw;cdW7Bt%aAMPf2YFQ^g8P-&aFeVsXb-n@&tb>5wReTBV28N^5duBd9I=NZ(xT3&*KiJAG z8CCR_C0)|4R{^l9<{9_+P^n{CfAP>A#CL{U9>gC7NC>&SBo!#LKZ2jr748^~j(8gu z=Z-BS9d+81_`3N13%k5*1q69x{8|Fr(Y=O)VvejmAT^N=iPeqr8P}@YbEV$mX4}Mi z8Gs&#PpQbauR3wW)xp?&n6OiU(Ah;(6d~=^{`{BN6G9Z)6xcf{maR$ZPz)?uSDt1{ zQ%Xxri#;OGrl0`~oezE_HJ;p441jh#i?sC}`19GGoo%rt3=x5ihK`-dTnASXxIsI~ zy$G9%CzLDsz&b9TY9OE(hu-!|AKLbjcDTfbqY%<^I(7z*m&ShGK}8o1qxjR*3W$TO zatr>isf`#|$>B1Yb6?*rHM>T!(3p0LX`{^mxs)<#NwWLWeKOcOA!0$=5mEkIUtQutfxQf> z!S(i%IiTx`cner8+@Z7bWrXId{Z8C+v;-|M(MZzQoX=A+Iu9{-Vq_X>u1O929hjZ} zv5uh@+nGgtut3W2wP15xfNPuVEtwG;h>w5?`0p8h$XpNmr6v(>v-jil;j!Gn-&Thb z&-_OVH@ud}fGP#4E$6IUW?*-)XiEv(a97r{=FeZ)FI)Tlh23tZLff+FXCqcWUM@x1Q zs*gO4q4`F?q_D|cz{tpOx>w-^8YaSZWlUb+B>)z+bbLXB8ZGkBLbJ+BnLH_HLw}>Y z?g|2E{#|sw1v});MUmI_amsgqY8i73m-S4jbzckFLDiZ$p@HrE*47|5;;3x zkT@VX&6NW52$~cGC&EMg1b!F0r1Xqb`)9MppD(rt_gml-nuPQ$Zb!iBI0(Gy*VF$efp&&*WCu0prU&{GWL z)?Px<)GYR#$ay99`T*r+!6X$(oY2yoYBbOf;Buwo{e{0^s*HBf9o|{fYgWV-9 zo&wGl|2}Peueq@ZO>uU7^rhI04zys#(}-rD{YZkOQtWjWcfx{Rp^}<}(+>F6G$;q- z=@b`%Pnbzw$naZU2FJcJ&pwdqUYpV}O$}`(AZ)$M|z2a0!bt*moXLLy=C%)R6_c;{+n`$0(<9FL7hsueV`nJp?zqIg)X<2da!Q<7}=_G+xv)Fa+;#BsxgkBRK-q zO{D{?09+PS6b#JgluTFnz9mzkkg}P0aMw5okf4AMS;(IDKoJtDmjZK4V#k9RZ~Hn~ z!%&gge$x@v5sBT7kAdUrRLG{>xb@Z^#_hsse|NRTH_wYj7InDr-SJcOY?Q{vLL-#Q_!QJ;yn$lu9fvqb@l8u!vyY|RR*06MpC({b16mxtXqA;w*Adn`r z;)!{*AiJIe8pj|1bar|Ii%~&b8(~qv018WV&Qy)``jqI&nFlx{#=FM8e(~<8q?rg% z3M!$G0j!f#K97MDM7UeF-3>Zk3f}o6f12G#>FH=^M|HUmHM-B*Y``>5q| z)=H7>^9DJUyhf_CXKe|E7+-YAF#yQ+`bu%fMuYOZWb?IxeY?8tib-iEp9{uZKK{wXec)gEP~R~JzS3b z@$=Va2e%wBm1`@u2BkKco0z)Z0v^z_-I%Q{{MEB(B7M%jib{nNECr~9tcq<8J_nIz zq)kqZ6e2tPdE=lAaK zdd@N$JT9p3;}v!KbX7N-zWuL&&lqB*aSx#615_{4fM-$NSB7?*#cdmGJx**<4 zq_kXq`@v@WgWi74+t_XX5LGB8@^sVET70#v{c*8f(>mVp-I{`C1BjUivLHylu)GRS z?jp14IGYa%jQCTo$Ao1OIlcBPKTmAkmb5{q8O$!VM~bYg@e$0F6sb$+o-cURyzKN3 zB?M-Iyy|C6p9u4Rn>({N5#8ADDWXr%3j}^B@17CXy>1Q8?ZT$M-StRBXoi-9{lJVq zJ>E3T2E~~?>sE{SXZfr=_#!0$P zO-RegLFg>-fkSU%rr%ayq83r+5iC%h3@fk$Rmh z<`s0YP>lMbl#OiW|5Th8nyt{G1&rh9cTCfPJHC)eNTMzTT$4E-E}sRSXC0pQrmecm zd4Zf=&Rf^Y?z3XOj8T0JK(#7imyqKehUp1PwUhG{aLqO!JW;8iEakva#U9NUrMdK? zQY_A-?4w}}F08qG7nm8HF7Wm(>bt4EN(r>5ZV6qsifZ}^NZU!8*ot<~Xx?!g?s}G! zxPP>OS!ToVSyY5SDD+^U7qQ?G>dE(q#%np|;JVEmF6}s_pZk_Z;$4nh75+Y&Y+G|1JQ2Xxp-xUzTTTbN&CgIYzMZ&ZoEWJ zS*}&iHwPNvKp~*9ZcNa7WuNA_x3Hg^T2L`#y9{vF9MEp1mmaa%oFr z5$R+PcwbDdf#}UkDj%|3NY*+OCoF9=ekqzl87KjU){W5l=M6>gM5N!-64gM`rF2oh zP94PHFkM=JFO=nJU5UyvEAon3$(0DZPzk194!V5R;}F6CpLZ?o!+n~YoH9TjP`Uro zDlx(T6q4y355L=Rg!F1X$~>oVPh!X>A|NpSV+{hF8wnOF>`G{#Jo-}?q?u{qFMgXf zt0pI8`6%b+b()LodWOco;@ElSr$pWbHsSYpb^@+~KS+bX9euDSWqIxAa3cYQU~QzF zb!;YbN7#4&a>Q2%fV{4ZGbIN%f0whXTn{JP)Y@YM_N*^00e3ks+qME;xZ-ou87`5X z+n*s9GSgU9ZzFD6-B{bHu1fcXyjc$8wCXg$0pmw$IQn>!USy#2_B?C}Q*wxOQIe1z zLQR$Qb%WM<+&R?L#S>Hrldk2k}};mjE-1#D=Io)cz2%RR`1GPExBU8y##QVS^yb-QQXrb z299x^G=a?b3Xz-;EyO6dyN^5;AKz!%;UI+{FEL z%Ic(m^bx8~Bkrq$!23?{2Lu8I!pa+2ZkUmr2<%>%tt0de<1M`@rsD0%9vp9!8%K4E zVfYz`Sy>uf)^8UF9L!&zv!cJr!(wecja)F;psu14QKsC=k@cx1;WXiTku}WFe|l(J zvB<(^#!9dV@WzFSQ?yNkHF}!vzTjG!imiL=8j~9)5ToB{O24kDV5)vBtANfGroQpc zSQ3I0@?=c~1kmMI__}64C=x9~cp*zpdM$Dqi$n46=2rV5t3Rl+q~4b+zj7-^HJ8M6 z3YMuSif>_{zj9SwfzDy$_Y4=yb!^i!IKHZcJFi`-n-d^>d#nRkb}AZQ{G7SC&zu6Z!Nns>WoI2b za1Pt2v|~x;_?ZC_d3bx4K5%Gk5430}DR<>CT^&X5o7IC`7?tBvjJW1k1TB7$j3bTD ziloEO6`1c}MtNFd^|Dxdoke`u_SH`;tBmqLOJ#)o=$5a;K2P|9MW=vP`@gDsb>@T) zTi9#vgwctH{Sj~*d=j1D$*8@ckXzb|?2kL5F_p%>5@=zu9jEljh-u>0J-LZd64*=n zL`~!y3;tx^C*9mTxbr!j<1#nyyi&X+%xfXAbcVfZMNct{=Av*=MWsN#h15uXiTsi` zButTd6HTYtSCLSz?_^~a>+Ac?T$!%3kg_(PKsCa?Iee`iM8yB-M7Rb|{qVk>Ckm)) z84~IRUpL?mnRiOVYi+`beM_A*Q3J~ZB5zOAAo*ka5$yCc)VCMv)L21rO!Plkvgd5U zCz*_{2o!wVOwJ9t?shpK_NIhMc7eB8b3rfKhbk2zKNqY5Cl76`$9Q)%wG z@6@Y&K?7Rk*Q{zebbjO*Ob-Poci^x+9c8<2 zsAFzT@S_o!bTm<(3TB`H)k$}1rNaZtu+(RIZIudqv3=|xV`BYL&1_RBRO-?}B>od& z)*VkE;5vCs3bDJ`>VaaZn*l^^IuhA}w1F(#cixl10tvchRtu91EA~eP809@?6~;=U zR)4>^HMcL7Owz7Dh=5A@>4|STYzACJ$XWV_-Q zTr$J@W(T0x+&Edw*k8_w2roS?;2I>8!SpEf--sR%z~x6u^1EpuC*T_3r@b>16`6Fe zL(OfGjErY84A)<`M%a0psG=WX@J|MOcf1T|_cz!ZVJ{sf5$G2PUL%z@hs=i{GBDEL zCS(=G4V0Jg1T2<5JSdm+N_-TdRU7PnAypIjs3J`W+R4V6=7He!iPt0e@5?5o4(DsJ zs;@Z{2LonGROnm#w6)AAd{mjzrVCRcqiz~!=KO$IklOHvw)%(C3wV+~jhijzVd@PY z7TA)nqUTMfTqb|1t}fx^$)?Seaswb2>+(gw3pU(rJ%%T}&ew#ixk#_IW|2JKOe{O;Z=8;Su4qbf z7d~|W`ygssD%RZ@^$W=S$XvA?)_3Z*oYx0tzsQGCkv=&7qvW)=koCa6#U6FEDztbZ ze=~3ZY)9+p*oqV?cu^4EWs1?J5HjuoFd(vr@?m{kP~xw_ON*|dX$t5OR5WwfIEwx= zi-|(HEMLN+5CnV~lHWHRi#Vov$VH*MouX8#Wi{Y0#EvY zbro=)!_Y#k6O&}_gMr-20e)`cda*m@L2yiWW^NnrCEV7o!6hY zV*MNhPGt`|?P3z-nB~^3HuMs7`wRb`rBW-4H)ASclUGNIV5GUr(dY7kSN)+JRyhpN zlo(s<%>p8$^gFVxA;|laEo&$@0hS3&<9`I(K2XSm)N;zkNgVp~yEbKQ98N|3G6NN1 zbZs6_cx<2VSE!y_{BdFjHOa@p93m0Sm4Un?f*_HO`IP{pl;8Q|ZUI((pkA@j!6oPT z+hCYx!{VUO=RO=shJ8;+#8-tNS-@xAh`GIKZ?aqHOf>T=MqVHjkpwy2+=~SvQXq=h z6Ln|Bt{==zp`32h{1c-DAqkN1JyD(tW}pDoNq1@g-{W9`5RdIbc^PHWx#R|jkkU#! z_i*k7f=UHNz2@r>j#-Cbp%l&z;$sLp#ut@KcZSRKish4$GmOmzfV+KsKoVC3PKh?2 zv|t)y<7K+c3%zKm?04QG{|gm+;g>x!5>une>Bs8~G##XJ6mRXv3IWOU2M-22OW&yQ zAT~zzJl*UbnP;`W;&9CJFoj;*aKN?DAAwgGIV|&MGgX-UEtn~kJt*%$ERwgIiV8ih zSP{F_t+g8dEs+y|MJPs?4X!q9B1I=_88{iZU!J$AfT75$lZVe3L4bA5<8;46_G6k< z44RiK@aV}ZBTL8yMx#TzgkCQ&#^0Rs=5`(2A5FAupI^*xPyRoSw4Dc#pAkpSL8ga! zV<+rjKQ{J?@9&7(x^oGvat~-VTp-ufDY1r9e^6 zDccpZj0u*$w5WH8%2tT%so8L@g~ZKB(it6D`3g=@WKH>gQ>#fB?qzcnHQODr532Y! z#|n=!!@%@5)d-cQ;T_6{D^(UZ7km><<}JyK^!iM=05@1je-dB}nc$%4JL^VyRo34; zYZwbdT!Bf4E9j#~Q4=Ge2BV)gNek;%DUwHEFW`B~=x8MJKWSUd?z+9x*Ax=?>&k%;k4^HMm)T~#sKOUB zs}MVM+`U#}oZC?XeZ^>TWJ*3uobtB#2DwoR*OZLC&!cNtZ|8&K~F(k{n_Y_;AA~K_>@e3#`dt6_u!o)I0m|eOr!nzE$vL!W72>o9q4CPaa!>yO~vN zoCaj|mkUome~c~iq9CNZcnG|nq?`Edu+*hwyCL+_)GTRLh}V%y3BVr`s%$n;0Omq6 zdrWtFYZ>RXdo<^4G-y1^WMO>X`066}Cx#l1#AV^6;d(E10g!=9&w;2v-4(-> zx%#?OV7Y>RZp1|n3k$!#FKt2{^ehrod~m;3H}=)!XWgc|?WT2mzpJS}`nWg)r;j4o z4%!?h?K@XF_Z&|InUhd-wY8&145jl!VXjf2Q>$V9C3V@ne##R#o*1S$CW4D!8@N3l z?&ZCB2x7yg;3d;moPn>+{$(q;0Nr;noJwI{ZHsS{c?l zm&%2oe54jE=?G;O^5KV>6$|!AaG&Ekea==$We=(}Y97D{TGxqL(XCqe-f<$czncIdW&B=mETy2MbvGevtz6{Kr9F|V)az@%WDNrikubjkCJc`>Y z>&e8Yq@{}UrjQ%&&47#Pzs$2p3)#k%?Fohir>Ke43LhZaW||}-a1&iGfnoD^H$1M! z=30OotbsdfUoSEas*kKHp5cJ~tY=S2r#KM}HyC_Ej*CpI!0F@2qj7m1Gx4N6$R1yV zpoDk1kQ@R&VautjWs+Lv~VTyh{xRtdBKHkHVkV@9ORqicxsz$C)` z8xx(nvbiU<9SE#q&sdPP91Pcgyh+T!=aRFwT^coq z+AgQl|4R+s*QO}3E8q_ytmtKO6%)9a%P(Qb%r{dyB?KEvC!gQOyxPN*XZ792!aE=H zOF6dl%Nch|2g2` z_Q{Ga{H>K{FXO>sJ_3x;KO1t@0=?I#7;PD7&_7Q@H572UJz$>9Rdm1X6>sViS(J)n zpBM^OObgVLqrJ;ZJ67EZr|+4_5w}dq0sw+^jp)yk(isU;atG7w4zb%@C-#aRRk zSZ4}tQvv~-siEnDOB3tE2(OUP-+Mw|kG>qwsSjw!ufMz`y&>O55(dEP=Mae{Hr=Oz zi#XpqZ=mcafPrIZ%f-iSSZo@A6qHMfjakkvpj_N(1p2$`Td3{3_=bt6<%Rn&J7FF9 zIfVnh7Z;bJsN3j2U2)x>b-GGO`Ih6LMGDqW0%;G;Ph7SojWt)PtkM2JMxfZBF2_kU2^8^#8Jm{oPN<}4 zJ^RAJX1qSdMyEimUUlhU3Jv0f?mc`Kf5zl3u#=*4ig6S!jkf=>7KkmE(m0SCb|hqLYorn z{~@$DfsMDHX|iETqs4Q)^;#W12?a9u-|AfuCUS$2o?a<{QYb{o7LpAIBt>$uUG@rf z3hZ?WdwCQWFq12^?x6nlT-)JNpBAB`P_0Qr8z43o)RjJRr`67dZnp<{(bmZ2qnPS> z;t%A^JpfEM#O7gh_O8zMbRAbR+B!_;JXOo1OssPmJwyAmEtL7qBtAX;_479=Vh(kZ!RsOV1fsnUAjRGyP2XbVWWFpTQvlWM@ z08FeF9wlcKVgv8^_5haL)~9;DD0}CYuSQl`9dLcaTPswKXY3RRlZ8Y@ZDYy}!gzF+ zouIO$MAaOLnyd*YQ{p7HJ1U3DB0~~61#Xe^(K<5cf#npFY5+09F{_5OCZJ&yltIQ! zSR-ivA2~_zdQIRtNlFLhi>kVmSZMb;GT{~YH%sap?cuhEJ;QOxZW&GV2Wt;e^R#>q zn)oDgi79?<Q9$?K%v0d2k zeuHuEs!59mF$IMl7lUQg*gq8?Sjsa0(-92RLdZjj@d-(@`4be<$fJ9={h^MukuUMe z3+&oFwuunZy10__?*(>GD9kp}bu{qmf$@ix6U3trp|+rAhukc?zGDr&9P zS*NQ4&Xg@t#VOnP*^z^Mek0cmswJ~WO&6oS*`VytRhQYsp9*g4uQctHoYujBNN6QH za7%2M+5Bz-7=ITOF-rE$sSuj3ws}-TD+VJyVfXTd(E~vC#3ZhkTV|xr2e-MJ?UrD@ zGN_61f>IFp#u*6i{n>%Ls7f0-YC~?70qerv)7buc>+E1|TLR<&PdWRYJhzjkT~SUb zgy*pa49WfR(BYtkkIAMVgsicwxj7b;F<0XslnZsR%Z+H~P~Da2fEqK&Fik4gkpV2{bl>h@*fGQ4dPQ$vb%7= z2RsCKJ9Xgr(?am6_zr*kJMx9bG?>Nj@n4E&{j$mf+ z+iiZ?bUw4$L~W0T(XA4aJ>3}k-&>Y$F;o=v$uJBx97@Xdv~4spoSH2KAyEX=kIHGH z$|T^;jGVI$->#Q-3ssI0n9~g^>z7{=)c|k969z1iI!2VN^@CW7kn*iN__%pqbWqMn z?+AmnAq&JIP<9uc-8(ps90J)zXTPxgyZ!6q!#%Qwx^!XBpDL6#dL>DDnGGdBny3JI z7pk_@59ldC*_WmP3$a2lOUz@4CTNun3v7EQj57Q0xaQVgpr?!)id(UqRYst0DG>{~ z9=D5p7~-=}eKQ6ZuL>VIeLun*%UmIOPRHv4^Vmq^6NxN#JyySw*>rhg+1CwOR## z87Vy!b8!Tz;fn4hURJi0CluwfVm-aE5*>kL4f|*`38ta$C?_{M3$DJ$v5iX)q`;~; zFBDVc{sRq@vzp(@$PTc)jM4?pH4(zt; zpDDVw@2zL4o9;(AN-oBOT+xrK>|h%Ky5<%Pqa$y?&M9Ea@j7r-BAu&EDAcDv(qWq_ z`56uKIe`sesJ7~*r0n4vva12(AU!D9yF3K~y_6TaX&8gX9`J+7QOc(b8tPnN-cZE| zN6j*CwiUL|9P%~ndb@2qSf3BzuKrH!EvF{Z6-^DJOC_VBsF`7cyKa*Ns4>=*aY5Mv z?r8y%dd9mv$kAVgJ#w=09ow;YvYvvqN(vR!7mAC?9H`vSzOD&!g{4OScYd)~|CD`U zJ%lVsec?S(o-;> z9Lh790vlZgkSWkTFThw@dfLE^mTE(oDX|)Zf*w{)R&EQ|k{NKN{+R-Pn5-@&xUI0v zjM2##V4Aqmauufbmid=Z$jaG`TOc(?)`P+@SIgs~^PMZ88?IwJ|MX9)NfN6TcGVQT zjO7Y%$E-JF1Ry}RtuwM#7*!05pV~a5ZFLK2?4bga)13WG+Wf1=iP8Vv?lhHh%$el? zYlLVj3jVr}b-Jk7H#_RrtiygImzp|8wtarGoLqXF2!zLPxY%rl;nQM!R&*5ZouRdm z?A`tLgtH~qC}v_)ydYr(d<;>&(A6*+qN$w*KJ&YyM-<%K<0M{%OcX2T%uUOqYoR!u z!HpC-&gWWkFYyvgcIjph|3*Mh=oV zcD1b!e*C144ib2wOVcfW0A^^O&$+J6h>6M8ltW1tB=PzY}RHZd8b zvVgpONEcQGzdSVFL(@r^NO=0}vQpM#40#)T$%CJ(2{!+@lM)hGeT85txuS=A=u5KF z!byP8$FojDNlpj_ws?=kgG{qOvT5Z_UrP#lA+=8O6q+wpvC#XlMD|s@S!AjeYbSF_ zsjTl1qNt_%3HkcYF2`;?twb{W#T104t5UIJ95kAmmycNbBy)b zZrvKVY#K|!G9Wl{IAsszhd2QH*zcUu3PWrUA%awPP{*^C%ddbDt z(xn6-1GuqWgBFNZG(PBQHWNousTz@tY4vKouelz_R6wBZi8En5M5S@WwT32LcTT5V zsscPqh|ts7%X}g$dyCO_dD~D^!0ia9i73a{_ZVFtWE#4#sfSM~l~!Mx#z5~^=3K7I$wc=)B~h!Cc81=+=dZ{x9A%kNqMZbAObBs-I; zf=fhg8!+@>IVetkrl|=x9K>jD@xjhclVRf+`*fJ2Ww*u8PosTSJqJo{ZKcvGcqdGjzY4fL46Ckg zKPQ$dvRbJIe9W!8wIaE2AF75q34XNUGHGGdtj&A6tA~Aehb(;aSWKBfuIrz$+~}vS z=!jeSq?mG@NyaPd673!ij!uOQ&D^34Jr~Dp);VuyGz0dSp{lV>PH2t(=3pYDFP}QZ zv|p6(orgeA>&p&8IzY4FUNGpDAyj#}Z8k-b zu_k0gmsO^uiFyj?NT9-tI{@we9l2(0si&o{@4<^bp)pr!=6t==Z(3RYyB>I-a&yP~ zhYb2sLueZ^hc|L-PiGI1;|kWXrc%?x=#LIarbY0LM(x=(0gtOKAolg{1hs6Mf#~GV zr23y!=kf0GXh$hK=HoQ9@)adDpH?R3Jy7+$IBSfAsHQpm(vM^=FEK-Bs{<%8LaW(mvw>H?B4+*C8+mzeaIsSNJX(}=j1#)@F(XgE1htY7u-D%3 zG}97&z?Qw}vmSYqsjAN_GPOgxziRe`mz*g^VuAZ122!pW3QDt41&ZqJ~b7WWIaz(`Lt{=|_cYPM(kj zu#^$8-ILH!@i9w-J}AYk2{-7PCBb&%^N&7r+(>cMketr@{d+n#FY|-Pz4R}b&IL6@ zX^iw8(ecZ|K!Jgo({-A>!Q7UgmYuqy5P>mT@1@lV82xa29Zq}*essSCk^qyFX{#ND z=)NHEZ6>ffk>Xf!2cd;2bY9JTa#6kjYdHeT$-wi(qoF+nFiI9w!LLD=K}TN!1L zyMX3kx;MzVmh_Fw=7(FoH$h4)$cN@%agk+{K~mfuCVAR+%s+;*VJT&9WOHbY*fNFGg%(bY(Vm za%Ev{3V7PAxdl+AO|~tFySsCM!rk57-CYh+g}b}EI}}nlg}Y1P?(Xgs?o4&}z1@HJ z-1p|q#Kein$d$Qe<<7M;zKBCkqNGYMY-VQyl(4gPre|hg;sI!hS{ge#10Cr_?5xeC zosF%nOaaUcEG*1$pt19x6)|JyKR&9)&HxFZ z34oa!z|6_R#LdIb4PaqnVfk-EJ4YUXyp^e?G0+;I`X{_S5RP2b&fde(%EHo_2k_77 zp8(uU0AnYBu`R&G*51X$+RDiiXa;bzbNmJ{@c@WeIXgN331|b5wl!t=w;00K)_}iH zodAwNC!nJ%(2U`Kk%Y>W`VTuMZn{4sGt=Kk=D&|D0AX7*N1z8lg8`sqY-{KGzYW05 zN>BgikWBw^G9G}qyED-CZ{-5mng3gaf6@Q18Uy}S<3D5pl0aLa{q3xOyEF+q zM+@NJD*1;Y6DNSm(%IRbhmq0z&zAY$wiuku8Ek>hjMRS$EpBTjYG-2uv~_lZV`c)F zS(!QmOn??vws4Gp3#H~^4+Jm+%z)HpzqW@l^d z@h@`)V;dlVQAJurO+tz{#z8Q}BpVU>)n z{)-mVzr3Yw&FujHP2bGL{=bjl`VRpDsQxZMYQVpTQm}KjG6e#t{yz%oe-sZu?~fq< z6;O|foyqji!2EwGo&UA>|B-I~_geXn^OFPq|2+7=h5LWgEC1g*sNw9y3qgX7=A{NMal|EkD;Pb7B$(EU$tMh06u=RYn0 zdlzRPz@G;J?r#ml!2w_t`P{EYvF z{`i^x6S1-VL4Tf_f9*5>X?8}lzd&XHBk(Vf6~Jim7x>5D@-L7bz-aXs_$TwXzra5v zt^Wf5FtPa;{PR*U+WrOp$!qs7o_{v&jU9ou)GBu&hotLY;2)B1e~15ev!*VNf6_Yt{b~Di?f;FBD;0n`0gv$j=36}bV3w7_pPX?#*Rm#K_l@3b@f~&^}&!;1XUU)QG zF=wc_Tu&KPKdOu(2q%$?aMag$mr1w2Q-fvJwUv6sM~dUwp3S&xMNDa8)*ONrJ^{i{EBt`g1pfV1m{(a2L$S$s7 zNa?5X$7Ui!3%xzG#@8rY7&~}A+{OdWrZRIJ&$Du6bn59}X(~~@w4M;q;w-emilWBO zM3;fi{pVZ8oDoHL)6b(8^JMCz5HLW1oY#tt!tlxgWXbBW4iV@i7I?-|fl;l{c{a#9 zGxtF?l25Lrr3u0iVOFKQKi;6nOMGuBFsN4hm_cRUx); zJn*?rQey$I%y(afc0+wh?0M9xbMYOnB=?vxif5lln$OV<>+?w0wIv zNa%G*_vvMQ@flYPb*kXmh%GUaUDmB>Zx&?QM|u2Q^1+y4K+27I_bbNmha8PZsh29m zkmmRRH%Nn<^{xwt5f9${vGaE{-7M%-txR3&g2xce?AbGht(tiwy@_1W@2JH&$mWg9 zIua;Gq_ueAriB|VWG7f#SztgzxoHKoZp2C20s^qjKq99U`SZ*BLJb`UhV^eUACT-u zZxRaOsbwvCB3v(8lrNZHv)-bk zU*n6;BZ_|Vo)Cmn^${PWR`iMfIJnnnY`!vhDh`<{rK5&Fjy8L6bL%;Yt8!~x(%0)c z-IWf*8*uD(g8LPlJ2lu#;UC4zJofexzz57WcfjJ zkoqQ~GD9Vx%!<=gKJdQD=!1#E2;Q6?ykjK100;7e+G7DDLnPs)d`)jHaL`Y4^g0e6 z)8y%dHNVR_&wOD~$r^vRs_rtU86kZ6DO>8Gs0~IjxS5(uiw5m2$#YeaLjzYEH>D#q zLS+M$yLb#qh4V>;VA^shk{K$|YXQR8MQ=IgacWAoIi?fVjZ<7f0cB{P@^t;Oi}QxlWuJ_KD^9T(V2jRu9ba%Hn0I0Wb`~&6k6>$wwrce-^IZ{xOP6DCUmy0W-JzbT7YOaR_3YV`3V-t7GZb>;Iz^$}<*6ulA27l^r#JlKkQHgayA z$<)4gJWG}Rjmt&hGOI9>6>;oN3hp>9=$h0OW#tIg_b<1sKt-IU%{CGMqC z@x*zWe(=OmE?ViNG%)iSjFmmL6lI=RBXIzCr5c0!_VAQ}W5T5_2?dTIU%?g7Suw_x z0W#MYSmvWq0z1Nljz+H{syJc;TtYlX4IQLFt7K!@ok{$cV9L@-4wJ;Fbk) z86c3i=O!XaGO0nh$BY4(Az{a?*)Iqt6m+*RgC z>bG8ye33XB7$bh@t4R=CYcPs=)9I4Xjz-wtVbk#Pm?ha+u#~*o0J@0?6wyX8$HrVb zQ{`hUr^{gD*&}McPc*U^u8Z4>Bc%9C^Oa9aP7~8-MG#?)o(?!*xNdqBGmhiYg=fdC zQw4hG-lV)&W_`b7AE1hx<-Us%QnGM1_K*pC2*%pCx?g#lpofXlk+B_b$qHxlpxfpB zxGNI7p4GoX_}$fy0k(>)=!o`v#}n5{@YJ$-RY?}#Rc-Emhc}VZlHRWb1-szVvxje$ zIs&HYj#4?SaQ>GrBw32lqFmCqSB6=PBX9qyK2dNR+c{w<((PHaeO}SvseDSigp}mB z=pb2F!Of_!gOUWhZxv^#-ABzd8_J{HgVcrjm&wj;QBIa zAXgidnLu+fqR6>kC0HUhAD|Y@$l0{V+q%X{hb+FHlcRhx@3yU~<3)D+i->bH9+TRp zR|>zhfPWvX4{K@Y23`mRD};0dYTvS3tF@7j|9eH7+O3TJJlUXUxm^y-=8`!SW23E3 zUzYW4+^`12F<-W(x^&cWZ2>>2gzdnCW_sU}5!&^X!ULf#q!-4^-LKo$P$rkk@Rj96 z*bnUQ&2IHkHHo~8ur4!BDKWG*Aup1KI3B+vR+71Gl|K?6rN>a%?c*D+ATbgoev5#~ zF+|$~CXoHl1^fG$i;~AZpmL1h*FOHyQ~|a7K${{>_)Ks#gd`s)I;tp3a<-OBTvlZC9?!;7 zSXLzCfSAk}X)R3kph5=m>6;m*JOiQ@>Xo_xq=+&q;}RKqPh#9L<=}{bAj8M_$+}a2 zNSL|iza0^IK{dbBPXoUs(j#;o4KS2Z*)cJ`PhSyn~*dxG27g+l3ptU9vP# zl(9x%y8Y;^x4mlwFAA7b=y5-b!iD^(aSp%mzUuisxYwa^L#pU9hLF^x6#ZOXSfirf zz=mr!$$lhAOxAi4X)EGI-$GOM29+_FK(2@*k}evc)`UQ>w$0+d4^C!a$$mjfR2^^y z3>eIhTmzbp?hd#}ZR0RnF=%O`H@=hpzD|uH_4t)3HONFnYW+bdz`{McIkrzshZ$fo z*rt?q!M0tq3Y*Nf^pV|P^qK!L><`oNs*Ll~U2u8JbHU23v@e$1B|-onvsm@oa5b&h z@OOfdaM16}L2v!Yu&JELJeaOPW%gEx3AN4w5s{Z)1OWb0K!o4&e8NO+}AiSeL~C6?h+8+>4NDr`vsVh%#Esf=7< zaQV;keG{gxoTpt6uSU8&4e&7Jqan6sFtS6z#UfHFw&llC^a$a{E}eeC&RCx0Rz-Yi z**P5jV->Oz-v<798_;c~YTGZrsx#xM*mCvj{iD*6HuPTT6?hjv2_>6PRp0q}+P?F> zUiWM=8F;P~W58JleG5Y)EqqNRY0e%I82I%LcD6-5o|;l(4|@!hvNhOY&aiw#l+2=V z)@;?moNIZMC1eKGjAs8iUAi*AY&0iB)pNr208@>!SC60GZ>v*|`I+RG(nOV1(o5c2X&?^0LbY4WQp{5bTsD3qI@&d5Uq$>)S)e9IEl!uO+W32~W?XEC=4+`DT)icVgQx&MwOu80dOKp~$R0zhT@k zW_iUVA!!?{wC|vQ#LHymg%pqy;}ax0EHq)aJdyoWb>Rz= zJ3Lslr!ojb;G8i?i=QZkq-_c|;WTZ;gW`fE-LdtL5@Lsm!d;Qr3%7b);+y8TsN1S2JA>@NFV=pU3#(AS zmLA4{8Sp+1abK~XSvS@rh;lcPaV{vPWX8<(Zi6HI1e7&K`k?O?NXPoRf5cF=bFg9c z0Dri-2c?J=>@GyfKzGSkly$(dj~jdCMl~h7UXhaYo_SxO!cW8Fkf~}gD+ZK9H3{_v zC?D({LbJ24a#WBZ@h4pLaw#TOeYPqK%h@>Gj()}ozk^NU<6f^3>VQqn{u3q)4etSOhVVSwkAXwzO=!UmWQM9u=>@zt3XMU zFffG3lFQXDs_Jghr(G(Lw?hAz{-F$vrI1>leEsHiG=8-9f{+4)Y+5yHDJ|SWMqq4z zra$`N*fgZ9)&Py}MZKe2W8W(EP)znh3g+Gzhc?7C4-03@->;BvL1aLWh@U}#7BVYW zm7%#u>%HmFz5Gt%kBQ=Vlp|)f?yHj^{F6?jKV_y?jdtS!_gTvn7)7#51*NX?<2ub= z96)4-E^7z>7R{QrWu$Ut#@;c&NK6@lQX(#Zqgups+BQGIa0StZxpy#qDG8sBns?3M zZL^Vww{>);OIaYIQFKcJ7S_cL_7fS*`!r1BrKD2khJ&b9wx|t8jXx0mTgnrdhodH- z^{2;+tg}kp&^$~F2$G3TN36eVrt-ryz&P|tv+k8qi1)adMN>SkIofv2%%~us6j_O! ztOJai0YC9TLiYt|4Z|iUy1MT>ZZ11z4@2BZM*?-SJALedwtarS=s4e75l*?Pf-gW6 zag#;#G5X1zNP{)zt}SK8519;B#?io$6@anRIq#n!;M%2_ymA|R^x$4LW%IoQvaBzU-APFCxM(Kxgx}(x!oFQlY>m8E2sn){;zLCXt&G6)H6^WaFegITuMu*YI*X><6Y}lK zxqRJ4o)wEnQR{uKCQ?>XS%5ftozhf2I;qm($6(QE@yU+6IkX6*OdQnrAcF9;y>#3q zy7E3(Rd*g`Tz{%hI*D{-kw857ky*ZXe$=RF*dAf$wyT)m?J`8f!O?ii-lT(J1NI4M zNs&`ob=#<6Z{T{T$P2xAnBan})%HE}#sJibP1Q@%O`_M#Fqed61`HmGL1(kW*-1e} zU$TK5x})x4J?PVAPAqfEj?bTo$Aqw?LFsR+n2HlOpz94GGjW{^$OjIcM781{-fJ2a zC)sQ)jfHldXj^n~NH(;bQ+Leh2|%1Njj^)qAULEhA61sjNL1^gSy#k5@QM}#t= zUmgz%D&flx@y@Jajr9@KS}gQ~?w6J464~G`gcx$(K*XPUT{@F`pFEFuug;C6yM9u{ zcQzPc4VPHOQZOtTX|fTMK=QXQ_|*XSS}#KZLBIiIA9z(850|8yufGt>80gdSL)PZU z@t6{pTMO)!4*Ht0x5RX3eyATFAEzZHhHh`IPHRaZW`cl1yrReoTJE5&l{p(3a)I!YO z!zM>r7x&Wj_CdjD&+6+h81+8GPxGHUp6bmu;Bjwe^AlyWL-h9}OHA!1vMNR8p_kD6 zlFJ{<-D{K}9-yvKy`1{2RNG_6^8+6ue`HZ6ZQ|bRR!`Y)JQ2&kBT>~Oz(9uLz=H0{ zEd97>aNQ}7pOJ=v{9BbV*Q&5(cfSX+0$&F76AQyLBrEU-RZ!-hbdjWGs?R7Dr<&mA~{YxJ0!Py&&SXYso<1xEIv}t?fx| z(oJo%U8Omm-QBxX1dQ0SWL1R|@X&PP2sDO6#kA7yFz`#jUarCh|96nPv zWvNjMN=#l9u1hEF8+%N5ucD+5gm3vBT=b-o$~HS?NlIXb=!90@J(Zi$6PUm(HJMmQ z(*2u+=`-xUeC_^I?}YeLVla<&1Rv9FzT{pv>oT%S_cZ#-Ogu}Hd;z<`3j zXm(VJ<_sz^wh`=#;wRfnwlj!9$74OfzLKULY`rjNE0S>dC*x_tuaU|ZlK#=$`sZ;H zP(HXP?LuS$!W;KrUll1f8Bh@T<#J@hor(Q|_`%Kwj3-LwXw7EYF5TEaugd%h{in<& zoFPT%>S+Po@qW>U!FxyU_*%H^Y}$wcVf?CucdtRgY;UrTkb#gOe8{(4uMS5QhgWAb z#*Sk(uS)3T=Bre7D|SW?7p_su-Z)V0SOBW29FGg$=YsoyatqqTR0D=KNpd#XxgPF3 zvtySf?)B+mJBMg%Qynmfn6s~e2P_z$NkY_^jxc-mUfFxUrw6fCl-um-+n<(x2DA$& z+!xs+$J-ww6b3`+_i@kPhi{~T>jZK#9MoeLWHaTqZw`J4TT~Syz5y%8thdH~=9Yna z$kZEC>ht5Abr))x^H3fPxHkO`RxRuQu>_PoC1}Y-Y4F7*++iKimeU_mLU$g_Mt`tFZ*nj zbDuo{KH-k*90x;(d$^mj`-YbysF4lApkg8><^6?%d%2tIiv%9qi$2I=J-7o~ZURWw zi(8nLW_zrkC)`J6LO}5^Hf6@IYI0Mzc9F*!t`^ero8xg_b5{r+?4oMa*&#a~32b3h zw%#IP3QcWOsB&qv$?@aWa-}7A>>NHl)IW>kz9O#UKY>{uz(lPbY-_a7ppfRSBZ`7O z3&FZ<%BOZw?L1FH>JMaH z&}%nuFs7TTS%7r=N;dPE)l05mVHEH*%Vkgz7)^?UqGksI`y9f|&X*b6eYBRHiE(~4 zI*HXTWvKp0CV{v(!UMU>(;apJ!zp-_bwxK!nn~KQiwzabAurvbTn5SY|n|R>?PQCkLH5Nw{8oPdNBHRi+zO zZ0gq!vW}g73(~LK^+~`fi42lVeRyGyCW_ZHfrqVu+w@$N^a8wyuJa`mK4)z za^d7n5U79zT69m(*VE5j^b@G~Qp5+08-*Nhq{mRJUu-T(NB4R2%@Xh*HN^+1^|bXX zV`fe4MBE>#UwcUufM!3(!$$5oHD_FH>&zeQM3JKaYrK04z z6CPXkD*2ol>TaXuDnCuuYM+47utp)`lwpc5#?!g$)fz^op35? z8(wUFZQD|uud}{uaH~`l*^fllV~#iuL$nY&e*Q$b}CE zfi0BGW>b6?G%YH^@>Nm-dGNOUF>-!sWu02Y*Xs^mRc~G*%_N0><s0m&w zmmbWPzLt*jeu_D&mt{{X^c*+fP>HDk;YMx{4cY{M5=n64izWYv?pIYs{jh1^xAzy> zJZDpfi2J47u_m=HEOS83W2B=U+BUJ18)ebB9+>D}iw4J|&siL+oyoM`Xxqg-x0z)} zYyx>ZV}2uM00v*N9)@-Bq0Ug zNUq0hE#O?n^)04^$#FRSu>(Hb4Ss0HA3XJ3YHJd18~BZg?W12Ne(t5Onz+t2^CBb= znG^?cG0E)9zC5Q++HINI&!pHZ%p2;V8Q5j`D92(B9hqeD65?OTBNq0Bi;{T6F*L;F zz9LMa_MWrK2wOAR&x(dZ1Us>uNAwQJ2JUm_1Vk$wU*|_o2^<1hxN+HD*oVn`{_#%* zJALSJ+d`AH?8QjyP*dLG;S3grZN&0`nKRX+Fhzb;hnbFk*C41O53T-wC0bcQUbaiX zG~7uDKH4|0HTYUB;~esX2+1YJ)ntUy*@nk!u^S?-!|@I?^+W+vE#;k7#k?z*Y!I8E zRxpGfk?Cw?f$a{_Z)~=p@(r-L>lPiN43cm{!g4S5VQC%`%yNti@I)^i{M5vX8{eai zGABR*cR@%W%U0L}lb@MeGttOrwvF=MeK*m+u8vC+>I!i!t>hruigc!|{8{M=v4@6! zpQu?S^T!p5Yu%)8J9Ko((jGot?C9#|)y!C4XM1ZEiG5W0#FA1!EAnz668pe=AL3n< zU!{l2b!mKA?s>(f{2p3m9sP}0U#4NI(hPD&^f)V%8zUD@PD4&b`2n4q$tZ$e$&zds zltQ#E&Yk^HR)!2>V$ps7cTPr++vzStW(yNaBzmkXvWT#z5bIDJtG8FwZ$tOtX^yQYagECXq~-Y7V72+hPHQ99t_e`i#bDu^%voNJ(JYXPGez8_2YkP?-fCE00Fl`0~ zX?(K+7X$N57^4JsO5qWI3U&J*BJ+N=0Xx(oGVgc4o=UtBVnGkbOqF?uu zMQea6mkG;XeN! zlsO53=kPB8xhl1&DI=ZTBUPepQ2kQ7&XVhN@IrqRu@_|CcAoq##X zxJ@4^Sej$N6aH#fx?D{cy+BD*ttVdg1vd-Qr&QYPW;`6ZV|90H3QM+CY~Y5nu{~97 z!N<#7Iya-$TUmH^Tes9&TUC#(E#)oBv6VGcU8Sk@IsG$)I=a2my*;mRrSxz~_N!ud zwWIj*wabNb+Kc>&`G z%hOPNkqB(MBCxv4gWo=~gK$01o(`eQVC&m-QG<^M_5BF5tAAmNk+2ag((iSG8fSRH z{5nN*rdy(T(>6JS#E5Mh@N&m{qQtLz5L2%coJs@-iWzWVuQ4&KFVj~inSHLkJfTIU%YIULcU?}K7`)T87k)h{U*#nHVDx$G;Elzvn4*QM? zT?~SXUQ0Y~MrdI@12A3`ltpdFRa1GG$+yg;ZQBNMmbwmKmj#y*B7RygFKT<*M@A5^ zEL(Rjn@#*2>5TRN1r+eV5gn4q5mzEJT(Il#UrnC&4~NyHfnz~4{IL|JqDyX)Ft)4F zy>OYRI(T*L^P%I3$=hFbl?j)14-z!!dQ_1Lj}~di*;RZ!LjY#NF$pn?%14f^ivh#8 zQD57FwLMx4!SWi?OOA{5C|C$dp)gh5^mULe*9I0hE1xRZ$qi%R z6AO#OrdpO-$fNNUk;){y%d>dCu5xn2a&~Q+nWC?k1KV~SReYRxkZ{#H;>iCx7QX;o z7WZ;9yxpJ{Zcl!$%J@d@gspQk`)ey!;SQ6?sQb;vG<_&b0|nUlxyI=k1(B8YJi3(r zGvCk2Ih@895dze@(*iboz3)18ZN?3KgY@{0=EY?y z65ub@fcg9a55={1-lvL1%&#bVeO=HloJfmF=ULqTV`0*u7!aPgbIqNL$=Tv)pUrWTg zcRk$c`_`~ZIU#D~53SSLYj4JW+U3EV+GKE~<#?g-V9p=Q;V+6m+^EEha8RPvrAiMy zepnYAqOK@y@=$x!b{kOXbsMJViibh8PFFOxZNbt)T-M-zm1za+>j zf=atj;0IdxZXMg5n32uZ)X_JWnVRF$Q%V&vP+ix{g^iK;j~g#P|^53fuP(_=@% zu(Ml(pt_Y7-k_e4MwXD6Nhtn2F|6EB?)**86JMO2)4@y+v~MS0CoqB{Y|8r3RP$H7 ztVc7%P(~Fj0s~q#v+d=kSM+{-+7PV;W(Y}zb#Y56%Uu>QQRO7^v08%6m z&$Uo9sb7~qI9(}z6ifcP{9r4?$HabY_dlIs#pcB-uw1Qh?v1b}qHus!5?uI?y3I5#p zLb~%x!<=q(5lui!JJ1wG(jvgkDR5c`<~!Xb=*Yp6HDB(qK?6EE&Rfh$~P~` zk53+YTh#8+31jI3(5MZt&SeI9TRO?Cks)JE0?Keck1mj*@_u>^b;I=03%krdqL z*+1-+iZ_xL$L!Agcf*rW!L=p^6vG{tK`k33W>PWEkPXb0{R0iNU9%TaZ$*caHaB14 zXmQo~``GDHe-W|fKiDM^(_|{mhImFUOin0ji^$m&1vF&a=Mtr3d_S$g+&X#|ry~(; z%RH>9k`J;Z*v`T)Z(G>B>A4&>WJ7AJfJLHO%e{JT%?bA=6XO;v6B^j3rTf4q(1E`k z$p1+Ph^mZDQHQ+D6`AWPU1tiM)4)c{{plUW^Ym7J(C1g~KON=v1EJONNF-xdJ!T1x zqp7r3IYqvKQe;ogASQKnRq6sJj2*GPp|TtuyZ-N{ zt-{I-ewu4%dR5PakB0!j+( z*!F_w&YHM7M>?)(8KbvvPOb?jR%IkednQstZx36lQIzxqK zTWf6Kzs+Upr9g%aUq z@vwKZ@b7Gi&{O_j2s7|I#WuTFtNrxkJ+v1^8bp!^BMKH3vaepR_dIAwawKC?C9Yq} zRlLM4ved7_m@NWp{ai)dbt3z6#P<|`A@1MwR`5nb@gulY-K9!cY5Q?!d}Zr`N7jAG zSP46pbbe?sL3)e5SQp3s?nvGghOdd#1v#>!AD8U4NH47en*eM7CHo7lCUDaQBs2jL z>z$fl15;<-T(O|bjcpr1@TwEf$emQn+7Ci+^%!kyACR;cX6`In4M(B92yI0C)@6F@7#+NB_C_sJkZfV>Mw>?( z5$;)))lue@+BIg+2gR4!*K#ZBe6pSEhf&c_dE=>YHaKLP3?>~k?9mR z*^HB2Z7ZUt<_f8frn_uM{w!$)PTt&SJ{WQ0zElsXtYUq6IL>FifR+-fa}d;~-5lm~ zORmZo(TV!Ppbs2|<4ozkXnIo}s@46sS0ZB3W711Xl9S;5&nM$!sd(4NxP%%aNo@ zreX}a8znM<&9M^&^kMC54YF%o`-k$7JE^PjA8$0Yhi+(>d#2s1Corlsto*t^ud5{r& zLmdx~cw0wIH)~2y80S8@2>-?(&H|v*hfeRPSKDgw)H8UJv^4a zbD9}+-Q9G%LA)j|u}$JWXiovSmnT_=0^D3GF02D@K%&Khn!AmgDkViUqiXNx-V21;vIG>uMdj?UFc`(MMoRco7PBU&b^ zoG%53qSGfv{HGg{OPyQ|E7fSGct^sm_|&{gNoBtzp3~_(&Wgt_xML@K)p7be`~QeG zky%e$73=(7C=T*S>%}$MLLT5mMxkPp%L^y|=XRWe9aX{=MT$_9kXUE(6^p#aY&z z#aG@%DZ$_eu~r8~R%Nu_IYPr+7Pq`^#=NQOMS%n}o_5UB(ww)Xa^yZzKhIr=+gyU> z^erAad)u`OZd$oolyhAGy-}LP7ZQ-y1-z^(Xfw^cvSX$mU~tH&g<)J^x}BX(xSu*k zhD~AtYJ*dck#$tSyv8UQQ&Rbh+Gi0QpPR0P2cpF|95`rkTD8jbyC6F^1mt4bjCE+> zWFZYWYW6217ufu?B88T5lkXud$ONO;wa31?=P7YE&J;QF0Irtx*_N_5$#~n`fhFh~ z$yR)Wj?)99UVuiirSs3~;#9%SmYIT)Zts`dhhfi_Q6e>4t<|yi<{J$$RS4O>4~IG< zAsy(>QbXEXT;xw(7LMQ2Zff5M`3y(1XPz*tBV^S>jDvFgSW{{82++YsDCALAjcCF2 zmT>**E_O-5TJl|)=JEYnMuIEQbT((+v20=OWXX2HgRgOrX-<4HbDy$T_*08EnnaE0oh!DR3~=!% zqMX5M;mhw40N_%gmlOvc5k8k$Td?R6zqNRggf>-dgkHT=$WVM8cn^I4N z1e@;geO(yCKmr>m9X^*i;KfG3orXr?T2$OI(5KPem$*d4J8}KC<_Fbcl;S4qoE#mL zb-B3Mk3TKXbP;%1t&seQsNcz?wnNI5%n3sKlt4Ytk0;Q)_z)U0&yQNtWTx$~&CPjQ zJ9LVWE~;3?&81xy*HeGWgHQ$i0zTZiwlUl`-Qvevgvc=qOW_bV=O8fgn_=9xv@d^`SyaqY>~m^YZvBw81%!>FjP?oQILo7BdTw2 ztM$J)@mH!D@{_c3vPyHGsA(fAL^#3L)g?mFLTEsP-|(oD*-Yi#=ot>Jdw#u?G~URl zAitW3^5S#U7lN)reVF6PPG^>$Qtcd$_ZS)nex_J!OS9)GQN{*oW& zG&g{YFo5Vuv&MDN96v55ifI;p;Ca$qpEzUD#QWZhLJl;`QniwSUL5K)Dp#KpbD1BA zqTtV0c_jSR#cA-GZ>m}_p>21AeX{QTa6z6H$(=v4+(c+w3EYER8`WTXqVjiESY>sd zV53so<4P@6W>a8Lzpw`Me5`p~K}K^ZdrSDLd4QNi&{0ZZyNQJErTjdA6qG!Vs+2_r zLC`5n`FTQ%S-m83#I)eqORurZ2_nr>$D#%=aZ@|Alrsp*3Yo~->R|@46I%7m$#U57 zzV3hfJ>q%NKGPR9s%#)0>8SR2GNMQi{;H8_5S=LdtyBlE!3PI!ufkwG)BKD?r7#I) z=70F6C1;k-bGg7EDVI4RcLJEPL&RhY{i5U6 z;me4TvX|Zpwu-Xcr9+BmY$P%Pll%~%CAGkNN_;K-8w{7QXvoA7wojUYCT-F4UBb)* z-XlVl} zW|tc^d;u9*Y}ew0_e-jI>^o}A+GY~44LN{uGSy}s4!x(Y+yvJuVo+LRzL8m+s~Gfw ztHyT}jHyxmsafIe&aXT13G|i5jFY6Y)*w%J54c?YQDa#OVjmwDlU~L~X|YS6GRhf^ zyxT$p#`*NLXALqAk0w&Vga_QR?H@KV-+nypO&z5?ii_Umt@%C&jtVEA(F$TmpW9kI z$Z`xsbCkvzrDnRy_5)!wclkY<4a41-r;95GN zrY-ITgkN`+Wi0$}%@}Mw0oi3Bkfy@8(<@EIhw<9`e!kZg-baVaDl%)QagEN_laaf| zR#j3`l=l>!{c4hbKrz9W!fmzTwt*CLssvmUu6hE9v(oWgFSY_2H^XxmEchb z4|`EOwvC8;54gnYh6*TI=-dT5*JofXVd2MB;BH)ZdY?FJAy=B(GiSvmHB6(U0s4Xd zpCw(K$3Kcmro$zE9x11Mec;NdiHj}na)%~cZ@f|S=J84f>wq3JPy>P!Z25@cd+scC z(Xa)5-2n66QZe5N#X-fQ4ANW%W{n59@KHmZ_QdtSX53Xzx|7jxpcvJc^Q!_N&vs2g z=(+u`FKey!gH#AI12Nc%=G*2vH31z;-D1O`7s#gweMe@efQfQiw{uu^K zjog4a#4zOSV$#oBn3*hf*7iAr>QFcQ$d%slI_N~t4KjYHhYE&XKgk=~h7!byTN!s4 z;s`e-DdJnSZ&j+W5nLE;R1^X&rVG2RI>ve$Zne-q*w4QSyxDL^BW=eU&dz~tzv6nD zh9Fvsf1%HKVI5cK7@;v?fx{>Ipf<*U@DPs(``lOXN4cM0&ZRLw_7Eg+?Jv-Dw)jHV z(<|;xZ7u9Ixte5=6 ztcqRZzm+KeAo+&v%rFO0mtiyHb*d6G4Z>ZnOm4S)EOcJ$>dJ8JTO;If=5O300In-E zU(zF7W9*0<#qyk^wTlnu&IF+N6o}*KsM>hVT%aZGl)(!4y>H?(B@>iJ;6X=NJ!iOz z(z7Fvrso8=-ZoCxq0knZTP9Gfdd?*i`>r*#Db007@Pmj?4A>NNj2U?SB1zSP>Hfx0 zpPim<^(2Y-WVnn6t8_H4Ki%!DHPoD}bx>7ms{j`(#R{>Aq^|3V`p@|rm2-O)AMcqPJXcqXn6TWHYBG1LjjG}h>CkS-s82?3RQckwKgd)#uW=w7M?<sw4_KzPlvf0j+<*oC1D^&&^p0U28%ij zz`iBDW;3!P)PypdqE|@jkb;kHI48b7fGHE%5BdtkL%daZjjt~&(cUN~gOL-Vf54Fl zT!P02)H0Uls$4+#AAFrD_#5VINLPPIC4{O=UW-l;j$>~cs+XSd%35&1l$jH1YCHs1 zpY5(JMX4wQ%_ENl?gml-n$z$!`Q2{sNccLc%OJaXLULq;{NF2j!-Wg4+`sv6x6n_F zj!w;L^{wWvx7%O-<3sw9#g)&Oje}Qco2&SHb0_Wf{1{D~HOrSig?XQ^qlL)`9Vs-0w1Y1N z!FvKePEojd@y~@b+ z)4EmsJAYjdhMcS%*mULR@8sHtPU!VC3PUyfbN+^NRyP75q%e}+^PkjR(;yy(?Zp?_ z?^Fg{8WAhhzAjp@yE`lmyv}ADgKQIZ@M6~ zux7i1q?_ndYUpM27^%`^s;`2!zLx7RgW{O5Q}q7#*oH5R&l~f+Y72?aAu&XAKk9jo zilid7Om6;UB3JG__4$!8QFG#i`N7 z;*VeI5KBtz$Uv6#9N}NIY)! zJi72!&k)&6O-!pH-yw#hw9z1oJro9w_MFSkhgz$HwK0F`iX1DJP!xq_ily)iy;-!+ zRCepR217B7fi?xGGMk%G1Y?TdM;-jx>&^O--9(1*`WY=o6obC^_FHVo?sl;~5;R?+ z_U4Mh*eOnE8QCZo3+!bCoH$OWr3=Jz4CJBeKKw^toWb*VZd;zYz-iHo*zvx-JlJ=CDtoO@fK>h>K-W*mW)Q`0axd39h!@UNBIN2d6V1=Y}ev-n8QrVg!}S z5Q3%@IwuM!STSY`#JG&K!^}zSi_8cKT)d$FIkGk?#%|dT3aM5zr6aJ`+a44F>vj7s zuh$3;%A#&%JkkE?jVZLK!;=?L{{3~3Q^zB9t z>Q_HbU)bB5g7Sr%*rnBB9;GF_0(e!0>XGSE4ac6`Cwjzj40zCa1a6*>h^`D1yj}8i zl8s>Ut`uwmK}TBOWl>c7+f5Z}GxL>2q-qk1&!Js=Tz8dKnQ`<4?(K7P)ro416 zq=cF7pCih?o7B7PM>WOpe$#>pk3Dgd_)5X)BBhoBW-DItO6kc7*u?I_?3 zYoFwUYXk2EGn=d~K=BW7sz^r|-gi{K32-H~k$uAs3Id49_11J?NApdSvmuKNrJPTu zVZs!ySDthkO6AJVWnN;(blkonI;Ek}J8pWkJ|FF{Hk5f9zltdQ*S)6uh2BY>y*{P3 zzej``z(sT+(f&pG%%ZESziIXicclICTU*2qZvD3jQN zQA@2d7>c%zldIC(p^3h4(0X+?dOl$5oH%laG$9{SPjQr8-yK>8-m>pn9CnOWF%za~ z;DsM#rd(;X*2*jXduT%H?a0vd2?OFkPDVPcTHYDHOza~gj%xu#;RAZUlv0}kb>o^8 zW83EcBwqDQHie3K8jwYkTmSI;xoTGHvy@{wEtxQh*f| z(`~#pP6hPa5JH#Y_JWmlpKnMxwtW_YT?T8eLBv^-U`nK&qJYFY-O?NJp=3L2Rq$*^ znH!v{AGNqIq#BzE9E1=SX5DeSlASn+n#UP7BcOWrA<3B+=CXRHCp$}~)$NOmXlUq1F528y%ly- z!{mT9o83F)tG{!NfD`2Ozw-{3K6A3PU2AxS+~<1gZSpYwc%7cPZF;Y;H2GtsPc)Z{ zn6F-{E-#9pHesH;MuJ86a|rPL^gI6n=3g+<;%I+yCywB03}DySEgUc3rH+mv3c>~) zwK|zm~ywHJtNi)e?SrpgR8!9{8~59H5QW%V64%Mv@ocdnS0M*TEY09S|nu92Iq zu+1DdeKjxpIMYnui->vpEI=yXrxpHz_8^q*w~%=KK?y42vQWo(DHB_m{i7mSp(}J zn)h3GY*)`LgKgl!g?isq_Vl{rk=b?+6~39B$Z%oXp7+RD;HJPTTPIo)X#b1;EV%L5 z)3_cV`Xx~xn}X6gNmp4ETVZpKV*~S}mz+LF=Z^y-_cR~t$_ujDR?AJr1|( z`J{2$oB6i3;&YU(CNO_j_r}PgMCFJb)pV|My%w#Y+1Djp%pgZ>w!FP`vFFOA>wP#0 z|Fg7i*7yozF-M|WZjluvttM@mE1?)p+YLOkK(#d=d?vHs7a#nbi%ldN095JX-kTSn z5oAvO%X3WuQXY#5w{wnqYBv*6?p&OBOsTnnIm^r$aD3y3#aBY`y0bZ>F6%mV$KE8X z{Dvd}X#b9>CpfS;(3Z&cQnz{#S(|~E^AK|&Sch52lyM(Xh}r$*3q4WY=I=eZ1>4yo z;MZUmXo8BIGy3(@qgDS%H>z3_kkDBC^D2Hl#ISSbr<|gJ(N=iW>L!I49umMZtuR)- z$HTg-*TosSZEP2YDF_daOSxpGagHX^I`_hO!4{T@2l99xP_g&XaBQ$i zvSnyN!`oEIqwU#SUY=-jzV#0*uMqx?uc73B{CQurCF^5u5GEKP;S30%H(=8e0Ea8s zUvsb9Z6{Ip;0txxBqiZmlev4DxAHe*(R{^dLms$RYh|uY8MQ=F*Elu{9q-6+)Dn;E0>}}<^UeAkVKOf7vqph;F3q#{-_+ZSy3_C zH2{DJIqhykHcE~&{pErzGktdEbu7pP{A!UX2CVj~1Ulx|AF$uyG4$>S3#_tTfktYu zw1v>!UBj$N;_mv}9hgWziIsO&I+j$mPs~F^fnVQgGWx^^qMgE#@r%->o2OLXr-!~; zpMSH~EYfN=>Ih3(@WEya)E}6 z0n2UOP^^#O|2*1=;D+AWqENB-XbXH4ps{M)H`83<;q)KuFYFCBgyD?AeFs)d^Uc&` zs-Kd<(uMxri4e|P^o(1~C4Lfl`O>0u){MK3y+*qC z3!RUEK>ZJ|6=G)Oh>CM&xW;6#Tdak8O;oRqDUvkJ2>f*VjW1_du9@A0^g&G*)wv}n z4T_*sH#~7^<}J8=ny{CEPgaIOecA@72k=!3v2eoHaQR*$mR7H@zf9s7wifZHdb8*hPhM_&CcnJ%Z{qB^59^R&@e$7nM;mOWnVB5QtvKXM1N298 z3v>pj06##$zteCO|BEl3V>*z*pu>&NCZ<%4esgB6&xNS`m;>*E&vLe+-=h9RW5$7RoJ>>w4*P>wq8l7jj- zG?Y4{rPj`GFbr(8zO|_7RfqG2GKXDShmf1PeSouX>CnmbKZ4mSgjrZ+!M*KyFXO%_6#X9g>79}7@f_2gTXz3PgnosEyFD#ZtTj-$t0{+uw&E?7r|L^CganNTu zl7j}JWg&mSu{8&bGLc*n!0#g6TjSHd#Ml0FwSF`XHwP4I7Am*U`Ka}g5;biyJ7LDT zSj-^-JbvS&dtoxR0bh5FJh<$)oM?RLJ~|MZl0mOGYPI5%s^R|DbS z+kf>1`b7DJFE6(VXh*rZ?nvI6VI`PH8Dv7WjVlHa3nCik24R2P16Dn=%A*=;G_e(E zOt@s-PL1*Djb662SfNs%aX9^SBk8?!PuQ67{P;CeJ;b?ZFKHJ=v+_T7?!p zLpRc~$f(sceuEk-HpqRbyw2ezx|FD`mU}&bllV@qCCe&a+BpwdnpSefdu9tu$-<^y z=!&k3;_4taPlG*sr6$VLKnW62Mm@k6f`O)#uAi!evtzely)Q)PFpedXU*#OFIZOS6 z4Z>sv1j*xups%M_>n886-f{gFe7PEogVR5{@0 zYW^jm?zypuZXj7$3J-BmSQQyXweH|P2F1z93V60UN(BGuT#VF#4~ z_kKOXvTt*IfBO^zP(h1E`icy^@Yyl(HJ^4`rVNQ-0V{k(6p6X0N8XE_mDLtWZvjJU zAV6Y{$-=hS39<-k$E)`JZ45^rY`;(BCrCb9j~hrKVsZH8gDv!S8-i)+?xR32yF>PM zDllCay#VF5i(-_9<%?=^$)swad@Ul$o=1%8+OX9MyCmBnFlxjWSz*5!qfvAIfZOah z*Fiv&4>_=|h>Mpm5L{~EDmiUX=JuT-52sK!_!_J!d#i)G_Ho2n>Umj#2d35slHRpW z=(#w)a&8%#t39Oy8@#1<(#UrC=;nQOKVxpe_gMIEsSSRZxDf> zj%7dIK*s8@9U(Ctsim(smJ_B|X4?fBcBM0h{AxBP_Jl`C9B2xlT1tGo(SYjlp+3=~ zR(lj?3MJ1L=Vx<;mvS^a1caDM4`EjFYp1G0KZ7Y>OW2=r44f9mfGs7pqmth z%{>^#BeZGW(^SKm$CJy&5mU&S-3ALFO9q{k|mr?>hI zy7U#%pK;OAixhYQ;a>S8S8B9eX&y?FySvJca~m$MNQUdNn)4}+{PM|}?}c$7P1F;9 z9#1P-gerh!M@|{YBrd{~AZ&md2P5-Ip1*ad)q^8C`Hdi%Zg z=M=xKG!E^$C7jmNLR(=f=&D@fhq;{YW*=Wh<@hkqFwA^7uOzb#3I|H0bqh&VmjRQH zrW+A4@<-f<3^jqls2 z7G+0#1f~&U8-%*3$zKVW9dNiXezAELT8t3kw1e8GY-TBOZ3|IkTk5FU?t90q*XyDZ z8i8PSR`N8G(q&zls+;%QwdcZkHn+~OZq4q))})|C zXLa>qolb$B)i=CrWGTGL5J_f zXo}+Iwf$XI`fG=Tfy#|5UpGcA7t)oYjXNnJ*|c}IWW|`!Oa)x)mA*OFiR<3)lVlk3 zN14pa?(eCBdXZb0i*fpb_3H|L9;gN(N&ljmChYMYnyw!yy39dIwc9A$N+u)^C2WN7k)K#5nf z(gi%dUm54xpvr7y3E5oxXtQ|*O#+~=B4dW(ZXyi;7)3w~hx9*}7tmcfxac!Hh5Om`IlyZ+d)#2&f-GShKZl$Fo#V{| z)|9jRt1#amzUnJRZcs`r3j2Y%qk*!!H}tf_;>hRPL*&z@dh^S_K8C<`+VUNLsii!3 zwv3CKB79ya&=zeoRQ#_>Z-(_wbrlA|)K3EFp``1$kUr2#RaBO`tU_?hP1#%Nh)$K- ztZUvXS%MgVH!W#(F$4ZOzSnjm!F$=Fp$+-;P_l-v6*wO&A-f2#f$S>HoY1lGh6Nm{ zTYXAE$-mUlIDa%o7G|C3c?V>#QccDDF3^Q}3tIs2&eesy>-64Or zhn&Zcn~5G}h#Bc1c@R#4aQj!1pu%X>mu z+YCAb{aGtRKVoXIA`|lOktM7C z80oNVHONJE--qKWzXIABCAb3Pf+}GJ9jKUq}3$e~P>IMzxVYRNyHc zA(_GssHC!|53F=yi8O3A^IvYpQgX0|88G$gcpQQ2xD;TP_E)P0Ji=xx@~^?I&+7qc zQfGmjlU#=fm0(r0fg!plGMxV0hZn(N|0dO;htto@4>0EXcGqs-0fa>X)AmNMG}QyN zzAwz}`?VCEGW}7UsA&fOYrJ9f2EwK_5KX2$in&{nyDM{0InCL`q__wfS~YF@u={-i zHM|1o$a3~ZA`c@t#xR>>8Fj1d;@4d{w?7JHz2DwL!(3Ic zzk-3=l__8%Z}J812_m{1uvR)djG6bmz4g!VA?pM8{I*=$JfMjn$j&~b>|vu9hdnMH zDCXsoUYoD!3;yZC|_3>ue5V#m?YLz6LmM0F7IY}Q71|rSW*+63kD|AixfvcY~dXw#aI}j}z za>iV(<}-YxLfi)pT*oS~kNQUBN-NZwDTam@$IzFb6lPhp%GHrtv0C)Mi!wzPg{C%G)-1sI_Lhb2lL0x{w$z-z<3UXe z%1+yURH&UuZvv5`CiO-L<4`+j0g!-iyj6{H&AjYHPkRTUhMLQwSr7MX;hp~i(^1J% zc|TSM%VxWW{wzy&-f2@(64n{EQR#kKa1oLTQX^o z&6Rb*tSy`U3B9o-a~*)ANJ@^2Hk#|(@fR;!9X}SIi2s0qm$0o^N6N9rq&WJC;qljJ zpo%%wD${IbbyQMp$nRv6m%MsuJGC#pm0MVTZz!v(72@U0PY|lv(B;ZMvS!pp5YljD zQLMMlw9u~D{;Ro=M00*0kmd2&vUcmbHFZY%^U{_Ilu=x_WJ@9xOq@C~;-JwKa1dn}HnZlZdVKrLFt0A51BE@Nhr)>~`#>`Rx9Fmp*;ago$9g0q?`99a7kJ7_ z=V!*dg`f7kFuQ^^yqXfYj)eyBg5mji6;l;n31U!_+>zxR_+6a81&6>7XgM778Y{QO z(8OWY?|}+1>9!!@Eq$}|%IfGGW%x}MYwg=PBG2wu;MTf2%|3ShjYiANunhO!VTZ^U zO1FQmsL;=Q8Mi@&6q8m1wQ~IXT&Ig+un3z1IW(95Rg+pcBL6wU^e1i8*HW6C8+4yl zGUbb-#4fr&gPAGSTB8_!bi0CkqgI8|B5zsq^0;@em}$o#U`Gz|LT7=?@-~mtyQ$Zx zSaCqMTKdAjc~(^}J*E%{!e$5anoKw7a%HXHWKV@HZ;nS6eJ?SAHrQf!Hml&CpzQGQ zrjA8cA{?jNP_|-thh2TX0#pH%4m*qjWfx?_qDF;XXz#7~lt~h82vQ}>t|Fex=Tl=)%(j`d3}L0}wda69H zy(o2Wb$_!EnFmv4EVApRP|Cx5o*e5xS=8`JeB38Uc5=T5Owfv*Y&m6>S?Nx8x$1&1w6E~ zDDlgNAL9*I*=OVZ^8e3Cc6j}mII9n6(>D&sx8ck>8Otw1>tMtyv=W*Xi`ud9ud}bB z-st50CpP;0sGov&Kelc+m<40m+Ety&i2bMo60?WH{^sNQPgtDg|knN|r+881^8#b?j}t z=RU!Q5DTO;?k*o%@6PL?!^n0>O@+`|Vl`j+b2%)Jh>|(ao5xPA-L7eir%}E^@-#WZ zLzTo=1DNggVD+3kY^mv*Sv7LU%E`caH-@*;9BD5Ph{{5-wI3awNivUD=&&uA0w&e* zHfio1Kix@IvOT4B&-Lc4yQ}-rALmhcWCH9F+HtF<8L(OvUzt<~o%$~7mN?6u^%h&r z^RB~gJZ+26R*f(F6>LEExHVj2NiSOde(2>(jgm7PfOpi2RQn6#*Ya%gKD}9IAknE4 zK{H0{jM}xcqOpvO*WG>cf6h&`^ijB^O}7l~2-JdF#(z@LGD$57=M-mi`=-)b&~;oh zR#uVG<_-6m0l11c@E`iV_5;V2$73uf?L@B-eQm;^YJUH;^aC1yiqvk+B4UOnh}YXy zJA{(Kfq{)gl0h2=Wi>Gl%AP|tCMe}{1s#2FL$57Wweeb`k^A>#g6PJR{w}`}<0Z1o zp~{VNFuF*Q{_W^(ijE?NsC1baj{n}%6C9NlHFrpx`dv5V?g!ZOf%~`I4~??AJrQ1k zwG7Y*ZsT&=M%IL3G^6uE%5$QQdP07&3K^EdlC1cPx-N+qhKV|Z|G~X0Xw3cu-ke2S zn$V9Fios0cvswRmg*k0cT*nK^CY%R8}-T7Na**n>Gzn z{`ra|{U z%|t?gzBrl;eS-Ng0q4v15O*rf;8TptttfSZ=3Vd~kt!IrOTSO{H7vnnRVh~+CA?xp zkjfsXv7}}_u6_WLE`-nl1%VflL8VD~*@CSRnY7x<$rAlo+onh`;d9Ff^RCzo z4;r7DPT-!+Tf`c5ECS)q1n7{SbTg%3-4057x*9N5Ild!cmN#;{I(x0^M1wN6=kRku zA@Q#^RY}2gcHXvg6(|Q$Ow1!R3ltJkVDnaKfU9R!fm}5@Og? z4LZmf1`Awo4f59E^4OoS9qHdMZ4nTB<`Jr)pNqEHAvV-G%s4$R+}MW`SiRGVN5U9u z+`23lX=MYk2>P-Fl~{lw`NpAfKjip&jmg_m zhZb`x%axJ&AYp0XnSnt8{Oe)(&tHR7U0X62iG2ebFE`|Y$zWTP`_uZm7iC6-3-mjH z$FA@+j{sWZFx%42o&{(w}GXKGwBFjS70>=+f2 zhOMAqw*+Z2lVd z-)?5xTv+EdVL-%xyfyY{$Y6>ap|~i@H_nAO(G`_d^Qh{STL> zVREMq#BFUE6Ti_Z!g%i+Kn)(&1@|870bOF=YxvB?_&6Hi0dp_c^;$AClGQX{kAJB% z@3E%G2f#T?h6tGI&XF~~tYlwQG;F%G5o9~?CZJtb4o7ldBL|oE284Aks`^A}sy$uf zYQ7?H5WCQ?P3TEIlAVlUy`a1`n<{A3B@fo>=3g@n7*;W-;~z`@UdDH6>e!w97SdJ5 zVLH*@qc;uf`1iEkX9oYXU7l$8)rY*`7Uu z6G6TsNiYwHLI@$-8){1L{`5*q7VcQI{I;Z4-=WqvJtHVjbf2JidhzKAA^l%x&r72x zU29{GePg?X51E;y%`&@6ZEsII0HE#SCYfp5Xl1VvR>Dp`QikAO?5lfUhoSxue#Q$` zgC2EQ4Z+?wWGI26W>vt4Eq_dDeYX&#xolXvSBcx3Nvc&bN&|waa`4-o zP=qoU?_5tANbT%!Wfd-D_}79~{#+95`1#9G5@uV=%sKapz^~)yoYLgEE1zenN66(Y z`3hEA2cl@6N$5}mV(pnfo^=)ed5CPM#Sr=}v*23J6UK9`#++1&Hrc=vK{C*sfTuo8 zPpP7Xd_fz^%33>Cpmj0)6Vv`!6F?fF7ATK1CFSp}uF~s23w)dZ9y$5kilCni?MMy$ z4JOZBC92o9rtY*t#S6ba{Wu=fj;Y{5HH$$M67ab~^}{clGtiY=u6CfP!Wpqh6TqOC8IZ|K=WsUZn!+PbPUUY_x4h zfjb--Y09+Wqhr&@-l=+Xz8LodvXuY(FVQl5S~DhPIm4@+?}_3LS`~=ML;bO%mo*=7 z(Z^a?TdeuCs$x20CLJI4=BM#B-X^hlp8D`M{s^4l)X-|2RPit=X!1*R!G=HAKn4>OxN5%F(K}M9Yq{xudwGI7u>Vw z_r|wpaxwL2>5~dV@Z)_daX-*`{Km)7-n>Eqk_r6(qrbG4RH46k9}O1K1!*7#CmSad zn{|P9DUVCsl8T`+B^5Ilo@wLnzGZBG_v9*vAma@*LD@G+&WoY_(3os5ZqG|K^DCg( z#tvN&ThU}4Owm5+IVA-e@Yb5pIS(o;rSzW2%Suo-=N{lTW%2(VOI31< z(chFi;<}F1UHyg_CO(a{I0tHR|MON0wF!b6i1>CE%aLYiMtX2Kq%=}SL^J~%Ob3M* z6W?bKqDJ_AeWfqWuI(>z83lP0lH$1=XwU0<41>8RT?+L~GdwE*|NhiJR4b-wdF1HV zd65nL;SgG9RSLh9Q!_fuZdX0;u>kZtMQL-q#d}L25JFfWX#jG`5Y1>B`P{*l_M z%LBx%5Eyuiuq>yrXLIJ>((exJXl$g_&c$Py6|1KZ%1OR*XE{9O9K!@9m&=2897d@g zcsH1U4XuAaoBp-_ac8vuCK)Y*1QI)-NBgA=r)ADD*)X{WE;(Q3V8)FEKD7=wY|jFo ztp{CoVkv>FZR{}%??mdldZjyeTgy{#@8h|XIJb*q4x$)5JMejwPX99x|4otSMjt%? z@vQZa0*LlW+(SsZh}a2H6m2-*S`tP^JNfBCcT^1lio)G#+t3 z`%AQNX}HZqgFDkDK&?Hk$p776vV1+UHG-wBW+SW^NiMk77v(1zrr+;QC9i5LXhByj zl3o2yB3DG7c?=eR+Wj#`6L{NPlea&cMd1h{vb57)tLpI-oZAfFCbLnYD^`5I8sn+m z(lGhMz0X>1dC0B@;L@h`Qy5p=v_DlFE=$YNT9cnlz8OD8e%5%~eh|Q+0wowS%NPyj zv&8M*Q>BA6q?Ovrs8(>zw=+NHCgT3W96N&Mb10*L68j_hszrF=U(eaYc{I$cQ?dlxbvfgO1xo44yd z@0F7$h;@G3PM*+ZKJ{IReq?)4BNO@N6O2L#%?mi9xyRZxtmx2yg@&c-I!)IOZn zD@D;m>0bBu=X&hU*f*wtjlV7c9})B&KH*%Jw*|7?t2P76II~(cEqKB3EUslCxOrEsoWWMp!z2jk{X~Glk)U4q>_UdkeR0 zeZK;BOzdNcPd4_KJua7Z`vcEf;u)y-^L-t)md&5l`Xr6%svrm{7dAvEwQgE%&hxw0 zsrigZqe=>UDC$W~3ma?Ot4ncp;Fj~TCu(7-26Ig`HFwbjwdQVV{Nx)CK-G}2?q*zw zH%tSJcx>9MD%RUD`iaZ*--)JfV^ZPk&#!YNk%;3E2+4&w)-W0g-3+9j=Qr3HCc0aaE_gbN^;^$)yd|0T#%}~zJ9H;Gw#2jjl|ngt z&;htjPT`V}cz%ncoX$3=$~SA?nWIpG5DzEt8cqW-YDbEbg2aJSkF<#&2P1VA=a?K% zJB_o2g+UTN=|4qw7d&;AEU%lY*=cm^9;8HhV@362{zDZPYkei*9-$)3lg`3n@$ z;$i2BX5n-^*5pe=%5QTVIG3dSvQqPFZff6GcK)Ar5_(Gieb>|G8mS{LcJ<~jSi~KI zRh?|0V*OUP&LN0g*UO`VS?`O~rr10ev95P2EZGo-2udF!SB*fj)C}}zItt<;XL-d) zY8y-JG6?nj14C=IKfdqel=?4hMlqw8bYPU&cu3H){+C<)+-(Q0M|q}~4pJpsad9ML z15lnZVC80_{mil-AK&s3rWFbUQt&1IugN~0D&SU~Yb<~a2@<41&+za1F__+3qq<-k zdjG*dLk6{%K*sqmrphWLG>Y#b!#S~AhY6(|N3-h3t?_@5l?gP5=Ex1BEoqzWbtYHn zrOJa{lOuZX$<(J-K*E^RJF<-rzDXu5hDs1L?*p&HptP4nmPBTNRMILTG6wuayOmsA z|JLg<-P@An_nd>p-Mb8ONlIMdOv)v9?K39lifkE%>&3%-M?&L$t)Qo+YSq3Lj*Uz> z)5rD-*Hmw_4ofy^12{s>&BDUWD&px2E@7>+kSrOPO%vz2l7Ip@#p`Ds{q|xpMn9gV z^ws-=XIxePORHk~kh?Dyl{3bSxBSOw#x=ozkSPI=2(2QXcj4))l_Pfcc1JT(vu7zo z{2Qa1EVB?@;l=OL;H~}MpQN5RnybU^I7Z_J1gIqT(gtyNTWno*Y+lUMGmtq*;`hgT z;Jc^TFvE-Kn{=!2Bo(ompkCm88N&Um(53+rd!P_%!-`@iQq55Ks|jY|Z3i^mbt6wD zYZM=cJ^?~5isCv+gWrM>#AxDEEMP`=2!|=@_Am?*4x4a@lb5y_nP7SL7mu~tdNkb( z0SrJ*<+{fLm-}rU3{Q5`TLCyJu^82p0TE0I136Ipc zQ59_3wnuOW$soD-xUnj$dm(eg=$(1J`goJAw_Ni%tR}Q2qTp5~Ax)tt1*~@+gNsYI zJ?56Jq+P)z*7rrUy_fpy!X3OG>aP=}4%?~rpgWj(|}Ie1R5fKCX$%-}{rgXd7H z%rC9V-#l?-&V6q;ptkFMW4@g_4Z2@Qf>MvIpmL}8-+ajsqT+dz>w+v)-mUzpxu0Od z7+xeiLdG}5Xl3Fb$1EM-`AzQ?oA1J@0lxR^CNsC77oigW4RZyz3B`j09Ml;HhX=0` ziU!d_@%A7-VyR!&1XOUHj*-!=Ou+`bQ4( z2R?P(_EBR<|1{9mZ!}n4UXN)9E7FY_oR$V|*^A;79br5gyVE9L%;=>=m*W$z7WjC% zE6Rr88YKK@9L0tN22*&$fas<6Ga9KpYmD|a%yZy#b8KmEk!Cef67ufO1PjhXX^{n%Ah6U1}tTQTm# zcrQu>QOSdY5fY%ycVe+mXn}yUV=H-3s^Y2^48x2F_7BR ztv(zhVs8F`98tGUOBeOCf8V>mv@{v~y!VS|xfUMKJ+5E{#d?Qa-Be91hZ^HGURn6q zg}Vs12ml}lsT3xP&vRxP1Mogea3riBKe8RQ@4_%5QBBf1wRZ7u9fe0wQVk*6?$Hdup#m1wlCBw-+I zk+M!kH55HQ2XT15Z6VnvR@s@~ZqniVFH87n9boWvKTvY4 zNHBWT2F!`fD1Mdcmbm$0-TY0L56aSpH2*Dd&}r}Q;WS(%8)|)iFXZk=u(c@AitS1v zSC`6?;EIq)GB4;M)B}CTeOljJE|J|f{2^GmCJi3Zf4SNR-`DFEnsgg$?)<4pR=1VU%r!GyJe}ac)%0$5%yFX4hzOf$agqz*mesgo^lc zEr(u06@H&&k>;F;r;#s?162%fC&Sk+&R+`yKI;hG{ge)LylMN)YRyeZ>~UvD)+B7p zBDZbug*k8ECrs+(J%}h=mnU`R4XRz(&UDcRWO?`jc&@~zif!2I;Psrv?0p$%as9w)K;$8fZO^U5)`@_C zgylxA`^2T}KsHg>tzYv${zR-M=07^Dk`B`2l*Um?70CW@apU&B z798pcsg^L9QIws|j!Az0c43-lb;fWECRqJxo&9Abng1Opw5PSE3W&MPUO6K$ggDd~ zB591Yif%wfHRgDW5vu>W$ysaN_@hwKm9~-F!fB}^LNp#5Fey0m?VGO2iePIe-3~^M zYOnbw8%@V1F?^8(4+2EO2bnZ}8czsoDNoR`>4j=jQ`~hiX8L_!cY47#|G1}9P$p4Q z#FEwrv6M!Kk!S`lCDDMnyws3lE}YA3karI#TdX%5PO&g4?7vh_+l}4Hw9n;gSRM}i&voJO1*<;|<+{8{j zCuK}}rdlZntMqF$XrNZcBCKq6{h5J-Jl5Y!g}AI^?ATr#u*ur?BlRm+v@NkR zs4)!~bC&u+Iy13DR?N{=6$(CGr|=U}AjkO=__pJ@V;q6DJ3m7FYygF)aHG?#ygs#E z^vPJG$s2e)%iK{fgjH{mZ9eD)2 zR|bj}2C4RSV(+H0O(P5{Tf*1cT3yo(+EA5%c1^Id4Sjk#o|l^W3gL>lk#L{pOt(0qiv{WSHD^_F@Qq+*fdN_aRK4`cMzrAtY+Gosda>UI1;x)nhJSG&4`h znq;!D+$0-Q;MqS26B{na`yfW|K(_iAl0FY>H-;Wu!>b`;=Rsj-RodOd6#%BS)h;vb zrIRUZY;ZJKD@j8jfLxKMgQ!5Yp$r2K`{sHuPt-7rO1Kea`%P3F6eM`w|a>oV` zT!?Fs91pG5(CElrK481YOnw6%7h(@bU$m2nkyl;%j_T_&Y98y~` zNXem=_Fp`6Yq!kFe_iEN=wRr(`!}9X{|dG9?2+G~J$}c#&($)46sPs?vCOESNEq+k zUyGC9IHUA7LxpkC7m9p%-A_|V#1Im(6tS%1CvZ_2X>vthU1MF=sS$!Kuzx(>&q!QlE@5X+X|B_YZ9DYs2b0S^+YC22*6US^-zRC{qTtoz8xky50m@G?El)A2OWGBH==*Q|A)$ajR#)jS5Kyke^=BGlVN1GQ>&R=mBHuvSv zZ}@`S{<(KyIU9ZUnvuc|mQ#Znpr%(Fl99ksAqaU-9|+wIDk6UyTm|^_;zmX=C-9ES zfv-;I8co+9nJbw~sG<K^t*63&GV2^ zAQD>gE~i{@dbEH7vr|EH(E?#+TP0DGi|{wz^q;|M$5G@1HN*)r?r~#6nb;O_BnVq2 za!bU+5vqw~$^ursL)m?gCW9>d6q&VB2d7uka=v}SJwDYey$s`yEXLDLizB>zjuAIO z{QF%z^TtLuVAoq&878a3n7T2{{_CO=vRbMMN8?6#q+)1utv#ndsPVLTy1NVD#ZXo& zCx@WNnr;JvY(r7@@`^Pnn|LPz7rAd|hcpRTMqeyY-`Is71>gA;&CnB?btff$aU+cV zk9}_Od&)1!ea4wZhhqQu6g5xQ?XZ(|2~CmklZX)y8TcvMCHaAQCDAj<@nST6#zG# zKt$xXR{i2AEH69*3?ddM-7&rvc~)0%+L&U+Z9_vou-N|V=489=?4xhxdz*v8p1K}58~Xt@{Kk0brIYjQ#8Vk`WhrZ{n^6|dRc=02xIBFBt3{`^W0 z96VnP-a*p}=`{xU>%QD^9C1DwG~ zyZ#TIoFRm9$p%^JetpWQgkEl$PTvBp2!lO`#-JO;beXrb6%wJuH45HD{AeYZKa}$t z1kMq32Nq{+x|~O52hT~83xMpkBZCj;ed@#-GBgO;(kbz||DNFA+=p6`d+6AFE$!Y% z@~IF-=3k-dS3!mw0`Hq-+i-^pi|+)5BPCXvl=dlrIBE@R!vYJ~1gsh*;FolV{5Qh* zBGmc_z#1*xErYTbZlG_zIht>4z;Rvz<7b|yCAu-k{{jsXABUJ9ku`E~Iop0w$U>Di zg92wlJEL-br4f-;D~||#H!}A5?Sf*XpegP-+}42)8OEP=d`CQ{tM*hvUK&v@0Aidt zhHCRF*%LN$CsA*~6R%u}O*0Yrc+)>`brdHaQz-rd8;L?m-uRO{w}S9X;N=pF_2FD^ zPxTw^{+Q|teHp>i_#V-z-l^yTRg-Rk1D+a{n3Fq5{MWerIOyy|=MFwesk|zLf>n|(=j@K^vyGtavz`9upib$yPJD<1Ivoa>!lm7(5D;FN( z?`s9oEaS6!^1=fT5rpPO#?MxbZ9W$X3qAZWxz&OQ++5vIN7^0TM;x5 zk+|VomPh{X!nZz8uGL**`h$mLH!8RLr%IW&zP(XF_j~Z&(W{SJIuVGDU@ivpZY$g0 z%!q!g1z^2$%>UB-RyxSuMO%^^rU)~VSf1E>L#%Dx#;LIrszFFKAfmjt1Pj5dNoDk{ z#Yk{P#b6a=u+>CeGh)wR@P1{ok&x2}KgEw(!A6N9fvqlq_qZR$x^2RLW&EL3!++H= z)^JxQ(5QE@yP;IiLLiLi!GWUxm*QAneR_NeEsL0ox1ER%D(+s8%n2z>V*2%dVoG3% zbk%H7PLTs45;}@LTJi1jjX_jOB{M-pn+A53Cc07bD;A&nMVO%#qxn z{MQ+bK?$36I2SyC?K7Il&-Bd$qnbqR(`1SV7ezVDnJGc z6O=UV9oZJrx`hRJ^Q@<>(moid*@0Jk+QCFPsKM4n+Yc@BCi|O?5_~C`MFQHVhS4aPhxa3ur zD4l!WSpUA~K+(VypdDWych zT>ZvK-c_)0B2GuK^jiC5pj|}3muhfxEdU36m>Pwq?%9_-W??XM;+t!gF%0)9X*gM=(ju6yo{NHM z+S|^jNqCIEOIuC{5x1ZV=fPh>hz90a@u6chFtoQ&WCb_2frZ474fZbVEKyN{edMB! z2j8zGcRpwJws_9ifu*$dHyoJ_5Gu^c>mW*YY=PW=mtIf#ICFl{6oMa&~ z`AItns!h36{|t-t?77wq%e7bT!MNIP>zhtUpXI|rq^=}-C-J+#?6fIk<9psMy7{Ef zdg_Mua6*0V#Hc4QSI2sQbY!AOzhAHSP2po>Tt!Nxw4yr?B8wyVoOclHw+j9zt@9aGQUJjmo}nv z?ms%zgoHte4aAr$91v5#xlPQ;2){^MlBKGjVryM>1985HzJw}%sG_NzQ%6ZDul>qc7?hRXVGHcMtp72%@ggB^l5<@p_pvef z?Tt8R0m^lC0(w&WupFM`)smr??X7bW;p^Tl2`?~}pl&%z(~JquS86QzXZl+mar5lF zXC}ToyQe7`{}AKy?Vd(%J0|zt5H1k2XWIW>Qz%Vs89}G^yHhJpg%{vmi3w986(j6- z$KM3A+n0)&(%37N(AdVL8)!;wou)9;Wrg_lk8v^le3)hM>BDr$MT*0i(9y%U2lLiD z5++K=1CB3J(KE_NpxN=W5{q~cTha1RW#6Sc80Y*`_Qq@IDpGJZ5Nv3`fUcnp9ZVi{ zDld?R;r2Owu*H8Pp>}u$kG!_5a?vH!?`53x+sQrX-^7xhq=^mszTnQ>9%^+QAuyvz z)41JRy+Iz3G)w(Ju!KepsKP(@f<9AfquRLw(TmVM8%~|-?5z}5Xr&W1d)Si&w|HSG zk-|c8pyXcbb25F_WLrTXccQhH z4i)S?(e$@%T`b?(t`X74)#Fh{&%-wq;gDjCKTTy?G60HI{)vib$gLz`DIh6T37As(;mKz;1r&P+gUDo&<3mfo$O!H*wmm)_BJ%qnyE`ou(0 z-F_CwLxH8%mLYnm7iYt>u4>K|*}U)g2+0en=bip;J1`#ypD4OS9h-OM4AZPJWd#k~ z#X^7Khc}%5Q`KKZtfLq~qj}*AeK`!HPnIZc}gT*#Lg zrw)NOIM)u$(f4|s`!V^G!THPYRMsj!v0oyC*-uYk$D`#p%oCIACqI51 zgk1f+)ytN*Mer!ZhKwe>LA{r^8-92R&55`FXH7X+&^}!PMP-AkxmMBz^>EO#s#0Vo z9YweHOhEH@g30lBj-2!bTkGJMk(u6ktL7?1!nQ@>ml;iHDkYTjFanvUl#M+@_#LVioZ1P44bX z8UrDv`<{3o%B5y4FuHTh)ySGY1Qw!eCEO-iu45tH^&U)HF4}mx zB)9!)YU8Wg`8BA%HYkYU~9X$i_AA5Knp8IO=LY!{GdI3_4CEO@uC4P*xDqBLlS{uaw z-JsUc5QW7kRh8<>FerNMzHh>wd`vr3j{i>itz#k(jVo|h(+G~rx#NNNux54&&I$_l zhSuCbd^6@ZO`KMoQZ!XKzK<7t9udfxrGj5x1$qSQNef9TprI_bPqW&zUYK=IuO)}= zNs_9mbKK`-@9eeud0 z?~S*OzCoN0ZSm_XVkAj)R520Wv|9YZV{5Ai+iJ&GD;F;F)@AbZ=aTWwR@h$+X-vapgOq6dqyUl;(hJ-kEYPP~0AWC$zjE+K$8v`MA@2<*tButJz8l4rx6CTC zeu2Xpxvvi$Hq%4!cbrxyzD9KN(j<3TFr4kGEEua)K3clC$;Xv|>V;8o-)v5RxMY8lm#T{m#3`xPvY;_C~oQ_$ujFGBZrpnBi>tc!bE4>bVsGsT{lw*t71II~M?Ccfab2(~*LXjlb$YCAJ1tUh$xor$$g&VsqsX|v zg^zs~5}c4g^BRePNa{-2bIrLq?^BI|94@fkS8J+pljJ;-w0IMKm1Vv5rU$C23G^$$ zxu6YT=i_&J9AbzVPbI1&Nv`?If+DS?OgJ2b%ELc`sFQt>27;%^4_4j8MAP5`J*9sJ zX0tyeF`G0mKN&AZMS`~K6bD*>b7W%YG9L4WF;q?{ZUy+L2 z?c%rgE02R7z5*DxT15gOcJ%>k2+f^geRV<2b>~~t?ya26n?Rih%;{NT}|K}A$6voeNYJ0rnhABlcN1_Ro+H#+$ZOJZ79p1 zWFsfjzs2<2m&?~pb2ZSwRj?6+6=>L1RPgNqB`M4FCRn+lC@rbZ2dzNr>+x5vX3nYD z=j*^GV6|>Ii9D0~1qGBwwvs*2fhxIucCnm%12y(dDp{Da!|E=s*z9zy=Aa66)hMvK z`goDMrD`5Y8CIqjrU7`?)9y!~MGWuXqCdw_(41&OPt3&AUsN&ZBp z9VYQxvM$(X=s6@f0Omse=uEa=cer2pGqUo9I*PeRq?6&tXO5h)(T??bq2p|4*~heB z12d2*;)kix7tWgjm)E8>iYu2^56ym9IddM%_GKf|^g{&q?m!2$2oPs-TIFT-sMA7eBow=OagEfQf^@~EC@5?yXox8xQSjSr94;E8NW-R z#o&sL82jXM#X!3R>i3Q=GTfOz<&K2!af|=Ceg?)jSf=z{E`e}`cY|SUgKa8x8Kc}O zq1v_k75Z7-cnTnYNxfN&zC#67&YL+Rh?~18p9~$_l+W7gW%l_=T>cSn9PVL#^ky>&A z450D|Z<(nSr-in{ZbOma{YLRkVEDYw;ilxhC=qo=&?7=OdC8&&@HGkxv5UCOMF#N} z#U2n}r^jcE)gf#tzkC)r;5H>eL&3@2EL_v>Vd;JJddRGf-NFYQwMy>LXsq~+_#>{b|k zlSslwuj{cf*NcD^E<>p_nfGKgXq_3asm#SSX_G|6Qb)$~ft|7-P`h0~XX|Rs%65mN zjNu{tV{hWLPg;I!1+}e_Z^ttP&K_!75^+-oO<87t#%AIlMTJH@O*yk@B~{TlkY!Yx zaf>1B?0#l7Me;m(QTiOXQNn`8jwE&bo)d@AUT!f1o-vl%jhGqALcisUEA%z{a4p-H7wUP?YF`gW7`l&RBavK|b zN$Vzhw-sWI9`AQkGka<0X);(pa3}xhBdho$nPDppn%`tL)qX2oAEN<^Rg=mRG-LR> zMDq?996|=y=Do_fWObj);EmM`ND=G#cWK?@#;BfFH3g{UQwa3X@Ud6-a1%=vjyc{D zF0c*>D)OoqeE4>QjeYHOa`rC)p@+`U|vkYz!ZTseb zd_I2Kjz8iV6I=^e!z$j3corW=NL%Q3_}<=a8kZWx4N}neV(`ODKKB*-#~Ifzwi3hs zJ$7!HqAu@VK#emre-jLMc!1q=kW6)jYrw-q?n0zX$p zPJhd7#QL5@G$|6(gYLHE7EX0pSuTC+swVL1G=Ss6(GN(EG0t24^I1(X7|P!|J+_w% zH|k$%0e*0{PO2U+)M6d()zF~HjVQgrYl;d3Og2sWLH17HKFvYNc{Kl|oQ| zb%urFPtWU ztT*=?%e=3%abjk}VX%=?;z6-H0@6q9o{^9PG0c&==NM{WpRAjg9KhE7Z8c2nO*F17 z?IY8w4TrT%LYoHk*J@6rYp!M#T{&96W=j`>03@-xC_!-|p6M|`zOf6Aa=9Kk(!up1 zCEe7b*s=VC5yy=tc6IJ%_L@Kvoq@1qb_+`j6sU)uJ>?KD@G5f4_byJ0L4Q@61|gU?(u~+L3g^M2U>(vLTU%CfaQ1$$ zb(5YVEs{Bk`v%U8SF2Xa!7+EK1c4N%!%;&+NkH0CWrGdVk1_2Snnepl6kl+npc_+@ zZ@kzM&Ghr=JWTo0=D#Glk5Hk6UQJ}W664b(BaL9(GWvZFr%!~4ZIc9>yDP5@U&}dy zF5)=LWI+#Zv2dxb$0)H_%ojBkD)g9WIrPIlVo0ACKO@5^l!Zm64?+(N9R{A>h2B`| z=Q{3`>wG^i4|{!3-tWE43NW3SEPJ|Di^y4Xz&;zt!VdbFk|SvQIXqB%;T8nD0?Gcup6eM$QpK8tizRAbdb)z8SK76>}^u@EIH6pcE&A-xKO>$9jr9cN4 zv8HZDNU3pNV@7gmpO8fiOBVV8nF#k#O<>X@>BuJtYmR6!PP#{#0}8>L71sXRd$1b* zZjY5XuR9eER;GXmJG1NbZX5l^(vwQ85UxoUk*+3S3^a1$5Mid2%1}qZn0L}e6t;6L zszG83qfFi7u0*H7O$W^4aE64x2OU}1ee^dbc6}5m-H)a9fRjck=^ql*OUz(99K{1W zQmXTbGdX}7JMfBt$j;ED9*&g_=@fJ~ z#&xIwIr_p_c}vfpQBCI|K}A4R59`K{8xCmm2oyv>@%xOK>{ZKRKdfee!$Oizu2BRK zUC~#gk{DGKGrl$;x*iVqa>H%`o~wsDT&VfFHR*~4s=t>&n|&qzx`{)zwb1&V#+hyx zne+<&tadTcXr8ia7u-PA{cNIXN9vae!7e4*$hZtw5>B#n31dg=sKfghUvZUNBd#5vvMB za)CNSPOh@kUFKNkjm>QuCWER@9hPyY+#{Pef_bj23HFd5a;+Jip|a;;O_2Z~q?QH} z<=2mQ2fAP{n>bW~7wOV`Y%ojr7Q9mshwf0(EXIbS01@jxjSs^ZRpSs+b@qq$?utar zPM3n&LIoR<@~>anybR?2zB>o@WB{5lLZe(+Ga%Ev{3T19&Z(?c+IX5^UFd%PY zY6?6&ATLH~Y;XzE}A{4Zu0 zVr8J6y{WYo$6t;Dc0fIcj}<{ZhYx=RJqLg=P#-|g4xne@pl9TuV*xPGF);k6qqQ9e zK+4p>L=R{IQ23y>0m2XqSlhVTnHrloZ~*?g{UBhc1L)ZU^sE4mRyL0M7N+(lKtq7D zwVgRY-xa`b>R|8iL1+mOvofIh7Y;rP3&7uR?E!W`d!U^Y(2(YT5Fs-l|A>x`o$BLC zPxtpL{ok()06r^2JD@8-nFb)MXJzg5za^k&q^ABzlJ4I!;{XV`H~_8wRxW_G(Z4YK z3I9Lp3;0KUKLQ1a0Ih&_AH_8MTb_S=P{P)B#=yT-@gq7qRsflagM$qREv?aq$>?t; z8haxeE1&}{`A3n3tPBOLEiHjo4)!qgbO1wB0|$UU(Ad-phW2k%imo<506oAEX!H*( zrRQL0>H^T9qoJdt2hjcP^Vgl$M|_6XRu-;*+@-C|Zo)`0&E-O$nIKf`zWN8ljdtp--prNd(gMkUaNYBC^_>XlZD?^~2g{c)# z*4p0mZ!f}+Ep%-EW>YjVH88gV+S>zI{y_({GW@p?gscp#4Na|#0SwG606jZ9Jy#gI zk5Oe{W(K&^157`dTmV3q4{cf+D{F_3EdU!w2T#Dq8vy2SQ^Lpypym79(mxOrfR_Ic zVg}F({6Q=LTERbv6+kQW2eAWaMgBre^Z;71KZpT9EB*(4C`kT69|}@`(1(KbAM~Lh z^9Qj3Xl4IG%ya-+`9J7GPvH;x&{O<_KJruggFe)i|DX?bl|Sf1UG*=-@?q2agFbBf ze>^|3)wk0#Fb95|bw&<P(`X`r<`WRU|+Wob_`r%>x2Yu+7{89fXk%_B~3Gh!q ztRG9Jf6zxQ%>ST|@GbtJkJK#xppUTsurPe=v-;@bKjx1-tpDhKY_YOs)Tv;Uj8WN9&IhPXCWS+sERcG}%7lw*TY*Hw1M0r@Ri;0qy=l z`!CaM;Am&}aR&eW4Eq@M|HMY7A8!;O&;@7!vp8pM!0B&R?cefH$@kTndUuSKd-y<> zMC#Ye07NXcCJFN*l*5QB!Tn)+Sa%wP#t*RW+2uZ1=RfMtT~;Vb zDDX4?UbCjnvPTr2Nt1UAY746(eXG9oY&-8Is6tcMo}`EwW%SeO7P6E}j?NUS?}nO# z{|elrMh55f*x9KJkM;;;A!7<%A1Pj$YXm;5(AN5!Jy8lsXZ4P2{7;WmU#~g2733EX zZ|Jw@Ap+qth~}fItEuE)n(-3q#8fFULe;$5Mn48h(bpTWnkZ(xta+9YQf6YZN^xXp zDHz_cc=D)|f~HYxr_?Evvas@Sf(3~3Wg_+k;$o(d04j(>`4&qwCZ6!LPKrvG_wo6- z$qBJOd7A;Mp2 z!o*+Y2fevF#vv&VhJJJt?qQl;eaRkDtQ-fE;>q%XMpWQ+8o4sy(d*U|vK>YJt@lFn{FFvq4xE3Hth*sucg^q4m;m-Xk!M^feL#_Y2q&J~Cmi7AC?+SLuA+fAPQ z^!ucuQ>{c#^0%-CC~dLFR9fbRzW5$;0^jc-6e8Y?RW_`_aCWWv?y}D-+LJXATT9Ki z8jx0K&ZNzL^bOi!+?pXm#g{lbCt3^9c6a$Up)`AjhHSy5{QXN(^6*anhSrK>{bqxK zE_KpY97x=eS|cbPPVc_Eu9=ph91KjV-eF~kQa0{veqGDYrwFWx?^Wq0lcss7*l*LF z;|ecABKRrFFj>d8i)s{axQ4;6Q%b7o2j{&8Rvok&xm;J8Yo($Gq2KJ+N=;{y&khR< z$8>c-0Ga>|<^>)i3DZi2<9eutzHlp<$l1r7)}W3qHw{g&vG-iI!&>tc4f5>!)CCk? zj2CQiNGd?a0e3tzmWSz=HQzG7+cfeU-=lpsg1d?;(U+|!k76Y`3q44IvRh{U84Ig3 z5FYWAdDZzI@2*-61nHjq-wrSJ@dV8QNJget4}=kJ6yLptv8Klw!S2bVZRHzuyM89) zG{(th+oYM=k8x3#kOC-8pjF#8{9oG87vX_ow4bFLB+5OZVv9GCRo;v2$kD;V#zx8@_37$y+qWc~ zzmY8syVVmjbI#+N_~Uxb!T*#IED?SW>K}YDDefr0hq1^1B64+8W>HsK-QT->u1)vq zf37vQYFin3GuCo*P{cKZ?kskrwhD?Q^q`n!*8K^$a3U>ZinYspXLiJ%8P{Y^T7PZA zMUUp!XUHF+FvI?F)<|gy^Nj|y&^XVnfO7jLVaIK@JQMVEEaGJ3hC-~@Jfbn}@s$o} zDw1GJp7m;8(d(K`IO=uCrJ6-Dt>a7Bq!qnm7d4uaGaJ}Ha9i{~6mob&k% zLFpHqu+Yvdv7x20z8GQ6Ei7AOG)Q_otS@(5Bydo@>a3qynpJ|CqVA$jaM8zu4FZn> zqTIaKL7n(3d2et}^bop?=de`lOHv=g-_=HlPSlIgsnoAUJ{5A~vtLxJx@@vK_|t3+woidQ zL^*fcn$?|Wg4|dLVeedx{%RHQj2QaI7E2e#cj_9tUJRM(I9@`b!7`2zao+Q@BhAps z=c$2}9e6hKGJx(n5QVM4zTbIl*E^1^=8Y}}S|j1QGLV`$gf$si~~ZNJi6r6bKSSIR><;B3Jj?_BKm;|+`EHfxcQv|+!) zNK;^nbWt;Ond~O@HWI6GrVc?IVVlJd*!hY zGq_n};&lljW_7l+oNIDajoV=D-m!D8As35f?|Cl+=Dco7&d|?9E7OX^4L0sa>Z4I_ z9z7Lp@38-jBR2k;5#NjF&z;$6XK#HMkK*U@)vld9)jG^EVimxv+ire1rXP_E7>2XX zttb<{80;1(+45b!s&~;cs^mGyCzWWE%eF?6I`pVnsWaq3zojVcpe>1?k<4kWsDZUS z>t4`aB2!jwHJ^GHVpWPVQ%;>7>ezZg4$%9?-oKPC5D795Knt$DYZ%}mDobwxm+}Ge zc3pSD&Tr*pb=qm89f^siOuUg=c*+S8zn*+H87l4~F9|TZ!hC z=NNzL00?9_RB`Eye8OYfmSk`*XtfJN9?uLJd1H&^uimg4NL1P)*s?!Uw_SspOKX*+ zcux@fqH&XzN_DLit$cWY4Vm&ix{c!gs}A&yvt;9rp~GYm3J2X7&jn83CdDNqra-&S zajPMNj~Ql0=kxV8kdM(D`E!Aj+$E;3jKu^f^m#qpSLHplFRTIVed4-B)D;m+GOo}_ zO(qU7G<^Niv%ut`uK*U?tMv{}V%*4n&B83ZCvVLAkgVJ?afTL;J~9 zdjlN`OXByacqIOqq`dQs*z#()6c^35rhaBxm41Y&9o?yuMc>m1qO$q-h-A!e_QHc& zR6l(f1aV6FCoYrt%L3M1aN>Bv4b9g6-{U+NP+>wZppuNO96_I>t0Nf*Z!48ZbD5+2 zE*;Z`Z7wGy<(z~@Gb9$lx$PPTXY{iEfVC)fyjd_$ zwCSaMxPy}{6F1)ymYp?)BAEVKPEg*Q_Ut~x+lK#J-7$dz!ZE-;B$shNXf5G(;5Jay zHXg~tpk34KE~-P46^B+sim)wt(32cAc8R&lyDs4c--`LwSlrJk#nx#t(A9Q z?g>e{?_|ek=pr`wbrz3}OmkJ@H4ZV20#&~k{$^B3J19PY8pwzbeMY1#S!5^ZUv}x0 z_UYQ`L<$^pH5+we!FxhzA02}#TmOLeur#=xmw< z{t1oMQ`bbTPL0lGDdQTn9wn=M7oQCapfi$;#pJHJnu8nO`hL0N^RTXX*Ht^TbY%4x zrvgenqAe+kx9V2`mk~o40X9geyfgz=d-H5esZ71Q5>8?>*ppOo=-{2=9kB!f!r!T7 zn;1D`Cb4`}LY-sa9Y4gz_X~I6#x33w#BELhgg*w9+WRiLSqmfukMOjnsrE2ABm+tU z%7nbCzhz0r{5rhkqI{bK62&c&5>>x>AnQ^!%yd^&*eOab#OzJR-~h!?iFl_}kYVb- zzaf8TwgN+Z#XD*YkBcTIuNe7`&7fZ7Y|c1VS!7N`C*uCycr{mfvq4dH_+qtY$ro>$ zXJ2e_EbQbI^SBZ>koD-`{q;AqB|fp&cEof&#Dn+T5A+)J;kwbwMAu+qH<+O#mihpv zsJYCt`#a4!S|UYo8FRE;S3Pl9G$k2#K;A*d{6!a93&;=2c~_ah}THmT1B3a*XKV)|El-0%xHW7T9A zHNn~BxP=~7b9;o7?N23_(O{L6Bn*4%dGk=H_XMkfd3JZ8*H%#6FATd?!4))OaLQ^a zk*C@?aINRmi`ZlI zfcZ7qiWvVT`Bi~?_pXZ=u@&tL?@jNhkW8P4B`-D``8PtUZy8a!<l2MIU0nsPS&|FR(ou1-NOb~n zx7uvpoiq7R#Xt5{UE8EDI8%<>YU;2H5>0G{Mo&N{SW73{gQv9b|=sR;j)^YfF}w;^u0)5^!l{N6XBEI+?S?ST;rdO8D}%T_pHP%#~a%YYDu- zxh^(1g6(uK>Y3-wF9^1+y3Dn+kQbWQedjE5ZzBL(O$|OMf(-9-cHO<~DYk&;ohWP< zUNRV#c3GuEBw_J=a(|N?_KQq%P4WKg*(}G>TH==q$r;8;3SG{T^H`m<)5MCq$gO=F z!e@WWifMAs93K(!hp$Thm5O<%@$~kg?}GMUEgL|b#U|@NUnlZ$Kbm-5@8ZDWwc}Y3 z!r>$*N}h1*kRCSwMiJM$6wvU4AcNk7XQ@y}o9WbN_Rygx!LZT*nQ)eYUH*qV~*P&vG%^yWN#Vk9Z=o z`{WCR4=irRJ61XF2t^*$*BH%pgxFV2bzmmG?Bgr1?r4@VT_vM7 z-<&-B3L~Rb*7pC(n?w**KUa$vwTpzFi+cyqzZDS`=^B9w5q&2V9`?x3bbqQlOJBO z1*d-1+n8)Z$pPevmdA^;+HbZVB~auR8Bv6TmI)+oNHX6?sF$J?e$8TGP3{?g{$Hio zF&xLYDv|UNdCg%DsKaU19<}1RZkaQCqD1f^zRAgu1Lfu$I8X44kFYuo2Ds;q-d8HF zyH&kf8h7bFvcbCBd4djy#@?k-Bj7g(@+?FuN2O(lF;1=nI*41qb*7i?@>SLHu6 zEYc(8L%$`_$Rmq5>TGs{^9g+enazPEf}ec$ab8#c8Cgj##Oe@+lrM5QR;Z=sCdR1Q z1J9<%x(jz25`Fxfl^HLNeTwxdxAuCEB4&)`d%ZC|<|VZgu$TIoavX_cP~jKV0)bAy zoKG$duzPb{-n0^d{#m5<{>O~?N$_>OimiW@haX@FG>Vrd0hHbaq3&k+hCktlZ@4KP zl(693Lmvw;XqbY)4Yx`s-v;{YuLnv4o{~i#>WxGKc+w{O6KJo*aBK$WqHRtSq(j1a zbQHnWWyS8qR@5NTiO0{DM!H>rBB`6ySIZ z2}KBjsOyC%Vq{TDBP{mEdiwZ3vp2kH2W*D|B{-IOyFyE|daNeWJ`)lJUP685fTFkt zz8+ZT!YYc_FN4Tp1jqGYDqxrnb0^#|fR@?21^W~YQbAWqR4=&Y z{5-e93AM0|7Uj3y)4kV&yGd|^bmih)7Y-NlVqyLfof^g}E#`R0oiR=Q1alyqJn5fb zUz$NUt`z$jbfU%Ud3N{<0%&jHxRh8D1}&z}Ks2(6@ZAZBqXaSG=FK9*$=q)tdy})l z?oPYCHw6`MH|Gb_JWxC&%R>=Fupg^vd&nG^xWjVbDnAUzS&5`V58tnEW1CT}`7W`a z!UqHA<7zd+bHtieKMlS-myG{-x$#ZaymgNlAd;(gs>?`tx zZ0)4Uu+>)%br03ni#tAi#Uri;V{bUTLc>D)Izqp7aooo4%2qm2L|o2D_#0jb7&>w@ z0yw{&vuI!EfZGib$0)a3lXAnUwA;naf&-lG#2%eI{G;*c#|(dM_<(OMQsR^)@@-xj+KvqG#X7N&+vk52b)5xh1y!P9Yob4 z4v8B4R54T;^%$)v&T|sLE1~Ow#-Nh+_>#h9#=W)!R$n`)lUJGJxI0gNS-sTPC7B(K zTrJ9rV=5AjJq`-m0f$1v*Tb-jJL)a}Dz%PUr-nKi9io((8>XN;Tvn8)u@2XXq#l)c zycLZVIHZ|TipY)CpW^M?*5pTomA!-^N@&1HBb#b%;-3TZcI?Y9>^01YKJhW&-WONU z&A{RvC)LQbMTXnTsnR2a1`F>;V`qLB!UUb@=(jZBaxLxm#LKkwA$qTo#%G_rz+1!Cx6di#77_E&^U9e2PmSrp7N9v(yD1dN2DKh0@3 zY&Y7)c9F?#s26`_yX+d$UETG8((3{K0zsy!V2`BGy~WXItvOyy^Fbo^oM>Pe=7)w9 zSB>U78rmM#1azDJEXid9BOwaGW%8a}opi(;8uDlV0awyV%#4)y>Yq5>9GL;G0-{1) zHx!^UQ*^ep0`*1I%eaCCO40pJ?2{dcBo#H!cZn=^BJH2Qtyz9n)|#H?k%a9wJAsOF zFk!1@HEL%E49aBRtw))Sg(q0oAT)~;6we&mfypYvmA4f?wK=^McYD;NH9L9Q~@2V1Dm~trX#W~1-ej|(r(a?4$4A)?-fUAZF zRi;g*Pjl3({m!O#?Tcc#q+Yba1xRQtMZE<>PU~F6?fDD_AIG8|k1J<~pku}21s{#n zL%%iKN^(kfyI@vBJ&0!^)RtV9rVxZgDg;}M*XM{as$qH*V!Sq%YkJ3+7Y-6K+T!f3 zrd*c~wjAuxnWTo@sV_!YZrPA5HM0yaM6+iK6M{`u@%4M}qCIaE$^})!>AJ;%%|4*} zwwk+!F*JmXUD%5LGU+g^4gPTeg?q8nVk z1IfyTr{hSZ^L@xMa~7HY#j8~IMXeFF5Zpb4pPNZ&7T&Y9niPYj=$Nn?3tlR75f{2(zCA;q9aH_#*)E5TRo^ zgF49XtTu-i91cgeNlbox-xyMY1?{!k&B&wR+J>PvQ^6DQF(Lh)gj?_wYS=-Yd;lC* zapYt^#lF2Jbl;2LmPkA4J7330YdFr;FCF;Ivd;{z^p;fmId?4sVGegHdt*4wIk>a+ z*?G9nM&KrHJNqwEzOqH7=p+8V8Xbl^*4)m~5XZW&8X`dY8nZs30J)zQnLf%DzZj=4 z6L+Tzi32MkGO>|T!ins%j0q_;c}$Oui{Iq}3rfIFMqG;sn_F2ZU7|G8W=;^)#lfiZ z&-5oGAixzK1u!P49k%*n5|rmYG2j1=#~D3>?LZG*I>@p$A2zGKVy8vfl8yQqpTGq9 zjp=jE4%#6fcFHbAvGT69uW_gV>9IwQbX|U7Rd0`$QlzDb5xN#uaN1~g@%Y;h{|M%0 zrpmsTp`4{|!r|T4_Ir~-BWzGF$jHN4pk7Z5=1Ah0M{yW|kL({EX*NSzdFY=gk8#Qm~?=m*hq8^r4|({sO6NbDZ&x zcJdH3xstSkx6D?9v_(kBpiO7xnwXBuJ5+@Gt6NH~na;b!hHzKN`#BBE?)Sn6n%Kfs zgz&g~!TGW7{XgQ|rlWOv{izN5D8T@`7vnwL#ubZ4`|Oy?Y=tnfX_jJqq;Q@YIM1q+!8)+L4zVhr6@@HJ0Z)ciY|JDIRu0s74y7r>W-ceeNaZD)8$AG_@anLp&268+yY3{Klp1gjyi)PRG*EWuNZQmT|JZqb)d z>37zsZp_j?`{H2K1%0|+VN#%y|G5WeVXy0aN&b+$I71CbQ_%0?KNds@!)E&%HMdhC zhcM)VNozNrw=LK84ZA2ytKXXf88=~%-S}7j6279^c`tP^8{7QD8sI!I5Zp$)Ot-g+H%NkW3g9hl{xThXExQDFd>`wnKGPj!BR6c6Q9fU#xOJ~X8}vnBRep19GBw*k zp524HR~>QmCn*raB}}E8sbC@@ESrrUUzF0B^py7O8q06PmGrS5qR25IR8Z(tNa~^z z`fc!G$mzjEw4Xzx6_I~p_$;X0(j>Qo(fknnWEzQ2T;Xh=V8Ao9c5tNt*GJS6s*Fo}5k&TMHREhvX_xzx|fF{hD}c=Vpvm zxmrSM13QdZH;hw!spUizPU-#DW z2&GDd`N*+zd2WOryX_!QpAJ$WF)<;Ci+fXL*+s4cQL*Xg$f3< zF}q(g?8)L!Q`#MXnIDf-?rydA{3!1qk6GI?n2Be zS1yFYt)C5Z?G(xfos2Bj|H*VVZ!=J=ub_)>0DB4llq^>P8xH449tv&{UL97Fu4`2U*eiU&x>O;(kR2aWToSGhrj`i5`7Yk2aU@o%|({Hb~fHgteN*EK?Lpw1_O{!zEL2w8|R8=R|vA=6gK7x z!53Jqd@`>6B-@d9Ifg*UUDXpDwPT*JADX7|qo;kqW^?VwS(l*Mm;(+q#CTGYYL9x1 zhVT$gvpK82P6rlLCn&%DSJ$jUs+Yr^UtYffCT{L?jI0d-A@tY&u%Ynz2#Rf(f+ zUulAKw61+Jjjnsc+o7-sdkJNV8m!<=^=2K2Rp?Qypok+o;3}$JFdo9-&{ZpPU%K=zG?gpt`6cN_C@@Lu#40=DlvTz zI~`%~P!#mG32K6Yb_n5kIfpo2RX=5xE#T~gcw~JR|1y>mbE;#w85}g4)AOLD@;{g{=_3yyda zdpflb(Zn7i3q;u@VdadgeRi2zIDL3k3b`vafdcq?g6MG{C~l9XEHn#=%=+Nlfz{BU z@GD77hj<~O6gr*5dmL^VDa4BBk;;K7akGTZ^c3khoF8SZqQ$iyIk4D|DhHk8TNDld z%mi~78*F)uIwnU{dw-ruXdsN;Dba5jp|7gT;8|C{AtBv6qkwmb*&ODV&8u>Y=DB$Q zw@Yy87~8<=XD1WlVbX{;GHqjqsDw5Zk8W6tjZ3t^O4J$NL^Z#!dvQIz%W|Kmgt^k` zk8R8YG|NO;iYZHk!ONoWTnthSt~a52BfEU+#O3PS_q zLF8!K|R`bm^QeVI3y40_C0v&QoI#7nBMuC7rb_fCDqy&zAkizq>%wV6-SG53!13#_m`6`p z1srK1wTfvW%iS~s+TL{yVNsD*lfyFgct3R@YO(Yd4qvW!;@N88QMlB&RDKS8D2x_l zOT2Nt?Q$=T{X`Q)6MHup))^oty%%B(s^YpkI-~4p&A@!J6u|F~wc@bLL|Z2b?#I%K zzvx2BZbYWqjnlk(gg63togeXKrqI#i>$lwA<@5Z?ze)y&_gEOHoZ~fcTN;NtRV0(B zF|g~3^cMe#IL~RPv3WYc&bn`mSS8sh{S^EFWX9yi9SRctG`7_4GpeQfOyaByw*BHM z=qe!_?TQvXCLDa{Sq<4n=z55~x>{~-ZD_lMpB6(SL25L7#3@rl0qCLC=r~!^q0G*& za&$4-0zpQA>Gk*(V}3RiRj#sB$}e+r0@rX_ubyP8ud;%j@>uT2?D4GE+Os_F`42Fh zj_{QRhx%J)sIWD>_0&ejhu7<+WYuK9NZwuxxWv}2QjvC#|z(%CZ^G{#=!4{pPj+i*IhW3@_q4K^s305dm?c%S!rBT9@CEXFQ3^= zlx~$0utk98ZkO{cjXSW-L()ik`23rliX*HtfHzR_c_6Ofo73{Osf_{VMz=587=z4d zAOg!?Db%K{A>W=j^q81BJeF$!72{DVoDWxN+{$aTfQ`9d$!oN>?!JIi>HJZjB?=5X z@|6EdIRNv)uh?61aCw<(-8_2}4{aKxXn#2}D}G7U@JnRAyV^~l1cupGBC=&%!pb5l zA6?|!RCfbr;{JoZq@#Uh4VekViJAisxe3_;ek>`TPuS~A=mYexmetYsP3_H$)`>QJ z#SW)x116eKQ|BZvt7q=1if>kj42(>LBB?{iq|~dii8KrQF6oaUNyGNUECLDFwsajk z!DBs)zv7^q3u{ZEBQttkKVMopY0QWX)e6bW|5W0y!>JqgycGL-sCLO0rD)?j=?F@Q ztcJD9Z^w!krWqX3Bh#b|DWI;G;C~A`Zma-AK)b)wz)tX>Pc#9(t=>?03w9l2K+#CM zd0!8P*$1xXOo$se(AFT=XffX&{Fur6luZbI4J}SCdj^^u2m6f6RIPGnoZN%-0}ixD zIzQo)w~KYG-aLZWUJbEvC1=TxNgfg|Vlg7mhdgS-TrKA^)yK1EWF)psz1PunT49J-g$z2p~m8H{P zTg=_N^>t1Nuvfhe<^3$ylxOp(kysAf>s~Eb1|yMSsf4%(1@l9MSyn=I!zJlBcDj2J z+dgE~w;E$kC1v+2yFfe(`c%p|kBxj_4e^0OU`|Fj+&)`6+rY#79L{6|H;;Qd$f;&S zBlL?>40h?QM>UT2;Abm+N1ntn99T4JqfODx-e8XOEJek2+^MijBZ)0N6zAf-upZhd zbMpTEEJcG}ButHN@ls;~J!e#of>D95_3kB=?Q1LPSigobV1KWub8_uvIG7{wp+>bB zv@bwVu%i`g);YB3c3K~O6{5;sTUWKW)b%JlR;F1AZPu~??bS=tQ+}PU43!X(H?gXQeyuYq=quKy=Wp2vig4q!CSH(_dJ%0BwnE&Y9c! z7`Jp8;A+ybuxvUm4shEpl_$}$m6?ii>e zjn|}a$(A8*zHsLwu+n(ifp?~)s?;`R>9rNqk9>*r;R1EKJmmV^UBalO4|QsCU#k zF5N3dp4qtEbP20aT&^!QuL5AOe4!AMQ>kiK)6UrxBZtyz?yi8N?Ls~3SC_5FZm3ub z4G0jIqx~UVKQ;U#i}WUSs;+e0YXR0Qk9@1z=e!6kou^xaNUqm7cX|&Iilt1+E`24mj+AnkRzc~#wgz06p+3ih1q{1~X zW6_U-F6=eH>~>Z@_8Fl}Th{z(zvhaNcB(gsTJ-crU67Sp1!1nb(@jvTFe+ypw2RJ9 zabZX*aHeh&GMp!o&?lS4r!e!L)<}&};bb%?0ov&raV>Yo`@TAE7X&cPQpsd#@o~Y1 z{jnPx2qTjJ?I%uMW%yFzi-cHd(zzgcyKU;-@T5B)-eSQZY_mDs&aPfIJ3j5_CNv@c z9F&O_9IR;OMreOkeAhR9%#CP%T8CFfKfWTB)mfFn(Z015V`4A4H$dIQm-xb0{4DTA zh*|+|$S?r7-uYp5jGs{eB({f>z@wr8^mrUHxC6FDk`QAQJO(D%3HYFbbb$&(Z20Bt z8`VHg%h<|kR554#47~!H)~J*6bDaU!^E+4UoN207)8e-W5eBkt|HW_0V??}p5v0xv zxr=iJTSepOMQw4vqAoQ87`i!+`QmPcG^*e`1O|BVwYODtGG>kp4PQs;;}ben)kgdK zuGYH5r`a))i7-EzUYB~gVJ#@Dn4*{kUy-dAW7Oj5CcEq52s^#S$1pPY$J9Hhcs=$B z(My!VX_0h7n&sd`hVa&X(M7>vANhhWX27$L3D__Iw_3Kx$V>lN+o)H&! z8R*rn7P&WNL6P!sd&74722o(VV?^pn%iyukp-xvdwI=A~1`P|?K|ub^V0?y@`po^_ z5JcC`uZ8*XjB3wlKk;`}+saWPBk2gi(BabFN@B5Q!+ zTt=twPZ&iq@7s%yZ}&`LT!_Hd=pH%SXU&eztVs=dR-Dd<7(Bl>yv(dzzLdJyjSd?> zz`)HreSI9es@gLxXpdt$lCElAdy7Ai~JE!>P0wsf>Rp_GQK|=PJ&djk$Jd$h`;-MT({?IceF|g^D zoT7M9aJm|wACf*%t<6|K&R_e5W=2L^8YNn_7V`kuoV>$@!0@dkl~N~hEMI9cmC)lw zq_C%CQIn@q{G4m$#Cb26Cuu^MolnEZs(F{j5_Oit3XiUYdW69kP0XV9nxeyJeJy;R z&5!f`s^68VKC@=(YXUX*MZI%Z3~1G$Bz2wSt)NkSGD$WiwWDOnU^d=y^>WxLQM;OQ zua5gazmkqx;!iqXxn=oAC)g&a5BR5Y25Wd0+mtN?dNyldHWW?4<0(igcQ_7u#)?7c z&u8^T)EEoPjQIPJx3u{asY_@lG!eiq}*AKBOCDr$^XCK16(>`DmMViFI@{cpClK-#`z0O9Bq z)xdmEj{|VU^*G^I?H?|dr{n_Tslu@q(Z&b)P;;D}WP%MPtyG!ut)^DLvb>B4dm{%% zZUa))%k49zk>f{?=j>alhz}tIO?SmRq!(X=^S#&1rYD+j&ke;nD41qFl619KZbo;s zpM?vaU&>QLv_xiCAH!g-;>W)B^PWU!I!Q;9&f)CFg`r?NcoF+wn}d)hdYZFV`+6C^ z!xibHZ5;#tyUDu4xNUzF9*b~c%Hc!Qw(67|*s*5~UZVbQzCl;?A~Tf6WDuR_-y~%B zQZBQ0dZdz|n?PBs4z9s1Mcc*(h%G57nM+0x^DOV{wr4?yPtHh`29aX1wjW?NInn`}L8@x%n(MuyQ zO*mI{4o(nbF(Eg3vbPyVYXy3^oz8^fayh63tv^JM>q~S5Nyeq-*d)4Ed0Z z6fW#M6*A3W&YuS)2i=BGwsg31Pl|pBgofeY;P)mVSk{w<#fYf=JlZRW5KV+?4uTULaAV>ckL{du#D-#jqFE{p9ksFgd z^*e{Y!j5%ig~)H)cr}F9KxFrY1k;-wQP$h1%VH23;bOWy%CCioyIYMAOgwj$A9CfwUY6;W zUNOsj$|9xE5GdWhu47|EnD?XrF&a*_HTDzf?WtVZsEu=3bdA2Z#C*J9S`~fQcjd=_ z^UJt3Jp2={V%AP*PsU5uoo&j#2w!gz3Q;WGw4CiOV3;qGLuR&R~@i1(rf%zM33Ww_L(yV`A3Pmmy`tF30#`dwxqDl7zV>3~r0R zeyl0q)GZClPytZpP?Qi8hg#Q#W>hKaq{x07&gwgabK6|G*maZ)fX)@?^;|?Nu?>E2 z*)Eh8VTEIIdD7vz1-_0{g0OE9$J2MHLOdc$Z!er$%a-d_@PO3s5;;o=B%^Y$qv0%2 zuNS1zU({xb>c}xltZU95zopw9xt7~>d|GEXS-+rt{(_U}+_WNJgJ7%vgT_1aaVkF@ zXg=e$!GF`@VJEjr)Xr6Q<`w?aP!WjOw|MeSQ$~cW60dl0JDE$(JM!ESS24ZoYM%*> zzze#YXgY$|zzKhXC??K7iNsC4d0p#B0mFX%PC;vnU)edOxi1OdOpa`sSXVyq-LD$- zXkZy3K5{!TjXGMaHmCNJA7B(0Ey>Lpz4--j%-!&LXfSm-DD#8`!CXanb*mgUPDwN& z>pgkMq55W+LgNz_cJE6u!eqvd$EPInwLvNtnn{T#wWo^vvx~6NWnxMk?CI|1I3@Y_x-DcI%91>&sVF~R;T&GYNEHVwT2uKx zn9v1iaf`8YzUXUXGMlxYNe|+rNkCr6wc2Huq+(I_HzEGe#Kz%)tfLK^^&Y*XMBJ=T79;4_#ne44$r!n z@;J;f7Hi6PNXZP?HniC&^!3<{dZG<>43iT4Mq<}&Y|KH!=;~sR?39L#&@&>JhT^uC zwLW#y@NMX&(v-$vGWO_ou~bWpB2i)W=~-=jqVvm3nQEbhTG+hn3W1y7&_n>LB8ST8 zub$>1Lq1^ly^KnE`yJ`{cxq7G(sfMW>fa*E6Wop2T-{#oy)?xcVn-`{D}8DP*(QGU z_a^X1J5?YAGi?-2S~~wPw$5ou6a`qaZQHhO+qP}nwr$(CZF{$E+wQp&6E|WW&Og*c zWme@%g$>&rPXg?@+-8QVQdif*CX@H2sUb3mCfsaWEjG(!?7JC9dn2keB~tH4fse=} zASCovv#BMMu%9S7d;#KJl;^@XxZe;+&AO)}q3}LC^eH$ptu2bo8v3Uj#p(6#~ZFJezD&9zZ?ETc&SJY>@Exl}t>4#jEKh(k)YuP@`$U;xT! zw8;*e?LB^GG@xJjL5`cddyk6TxlYBGKhWQwUX)f|6$nUN1I}+r_Y=~U?mk%9=ekLQ zTkhE#w%=jAsy>mHQ>{^P?tBG#X`o8oKh?*!hajCVu zLD9PHlOSUtB4`YKr1x!9Icd*EgI-aiDlDZaX933QPb zu>?q2rd;e=FJS9&Oze3y@jwUc`D|NC3e&AR6002bIeF4qQJD{Xad22TZf0G~u4*2) zF165O{a**hySB@TE?@?KZ$w{)*$Y=P4-ae;Bf=X|R;bAup?r` zyN6NWmHQ=x!uuZp^qz6eX)&E3WJ%C-*(fe?<{s}Wo{D)kTLi3KVCPU}eNX@>s84~! zwi-@qYvQt3K$y+K3ZQw6wsGeZ>Qq``d*^i#JO3!2iI$mDoWif57;qEK!v3XQ!})@Y$U|3; z!8^^-w5P1B+hKuVZm4H9lhtF(To%tK97eh&EHg*(rib?K=@}J>vy&Y>t!}2rI(9=T zDCS(-;SDh&)UUphdMN6R$6+*xJ_D>s1HcM{F;-JVkT+ZWsC`%LW5-_;ha6gG1hDz3 zH&LtLPh!-EuTap!dJmmg=@@_I>3+=m5Q7SlMJT8VbB zxKaY)q{{r0Pq|f*!AV@X1KSbAA9e@^#j6#m*! z&eQaL=%)WWblXDO3w!|H96s{@;S_sdGn*4}3xSU07{6RQ&gP8{oUA_&*;YxxSWIXf z4J3o{QUadV0a#TnX)aTii~`4%M^104{)xS(eM1T>t$FO0l}8-?6%sy7s*#X9^$rZ}3)m{= zE_ak)(%t(~F;28%Ky&PkSRI{JMX;C`(a{e;ZP4i|QZ~hL4&OO_sLnVehPU+vIaSdR&wv!Z_!SJSv&q}*FWTi$(s z9ps%~R5+4-QRhv+%(`_N;JBd1O@PZLM`;MJXrRN5bNHSRir0LRDYm^)0!O+N!OLlD zjk(kre0h`(Q?<;sd7JPwB8;ZTh;8%TNlG9`T;Oj5haA46@-op2jw6?|I7mf?asf)f z+o93(rkBcu<;bYw2Sxgjy6enxgcn`+?3w=>x78IWap`|-Z2$)bl`tbjAlz{o4-KXw z1}(QCmI_<>JNpu)Dlg0idz>;BTd(J-+?KfZ?4W8$>~hVVyLSf&SUI(PcZn9yHU^pZ zLMjh-crk~iZ!eco$0C{gK7sU-<|3Goc~72iu6oF1mTg*IVr6LfQEhQ@g*MR~zj&)@ zmw_OllmbOOv^r00NBj*}`?0_w**OQOt^gdE-HURRPIiE9o$)z3^3qeLjE=s|9I6U< zZ9L`~BfIXtVwUjMIqpFcO}^Y{FV4BOo*V%|#Flg^hQ#sru3D+xTleaT?o3+nDBcyj zeb;WS zE+F|C0%Z7BQAMoodGLvaaRJO&hSkQbb|?pUoXMhU7DaQV)VLQ`Oa&=c+=~~t+%9yP zpb{wM)1sdw);!YGjDI6p8h4VKJ(NKlSfa}&S3h5L}36w7~ zdUaEt&096p_^$XM&!kwx8J<&79F$H6VISoG!7g;=03b}@3rLSe>cgZw!<$NVAEY?9=Sj6Zu1G`)<6-wxsr32V~Lx70(8Ch9_9mp~9d^(!HiqgF4>u#O}{E z&%i?G0aV&Alf-%$ubceif<)hkKDL7g{%mQOLs!6-xcl5V?8;Zs7el&eTUw?#T zHZ*MjM{C@(j}QbM_6^xH-bP`)!99p%j9#-rvQmaWjAoP&QJmoc59@tn^fW;B;G!QH zrf8DJ1547EL2Gq#mR39GfsY?%GpyF%{LUQE4KX?rE;xku(MhI-8WI}#h}-h}tUF7c z!!M~gHBHQ|iRDi(X9GKrCU^8vDQ@uRVZ`j+QZ!sK5x^(e299J9UaQ%lf2WL6ffGN# zG{nX!;I-d*cZ^^~0NkQ&(2Z?twCSu{W|2b!{E$|IZ07UZv(FXBrZsjTspcpYRL?VU zPOVi6m)7~6&0+X&-q3^eUNik0PdPk!%$U`4@-I-^55$b7->ZE73tvTChCXn}e+Cxx z6fstXRo!|r9698HXA|0hO+MBVEACc!VOtY zTUQr15TDYOpp9XaU+dPl?8D*eRoxUPfyMP5sbtW~BGVbp>@uD$B_PQeqN$yd#A|D# ztk+DP?m*V6n4#1AOUkOuDnM&qlV{yt5g4!FL#*5z=aNuk&q}~^gId9F=jH~MP{b4K z2VN+P4{V!{z*oHdaV=7z;_G~&w@IpmOp;w&5_cfp8hGzY(VKpxe_r5z%*vrRwo{WA zFD*2|p?bTn9>&6~<1O0xY8>SfvhG$LKBTra|I(yn6K6aF5$404Zu~32BvyEdf znbVV5yw&e8$l{Zq5U~C!x-ij;(uTTBj;!ayZsT8y-Jk$Rt1O6KKo$@dH;hmp#zrq}UUMWlb8$kEMo_{g1U;zGWz7j@Vz zzPA2Td;5lbv4DC7mrZB*!GH*Dem945)=8TT-##2i`>brrWzL^%bu+%(En)imrq$muWBxPeLQea6tRzs#c;tLH{o@hJ9}??A(@SOplFBh4&n40A&x%ESF^TI?D0424lC<>m5) z*Ti7%aXfL;(v9*b7N3EogcHT#I!ZPg_pGfj%0ZH28=!GIWQ*ugC=LdKpcEqmIrv1* zO~2lkQ5$OD*RF<@8d;KnNWqh#0Qb3TnKGr1NU&JZoA8#k4t2+W$>9jXdh?SlG=x{U z*(E!kYPskBhx~~9mGBIrjjljQYENnQF_zB9q|$r_x{-KLl0U{mo8x~`(vvW@xw_rG zwnF1-9=!hS9^;tXn#s3`vYX><@cI7SOP-$OAxYk37Oj>5ULo*DpGgI;1u(*Ev@t*@ zrEHY7)ez`Mz^cv}-c%>Xm{kPxBp))^=L}!QlJoOnn?8md(Me^8=eIVYIgjLYx>7O( zfx-^6+*orb@dagagHFlzu=cPu)vz4Yq$o^S!|BHNq-)6CEi~tRqGI=~I6LmZubFN=-)MCvi-b9j8LGFkYW3IdHVi?(Y zjCRd6^ZLPlmen?n`f5$Jis~OJAO=1Hwb9Z%Ji}_6lG*Ly;^eyliDSQlP9XQawH@g-JgJmLHzQN0ZL%*JH9NC$X&n*)0XqhA3;38rRJ)RXIf1{fEB{T0(>qkU zb*^)>mZ{j~;i9R=%GIC_aR29Vqb*wsS5)zIy3$>E$e3e#8YR{J1M;=F<|A>;ySep? zR7KKj7OAszOE=!_I1D@dZ*-Ph4-~mnU}0QcR}BEjw1-9y4ze?z*MDF+$qIdh%FwO_ zo9_7-rIWy64EDLL!aF?AY~|dSL_2#rA}i<-Nw2?Q4PkKk9ihi{AHiNfrFT|uILNjz#o`^kdT}c0SOvrHI^hmM zXw$>Sh~+C|D>^{+q4w05>+K~4P7QyLZxE!~?jwsQVuC|{mM%%HWe|r|mTM~+G=JEC zr-btCH&`x>Too7FZ(U1JDfu?!j%h&6zXARFsUyP7@t_d`tI|m9AaumNa(#hvkucYz zPyU+KWu=ZeV&|fcu>J%M9dRBK=Hk<0Fn5vMpK_QF&V3gS=2o3vD%T+tVGT19hJj> zXGQ8~MH|=xpfXxn=7nmoPvta=qa(bZgu;K90t9O$_FMb>v`yC4qUxt&9Mf01=xwG46xsd=SMux%@V& z+8(tN-5|iS;lKlL+v9@YWUv{IF~ZuLIeiHe;&Kf`%~e3pPNEx~Xk9R6N25)~Xl`S>6E1bis~s zg$FX1YJew^UX_g1f8=fvl${kM@Sl*Z>y#lQIZ(PN$oM*pSFUTHj?yl%HDk7^MY94M zvml|0^kM;chu*UuzO=nvodb;{RPZ(uw>85uOSsE-IQvbA$0DAnKb6!zSVK#A|9DUY zttJ^*-ZTvC^jvZ14%=MByAQn1V&)&@z^JtwVe6O~hmQtZt(qx>buvvhC#v6>I#>eM zdz>_xD1gi*yaB!$2 zlYFWlgC@9Eohp)*2|k>}Xs)i7pCzXeSRE3&TkFT63dzqE%fCO!QF%t$Aa5Meb@X-( zIhja2xmTKlhPV-loN+`o@%A!yXxPF%r87*Uv+^4y zdMNA)OInW(x)bmWNpi@IutXIod%rfgooQII?6Q`y*8i2lYs}Byv#S3LJeR4_QH?;p zmznzypG0(Tv0>K`ROsPl2O2lA2#9(|7-O+B`t?G}#Lx=r*orvpL;{i}5;WXZLflqApH>+eIfeDyfx67aPNS>;(ES?i;WV;sDcPute5fe0w*I z2@B_aPoqM{cg~NiyklVz>N|{zKhneTkWE)?w{$-;%jaqu__;*5d)_FS9a=kRcDG@V zADXKJ)eOI=pu=Jl&3Ry4WmcR+5+8D&NIhE-yTV69rslk%JXxmC*5%xiKe>w+>HRdu zlIOaTk{6T%UX?Q$15iv00Qx^Peigi|EjR1Rk<>^bzOGq7omYN#b|uL?U86#`qVt>7 z#M`8~cfReOm*hTxmp{AkvHxj#!mV~v8$Fn!Zapk%s@qWe8*+><`m8K=PjbZ?yZ5D) zXZpfzEp_>XhFu7yb4P6xb}>k`x!$s(qZ(-C9pb#Rsnb#a?PRGP!uCQKaBO5n;iSUG z5~!om<%8y#X7sjPvQP|$~J z2@ga1lAj=>U?*0J?-vgB`OHdJv^w9_UFybY#Ga_R=oTM^buW<0q_fquTTcG*hOX9X zPol*A3FsX%AkuSS7{JMiR) zSLK>3AAAv94^FaWvAw6Fm(!XIZ&NX8GL>9*M{eKz$pOW)2A4QetU~=<66A9lj zhv~Vpe4J)nI^{gY;z!;iIli?NyT#NvW9?LA@1y;NVyDev!Vp-ATexAd!vK+?A6cR~ zc12Rz>i~WI+7XM7?e2iZ$^_YPqV^FTNKgpLZAZvKaYeb`UGQ{8@FsqpDU7RwA=B+hAvZi1F1Y?P zk;73M=o6EsrOBO}+oOQ|1u^Dqc!)m!8hMF`d80{eYHw{ysSi+6^4fxH_FkELgytu} zXe19cO&EsK=YndUiilkVGlWhTsq*V5b=tc#v%tlL?a07`xHIr20q!kA+Mn~orzTKU zX{?3!kw_YYF1r6EXW*gokH%K%oS&p3p;OrnD%^sqfy}R)dvoS$4ZWVpaVHl%z#wpf zOuvlfMJPZ_;~$jvE{l~amP0M+4#VeZ0m3)|M}oZB``Ud%C8TaDM5(XR6(u( zhS;s>9ginAD4NE(1CdoKjiSkEln9IT$Y~&aZT1fCuTFX19j~NIqh%9B`1U=MLv&JyUff4S z9o$}k85CJdu^6K7$=ne%$Gh1$B2tW}yn8PZ&x6RoPd}<#4-Ora5dJuc(+LGA-+SZx}Vz z=DAw0Wux4#Ref7^LGcx6@#P#V$uyFe8iEUE0!7&BC3W});6+j=9ydxfT*U5 zFoRhP)))Pbl+*2POc4%re8WLk#MX-B&BRIa|H1~(xDc(g7}WvHa&x12GxSAv4IIvo z>+QFu7%8O7M>Z`D#9VDNj67Csh;D%hj`{SROuzu>i-hpiTz~(y^tgMXydiNXf~QVs zaN{@h7>*YirGx{i9#6O5};Xq&9JwJT%cH~XUF>X`Gt{slB;FQs2BgRuSH1vnE{yeh5iaj%w>rCbKs zcpWYDVTIym4EiCmMz&1XH*#y1a#7x3ssrf?^pdIfVh@vw#$eJhm`(~|^Oh8kf(vsE zT{pjAZGq>%r7Vl@djC*2`r&^mZGbuM+igyS8I2KPLwHOA193yX8(&MFVe0jR&nA89 zVA4=`1Eqf^&7W(B1RHsm+k2}0Ir15;=r3{rc}l1}>&dEIA%w|g zbEPTP#i$J$1^@-1k>l@Lzv{!U%uSMlYy$D3M*?wkjKbMSgH@4GwZ$eQ?%SA%|Go2~ zUp|Wrj1O_CVaNvugljmx{iD9t_z&kvpv!?|A&m#*W}Rt{EzOnt0yA~iuete6rv%sV zXUJE%5pvfx(Wa-zszsUv`2H0J`8jA82}=WZB1wo1*&#m7G3>Ig>ZV%-P&6vvvj!78 z4)UABR(?((_!o^g1cIGlqjj!rpCR0@d3+U$J&~_OTppneEuYXVq{Kd9yX$-_ZBQFS zOfnQrD$~BlnCavz^|qDZLk>>g=VRG9!vx8DQgI6eR3&n&oQ8yj)}nPH6fGgCaKJ3i zZVEuZ(#3Q%v$Edp7u%B%MQ1`wIQS`G+@TgvBpueQY{dB%G3%MA9~%KZZn-36>)L6* z`ESI(jB^7-Ae@r-GOfp*TbPrl zeN`#BjEmD-?5l|_ic!0-W@6syUtnNQzF)d|<;yNzz+PLmFjuGiW|5gqm)XFId@?{| zX_H}L@~Rxyb>v*gj*JNvU=EesLLBKxNLV~P>uBT3%qF~#x%NnQ@k9<)Va^b|+m8^O zuW<+}8HtN~{WE58=k@omveS7&$k_S;%U;mVjUr_X^`NcR9QHP9- z=g^*hyV$z@m#v!Dop~b?k{#7Nn-GY%&Zy>VggzZ|N@*GZehm-GNF6tYJ5!B_#^A;# zD$67=?X82$+ARN({h|@X^$fy6SKHa`wM{|Uts4#J>?i2Marx=`pj)8ucN*>kV|$mI zoX!wD|3k{aXbrO4J!TdrwKl+J``c}9>&l0`tQf{q$TkPwd0O{bbr9rR28Q>!wmLjl z|9c~PQ|D)HFV_b@r{Ih#8GWEhlJ{l;(A2UbcU(7y~AdBzwh!R2x zW3(vqT>e~SIbPfK8H+a6E~Fb0!&-GF(y4iYO!CljojJB-&&;F`InW5qz15wt*2`o%euQdTw4aM!BKtJ&{bvlQ(?pC~13Oas^%;NbxI?RlWsC9d7TJHx%iDSzD3@9s$C z%}iG()H%$eyN{Co39joAR7E0F|2i=fiv>z?tlc0SVdqUL)O%r54HI&fZOQ(?SolPm|~lGD&62N-f5 zPnjaLBsCK%BMFX5>Uy{+K}N;ao^C0xz{m+FiCJ=)BL1wK%i2iQM!38 z2o+({tfsq1c$(*<+TmURHGQIq2$B@&cZv1cUA)pjS2t`1>>MapUcESJ$vHm6u$cD| zNJ@|^3^{AEq{e~+RpIC&RyAQm-FAS@c~yzXuOp5;6RC|ujSE|GV44+ugz&LLI;ly) zy{|OsCtu=_iSAp%9eUme%nS?}9G(2Bi)ANc{y3dN~%Z$n|uu=-{9&5J%H?|JRq&W2D-y@S?5H0!5>y5I;ZIKR{W-mwRVJAnA(*~{eOo{V@u(_8X}AAZTc(v25? z!+ThZwlug_{ol?4R(Dw8Ml8TwKRLrX($CHUS_klObR=;Qo!)HtU?;iQIhlWXbTVPP zq+@EqLdqX$$!3Ucf}@0U+AJe?qHuiyXU z`E_ThLfvKS{HdmD8yVLaYdb2iOZ6Z>pqc(|Uj=L#A|$HH&M%g{v9bWAnF&#JSlnUys{yLS z+RZV8Fay+>jO+wRMJhV*?yo(U+zdsM8|4q~vHUB`M(JLFEEu>aUS4&unE@5RJE4p- zJm}xKm9X0^j!ni_k&%5Y_l+g6bi|Y6XDVqtq`!L-@8#bd6HO>StxK>YLjveiX%1J; z(0GjDL5P8~-;g;U?J%Dra^k5`eO@6pqi{|GTfftqRbBN4&4gJ^`;bp5by+?mw@*7y zyp>MScM8$w#obA#5Zlnk>QCYsMY{&dV`qPeSP2Y&IDg7{&nfsZ7^=*s^FyWH#F2f%w_fLB9&$8gGolo= z{OtBs<2}V9crhwvzTAfeFkG@Mo=88+g@3BU#M=9K*@Ax)PktIDV^6UYCK7WlwLv{H4XNij-Pp|QPXXo^|s59y_J;m z25e(L^Q)JTAwzw{8w6!Y7$uv+ibqWU-aq9&bi^c_Zr_Pya5jJWsDZ56nwP41VV;2E zG|)*N&->xlzufquLe7{4zzAj*#soU2HY-1%RWASC#ozVbNNQD91Jxoc42L8ss*++5 z5#($lvM$X4FF9$R0f6R4K15IXoDDVpX2IRpR+&y(-!LD__ER{fd(2Y5`2uS^iWb%)sa(@24vZbe8? zHew}J!!{5WVqMtS)PH34afJ8}r)803w9d>d2@?4gEHKN2gdm)tD@~D{wtaB)F|OQ~ zS)b=1bZGnPLCTcsUqz;V!+E?1scxW5_y0vP>jueYclF5N7kUT+V^suJs8tR*sa^K3cXwz80^4bqOXq9+j_I=n3lHudhx$>nhtNAJ$44KPM0(?vq^Xunz``X6Zi{zgvOMLhG-#C$Z% z&WBo74lF*q-8R$=t6zU$abgE3!!EdVhzvW`&)c=&a_eox*aETOP4fjL%%0p=)O8VJ znM}p?)v1M)nc4EEt%-Y75S5n2vL(TCUt_~oqJ{sBkw?`lj3L$?QtC+ z)Cs=IVk-h3pX`KTgm)t^Y-0j7?|)1%pM5*xw%XW9kCLKJc&llry1qg{Nw*_t)!fpAU@sd=16_O{$qdIJG2Uej;E; zT>ZKtGms(F`s{BL{CTax&9{!x2z4|xuyGy3j)dy^qAzHs#x_-g4}@@&^^ioBI5GJ3 zL<~O}67E8(*Ppdq{y3R(JQ?lglGa0v&3m|yL;I>p=4lzd2|zUwEuys z+U)q(`|lD9@W>~y`7X>?0dBUJx{?c>>bn0{hUO{|KEFM{d2^F4i+ekA18OnY+ARaz{c~P2t}?38w^sDjd^;uohNm+H7wjRd z;2cQ@?m;G6d>jp~>cp#A!0itQK~Cgngqp%CfJjdPN5@}jHZa2Eqbn{5!!qUPmwm^i z^-B4Xekg!}zQk{Vt*g8Bs=-|S-!_mugJ_jQWzY&S2e`x!9yDbXt!pA?9NN1qZVXkw zGqX^NEkeUo6uy`z99;yS!lNNcrwhG1W_PL`>wnc_@)XCJt+~_dbEJl~JOuqRV7LyH z1Mj1uW~)EAH@SL3=LUPoyKsyr`_YjNM=2-<%ow>i`LvEV-Tgabgm-M^0k=z z2)FMz-|^5sD1O%mG!fg^!xd3r%pJ&x=!F7C@$uu02`clF=shZ?dR;zM6-vR+le?CL zxCQzTqT&qjpN&790*S6d7W9ulj+k0*$+sXF(qcURWyY;dsK|wv>wc`$LXc^F4oqD_ zyUoiH>tF&ia&q4n4+(whZCp0gLNoT9i4w z^8SKo4gP4P4nBXoJ36cGSmq<)&QLjjFgt8&3UyU_xJv8qvCDZUJ<(-IXG^YCawlz) z++I3sjooa8$&dNYpd>KadKpt%O0eh-Ubs=zbT5p#FbKn%3xs(n+Yquv|3dc6vSF$M znyYxLZ<74MqHga0u6);_sqSlm_@?8d&BE?_FEH;_iMT1NpoT6b{d`ge*ZL0X5iR?o zzGzK*U-jwr4%47m>ssh}R-O;gC~CE5%tZT07O4Kz8e{F~P=PPD#=RiN0XO>6e0Av= z7Bg(7)$tQI>?ZaG?b6HrJKkuTGZxaeK&Wl(O;1u!0vb0q*wAZOP@L@Ew# z-#L=evtU+JafviuSq^wlA5|zL!yua7W?T#*mviu^s)!t~>vKs{u6$U;BZC|)jpfMeZxSw^j4OxGS^0}|Sc#roO&*XI0F@n>Lv=St2JE-&bQ#Jo z==;&qaaNqAZ%0I%R;6$Z@SbK6Pad-+_~!b}q|GXy<@T)KRNf5Y=Fqc!&@@^$yi`^S z59j=1G`)Y2={-gh5|~N)?W^Vh zBJrhvV-s1JBjaM>66|w1tT+2pl<}$`PB0?6iDMoUOk$1^lgVhn+g=)LLl8}w2H@oY zQ$Vc0hWjJDO$=OPoovwJx15#DMPB+O?X!&o*Xnrqu$PGN^WW9>R?Nkhf6wh=FL$U} zkwpNOlTh>#cs{p8ab+-Euj?gMe4p7fo#OL$v6qs>E|IFD?rH7!u5D;Q!4UG<5%Q?4 z4%9#n5DLo-{S0f#Z$})NK11iKn?tk=NPRovjVEdQvO-HAiJh1}T?=Dok8R#%bk`Ui zYDE=4paNNK<|qS!Id|5|44^aJ>_EQ4_(__zd|rWowbRGHg7$)~-u9iy$tPwXe3D1~ zixqI;d2p*7)i;?LZ_FV@3$wKH;vL!AM-EOFvc*n>T{vW@HRf0FYGELaVAtNE70lFpI?e$7v`!rt z?cP>GP-8Vppy*rJ?8kKvjD#@i9fwvp%C!Mx<$!IL@(l-R#+xU+=Hg^nnLO$o=Ahx? z{;oNU*0Ok_OAlK{6d5yPZ%Gk4dw?zsP9KIraEauYDVbT-_R#B>%8S1@fr=NEbjgvS zRm8;)V9Fe|IL^?>&ib8ins4-&Vu}?4qV5)8mq$W#Arhm*X7W3E&CUQn#6tN#96<-c&`26|-L|?}wuXGS!1d zw26B#FU0Qb6!mr?u!vh)@tZT(xCCLi1B5>dMhE|brKbE+8g z8_3dRU$TOfaeR#*2YgEJhYou}byTJfM6z$qzG{us}`(Ah!^xgR)f)$|WsUP2Qwr&^+Pa|;# zBM{+M8gM({ip8pbsr>qiT0$5K9lMjRX0e`RS_)+lT`3A)D;l3FgW*EU`v6g3Hw0Xb zT0f>FytEs+BQ4~O0(F)KxF6;AH~RePbAEsQNL9FOOXmUCE0ku?0cQ;xC{};$>+S?0 z!7N3bZ*r<%u9;)E3v{R9;vWcV*h^|e*GJBowWL9+e^8z!SR;bYMJo9Mcrzv!qXh>WD{kpp0g1`yL%onDnb!37ySN!rqV1 z{Q3)MCH>9K>1F7LZsS=C<&?ZQ=}ufw>!P=7Zn(Bav=#Il)gZ2B>0^x(IbwuQb)*dX zH;#mO)o>OMJC}t?ac3y-UCM`8oEY@xt}_1`hg<6?cYiCNj~0Ia%g<#iQ9b-}$hZE@ z+Qs~05fKMi0buMPNKOGQU1bvOL>BSqwCq#i3tZcshYN^YMcJ+h9;*0H^3ifgZu!ul zWJIkx|~LoJ)-dDqh1h`$Npjb@q$`fR>y#d*=rLMhvZ3x8-~&?Z;dam ztkSs?uoL0g>t(XLGhpPfUvEIQmpFC@Ix>6aNj+whYFb6anlhXdn#{#tZ;ms-zacXC zH0D67`9P+QX&!nDGQ_7EK`n}XP6O(-)lTOpmCjVQEul9$hWNNf`7c&uaLaG&j-0uS zQ>V>38O)Fwa3Vx_pa*$`QROzKU8KA)!Mx7;2IGz(j{57BB6&B`bft2743LyrV zE-@C!Pq!4VL<+P^*)ku!=_;+%O}ddgA7OWmeFw{iD7h_g@ZODu;_CV#R={HEX4kmh zgkrc$Hi=PPFG#EOu`^p4j&;=;6wqyA@5h$1zkA)JaFZlfYQwIDi2a5 z!4~UfPBi$+!f8%i*pB=B{M+>?7MNhudf8wRp<4Zx%sQV-QTYi6z^mVd9oc!EO9*8I z^3%d+>^k0{H$XJ-S8vD)OWRDUj4IS`XLJtCu0DNMn0WAE{jp@6CV?=&=Xc}hQ9fb) zFw8@>gC|VfDc{{i8IY3jvY7d8FS^AUyL&zFBR5|QQ0^?|iHq7%lhP~bmdA-YpzK9- zYGHtgRu4N*6eH2!f_nIt`b zO{VnaE?_wks7Hz9^aKbTT5*HDzNGx?%Db&$9|NrwkMB5!>eczaSMW)RO0uu+dRZIu zkm^T4O2L@=d})5-sn2PQfCZ0cE*Y<3GVnG}QOM4rZozh&GQ1q{cJjz$iZiq+mN^ws zpz28_+vjL-qgMZ@diqHd*l)5jfN64i&pL3+C;$v2P|nYn_p<)1U_f}^3rR?NIAr8Wwp6A(>H!gR`FOx=FT%i zsl|`BNo}I^uJ+j0fRoRK>rVEtgP%YkWJ>B$up=Un>t2qa(A6N5V2jAB3^xuSGf>7} zf2zV=(eLz-glpVa8=Ggnxk@;TgWwUbWH=}y?AvIX zW!3s@eJW$&V_k|0D&BxW10u~+PI%Uwhj`$81~OK8Rc;)?v9E9RBXMYHVdjX`r%RPl z&3Wc8XQ$i-4lV8C>sw8N?)pEUZUf#kr`>;x)z8nPuJu5Y!TOw8s+_A__rim0Vmdmu zqzd5)@m0oel~9A$wP?#Y^V9hmXC_oQynJ)?V72pkMjmA6+?R3^AOjvKuY8_HH(-T6 ztEozqs+1Fg(zbJ%#V|$RzaurM9{J1N$FPt0OiU86&c6Wl>Mkj}U42)=R&PF^@Nk}o zHDDKak3VYUITrpQ=EaI?t;>1D*T5D>_txh{FFg%ltjw$*G!rEvQVQ#qjfl=HC8F6n=G9yc3@5H8f?oQg@)oi~5B1IG~i)jo;KTtMLq&OX1 zqkmG{74ol|vRusBD6EG${r34eV=;24Dss2j`f1h?IF#=1z-hxH#$LeB@N&GIHRpI1 zXd+n^nw73Hwb>G+6xOC5FlvI)p0kc>z`HsG{^PLhpfyK?WgBH{>p!#9w6Sql__|?t z?Y8R(ofMP!lES@4S6S!ut$5z`dc^Tv@Z>H(`CKM7hb~ndJA+QmcY>?hreIAEx}5_r znhB=RBbK7FW>}BHLkew}tm3;3Z=iyS|B)G0J>$v9_~-6oLemXcI4i{0DE^_XHGhXj zb-T&&wVmP`y78$CrrGV4*DI(NjwBPSY^c?sPh=p=0sl{(M54R~IeLzs3?+fgStHSe zDr=tMu%zV3IP(MZK@~7jgWG`%Ptf*0}vbe)JIo`u%6qW(Q(b5g9iWAXzH3o*uZMuU>r&3b{ z7Nhhbq;Qz*KbmqMfFQo(ZRGizqMm5K*RrF7<=*$H0^{R(uTj+^8*NuHD?tPgdjyYB zr>{lDV%q$8#0w}UC%5}gn1~nBSaAuZc_%@J>AfUPp57j*6kwEv@*ZM%SzH(jJCamE z-!3pU-0y077v;v~>xtVvq)kRihKkXAR%1uC?kV{X{VZdpe=$PA(Oa=SQg`D-7E^-}7u{a0T9?D6S`yLh~WCK*{I^!Hj>%MhwCXY8y3l zUFQ#_j`T%mvUfIsQVTLLt>Neh=C+_TQpBp2K7y+O*HerLVOI>d}?5dJ3LR*oaMD*r$gOy&wc7Y4;b{mmcYJ&G{<&-}X zm60e=>z@AHLG-6K+no!rdk!OuQs-BOma11-H~oLnTfhI270e2YGApf&R`c=8%Iegn z3K!S*a@u?U*FhW6^vXbv*V{w-B6M5b5%7GVBjisJ{G+zj1hHvq?LGU^cK3JERT3wZ zOQ=YZ=DFG>Rb)~Sd=p#B?!e>Mu?c)3;x_Jv0iWlkZLqvg!0g~cunc0c`Zj_-I?j*V z#3b`}DDd_{7#-%*G%h0wI@{G_g-ezU3HTDtI(LvrpdGh<-*6B}HduN`=($wOR# zrlc)2$i)*KYX22(&rga+^G4P55z=}{)*tCRL66pU07*^)OEMXcNR2IXnH(A-$38I_ zXXMB;*=ygzvCwT$;WMuJ`lB0jHwyeOLMEF47D{!JKo~mPxgJ92AH=R^fJeWnHuy-) zP2@d+T6AE%qFe=&8I1-gz<|0=ZdwBOP8C=f9rTwDtVf*s(r1hM=D&Gz;4X*C3gy8= zG?u6iZ;TQQnUMd();Yxr12Eh5*tTukwr%S>wr$(CZQHhO+eYtgdYdNw-{*OfJz2B1 zsx^pf_vb!mZuPWihf%2;%`%GfYC)ub(g6J%_GIGtGgjSI~!+r39R#CVQkKaB^zKBvbjsqKkDiHj%0bH z7I9A6klHw23}@Yd!?-b+?OD`@qR?|WTx*s13M2uU==oH0j(>r86%f!PZbl(z%vn-$ zR0h?Y@Eza1s_ybLU6+9O*#Ss=Z~!3-&Iy=n_*!8`xO%?sCE|HHcJk%_d6o|uGqXgi zfN9gBJub$;JgkJ7>K2VDo~tvho~eBIuUS*WA&jY8L!~2NS8f9LFsE8aQ6u!zy0~yt zOGL$hloY4VoAS`eR1geK6*bYm*+V`XQuMc)QWu5(O_a7BQquZ8v*%T4;~+sKjhsWb z4~-i{kn+9LS3pVgG@uS?@?sXv0|{n$Rk%XWP+v#X_4Q6<>T4vZx2m+n?H~3>Zn6;m z5P`TvQ&z9*5+!qA6NV0_<6lEX3E%IVZrONdN#@20m(?H?L|J$w0B6Fhpb`OVW0;o6 zolo8EXuXY3b5k#Ahdk@B&vW1Z7xU@J?(>&hvo`h3Nu9VQKDWR=#(UcjG}J>ws*+22 zO59B0#8z@qW+^&*#q6DgXH1;fIM0$z0ld9x7Z;!Y@@e^HEK=n?Od|hPRAB)VZ*u8d zffhU|7x-eaq%Kq<+{Z$jynG!U0p}R)oc_dIyq?}W$_^ZK2PXeS8UHwAsh_QjotPh>$Y5gdQV=r{aAtfQ`a-2zJxdNvZRJ)f*nWX3JSFFC3I%Jtv^2xjv zz=jT2?$)&gXj6DTXo(-y5I17U>$Un05(a)2J5n@cOMYItzoxa`|mp zr6_W%vE_x%g2c&$L5bKl?OXlar7U<}*LpeLCtU45PkYrQS()yy7Jii{Ibow8q&ZkR z{wead3O-Z0`>0;&s03VtDgs1(p)*2-=3E5%I6$dA6ryA)_f}x(V91Lvd{bEpNhpV1 zphd4DK}TW(SC@dgzl@;(e~${)z-TVAMdA#l`n+BX3RKHsV3*T)jpdNj`a9381_`Xt zA$#Gr{-HM#B@2{0%!c@@TB8+bOUs2TZZI?cF#u}m@xs=~hSts>N92T0A(jDrDQKo>F82|7xzA+6zCrS~#~8_i zlGP=tt=>07kV=k>l(j3djX_<#b2+qR(#}||&RxwxeMdV2$QG;fvZRIVY6OnCZjxt{ z)IeO{)dV^9Dr$uw#-$`^G+qd&?AUaDuCC7Ya~ZciQ3v;}9L$(aDo1jR8I+BtA+5LE zPuNP^-c@}AEahvhz-6cE{kg+j=xgW1jvVRW3?BLDmA8Lm%44c?G(5|_Mdth*Ugs#k93_fkA z9-H|EjJTN;r{2->ibY!mzC{U3aGi+{5$~+;lM7NY6yVMVs0bMG!HNwXP$4`1l)OqM zI@SREgQ853~s5gtlacO4B?R)u;Ol3UHZg>dX^G*^<|8Jow z&bxUuuks^RF_(b{IY0$cGL{mvU5FrfD>GMW4Z+mXydvy>_*@djbGJpai;GYzH{kR4 z`w(rEw7)iRKPlR*Q9khbYBHJ2{s9p}LBS^WdD-K2>L_XXuPo*33se2QfKo5+0U;@) zpy{WvnhFlFH=m&k5Hf=DFUAugc(-KedqbzOxj^Y8baLFPQ%_G(xjwCRY%hCW+(;CC zc;i+KqJ(7lp;XXG4G;~@qBZO)&b13jhTk&to-Eil0h`k3!MFXc0iTai zR6P`eo8ys5=qsNU|CE!FM-983a75kDvo~cG1~B6=>Baz+5aJ(A!y4t2eqjiXMLs8( z2KGuEBVP}iSZ4cUeaUBxHad2sExyJ&SK_O02yN3R+ig)++`ad;4R(WM(tQ)hWW(1y z=f8i9h90G_c+a8AWGfD^e%!VGvtSW=)#IoOI10iOwhokrBx()S3L`!WpCYUWHT&p;2Z}Vc0M2kvJAc7#7*Gx|Vq|13?)q zBT*6Aao+1HFk}{FQo%|^&^{<6^^)~=e!V&(g2?~;i887Q^G$>xgF3AvL4c!X(|*s^ zHcJS3%hKa)XFycV*Y>1r*qF~TsCp-3e(gBKSU;YH7)s&KC^CF+(S)v`um~&8K0Zya z%hVPfj#J>>m%e(0I|z2b+-F$%)Fz%n7B_?q()*nRIs$?bM0s)*RGAM$DU5u`Z|Zfq zh_iK|MDO*HosQM_R^@ri2FVrSV3iqdO^mQ`cnm?-q^7`F5Rx67?uG`N<$4}5*pt-O zSmASsiEzeMj72IPk|?}=Q!`6UuRIi~ApP-K))&3XPr)Q>vPuFAGGuIsao2z4mLJF* z4xy3-aYaF0eBlbUPFXGuj-_r(gGD#B|3HUd1fF=v7+;YVGcX6=AxNia4r5^2FCn`3 z_n6X!Ih?Jd4Y>&0$?F7&&<*kO#LyB9Ux6N1@@oHq!FXtE9(~KL2O_7`0AKq`TK=3X z)-x{@cIOy#5>Hto+L%LvuM6kI!?yaGv$9h%YyWj$8Df<|S40(DGMS9VCnqLG z!|@9VWTCnpaV19{=JQPsmjPqSVS&5QPVMXOzNtUleXBlC;q>`@GVKU#ILjL-=^DK>$g#r%3H{`Fy*1Wbyf~x1Wn;NUFDi_Mcsqu(#GH#_r09e4EdN}0#2M@fNRWNGFMp7N%w zw})yKOCqkZZQGV&=&_@~`r}WWdEl*6F*F}lIr?s=fW50JCFWAt#$k5itipJ&MD|Nr zJo0{GBXS&u%OKgi`KN-9;^tr4S0jih;(EEqX>=(h+kEv&g&w@B%)()#7Y<>1DW(8h zK3NmzV2$<4ajA{bo+1mjW!s?3)VP*Z{bRM9q+Lnq1i8$ej8!td6~~svJ_3BZq`7Ww zhp-&+>}G73_u*4!d$?q#s)v78WS%pz_{*&jf~w1|PIryM$)7r|)36g;L9H*6{gzvg zKSBO?e;ooOQ?z#K)5FLzt>7!>iIv3wQ6mg&^yqPnSg{btqWd>R=$TS#$P?t*ttp_f z@bybM;M>o^slmM_!+!ic1yiyK&{!yuak*{_bp zOXIL|W58G3lvI2M9W4gpW$I@D4UnyF8S-28-=-F_Ej!SP4j61xYmGwGc>TAipbfTMX8(9BsAmG4yHeP1>fc>67b^63<}lu5 zL?=Q{KM+|QA-KKd>_NpAj+XeSffxU|v#Qjy{tiyy6xE*Ix8Z_A<}aj=#y%zF9sj$E zH~RVarEWk{9FHKnyVt@2z}#oaf1W8Bmt8~cbwJppknD*9L$}>9vtm#nmjq~^u_$J2 z%njCcG?(>bCh@Id;>3Y=pb(=IW6ZZ zwID(4WI3XZa-I&^Ek=RdnD9+8au|SoJrlg7<9OWfJS>E@d)?gY_F8{IaK&B}yXO9? zTxDaizR;6k9l*->aGdDOO_q+WZQCq2;Ys8W11FX7<(fZTj;K4G14+1eGkZSeNys9< z(O+15hO2BTh)W2+ay={)yYD~v?dtdL{RgS)yuJxq*&A!qNU4<& zuV;^()iIp-ZXclNRLUW!GDv&j z=PDK;p?H%}ZoB&M%EZPNvFeHgn`=uT5SHfHg*>i%ip@dOse#)mOWPpkOd3h>R9kE$27=oT=pHcKmYn~9WY}WwDg=#0T zNjo0NSv9BXGi}~RL)^MEVZ39m(CXnBL7sN8{@QTQe{1)u&Sow?GlyHgFWFFg&61{@ z(sqQ_xzu*Q;mAAn8GtRjk~NrtJkN<-x%DyPX&K;Q;*l)M*e1hF@5gQ zR%nlWtiZ*r=&$cezg%jmscL5!4M8s1t8Dx5hWp+mU@1MBt5cqQ_#aK>Ad`hmt}Z~> z?9yfm+xgKm|CqQfWi!@tNOA3an`9h~b5|zRlz3zY)#EK7hRE!ie3sHai$*c`GO_83 zN#4wP}=d+atR{}xbzEVqq*;#k&TUxr9_TMS|O zw}+KH0zc+p<&!m>+~lSes>DkX9OqD_m%HDqWE#W_U9!zINIqm16lXB08Y-kb{p#!% zi4k*|3oDHg&GtVgUmJl`2K|QE!Nn zwGXj!Hlda`2=qc+%3D~_`IFr_zt~hjYMzbzONqwg_juQi1% zrw}4(B+7=AF4%}=63p^~0G2iUdm+cx(0#SKO%OI~&nPmF8`a<>2fnUQ$@t9S<6ruL zL;TQ>-2HPz=gZWmYJ8;;^3~pkIC%oa?_L;)B*!(Ykk;^NTI*CajxyQhW$NZ_sEyIl z%%_5$5`&D-jGL7+@4zUXSNh#al2}RS1KI4bG?v+I4V@hcG4gYjd`}S9AycY?D@5+( z*#05`o-Ec`JG}i*8W~t#3WyI@E7Spy(3o~A3JvyC%FuTt&G*GgrWOSnu{|lo>JnKZ zY!M26O%%h|~KMTtAS-st7rsX|Hv7x>#gz zZibJdlU8_@C6!N4_GjISq&tqY7SF6G2l^-SFu0qIQBUs{=qvt3A-g#0|mY&gNw&)io>n(47m+pAMx?A0K6J z#Mu38*k4|5ZsQ#~5AS+uy{k=UMzg2~f6>?aCN2D9j46^BKI`&Q!p?A-R zRCSv2b@>9nrcyQG7Fj(LOTUme$C=XNA*ByrwK-7&bc3>DA2b<~5n_|AyX!A|paNi= zX>{G5|B_Wi`;m?dZ^<}#n)RHL>ed5AV0KTF8cao(R8HhpCw!M*5{%eHClZ|>#!bav zfMgYC+}E=G=`On_lcqk*ahg!()Stu5jO~;1i;#OBJa8`FY!a)|pTsRZdT7(C@od7WH>1fc-s>H*32Rp9T8CVVUBI|K-E$jGpYpxjyoh@B z%39YSOxBWz!-jcQVg=*>*?FH0AAiI;Fw^sAC>V%3U|ya_k8h!Y%nIK|Yv#oEbvwNdIyAU^JQ?oVmfe%-wPCd@i) z%-hv?P7iQDwI*&dqz~_YxY{i1Inqs|jnjt6IkC_L3VkqJ$c3@q24Eu7Ad7-Fr-q`j z3vel!PTV-?w9QxcoA151$m{d5-eklO-T2uEM+lt5N5(IpribSXVZT*&S%TJ(b?$y( z$aCQ3DEUoI3*Ln8`@ZtyR=dh@A6t<>JU4+p18s{xxu*@xK=rN%qRIKY+9kvmPv`cz z-*CoX&JCP(+^U1NdfH93l8QUM#jkPF<^Bbn-&;2^^YT8St`gvJgN<-)gF9b}Wb0XC z!&eE{-(B(#3-xfsCUvoLdT!e+{&f!HsZ~7;WQS5Y{VOX*^DZ;tWh zO+z`vF9N8Sh2vF~m5t(F8C+aGl2$ci=sXDUJ6N|=LoXLUACt!vR(sm6_A_8taALOcG* zSJHoobMhBW_d*q6^wO_cIG)Of?!35vOh?0~cln-?b^!2QL_65#`GxNLWWgQavrpzb zK{hA)n*N9QqfqH7t#h0>Row6iF5CE0f}VfIU>G`^Q_@XyinN)00+H;N^+$oFgqbL0DCT+tD; zw#`ui{{39S1(kcX7WrNscCPKLa-}**82dD#Uow$kwcshpWCnsgN;Q=GRb~$dI+yNO zz6Nu&@ufJj`qEVkCW$#J_=s07mjo<$b=2mmEMzwiTuBRh61MwU7PwhUjXz|dHWlOd z=-P8WAsz!Fh^T*gZFd7tIS3n23?J=%FX(cF&Sxa+bA#XO2Z6lbIKrI22;2IlTE+t$ zg6O+2am#bHT+_Yiy1m53wTZ0X7!YL8%q8KPuY(uJ@(fNMr)C*`q-u>4ijEckYVccc zl%ha6n<$p$#havCU%87rtDQr*O3dfv`Rd0Vm3=ALwiPP};VB0F)9&N(6HPA$i&Ixw zE_Y+dsh`{AsR(_1zhlpqxyaGL7i>H>olr%skebhnJi)YhG_jpw3;!spXI}?)j+_?Tf1=e&Isb5pE6Sk>jNU%+D?BFIUxB!BXlw`vOdR z12%<arz!tr!vb zBSeli)xg;;{V7djV*t)|&NG8M^HCWF$QG%W6-;BZ^VHgc&?51bO>|*e`8+tt2+}sF z0)0S8Hq-?FnGR=gZt@&xwQ~GhVy*!XOf}(| zbqiPG!gQm^4Y(<1b(&yfo(isG*(_aiKDKQ<0G1uS40~S1zDa?5fK&1%llZ>BL(R;* z-oD7-amBv48Luq?fg+Au&qnqsa zs3Q@Vr6%C1Dz_V5Uyxe{B|~~l~NYAcm*dEIwG~ zxwF%uZG});s)kN=1vn97T{*Ay9X`w_Fesx8O+;;TT17`x-b z9R!Fk(HT!{BdQ?9WHlK*$HwU%<9}Rm+e=I!d#B(0ns#4=XMl z!X*)(m4>*rYA_6E-M}fm9`7XY7GNZAIo~YJJ&uqU`lwM(8yh2TppA^_k@en!i zu9}y*;dKJV?*B0mnjbv5M@|Aldk=Zo6xYQm%|LqrM-9o*DdPL4KJ&d9@0=;yzDA6EL1pR03q^ z1{8_(_eCzYAlSLUC`K6gADOsS&iFs`!TFyM%3#Qjn8BA}>5Bhwr}nZXA2 za|`=|j%f>y6~S`QNk$)M@I5qP91}f@!76ppLJs;Del+e?nB5ken!$Pr)HDSVf^UE{ zr#>B1TXuvYdHoH>K1R{tNx4A@f7pQsyOiqU2QjxB#qB$gX7`6If8OM|wi}S4R~#JX z!)u;+bSpdZ1X1-RMJVCGr`vA3tO!UkVNUF%oV{SZ4_8Y2H7M+6v?io)Q1v$L?3Dls zHsCQmtm5^!-LCiy=b{Go^c69my-0@aXx; zTd$Qvx+s%xUzZSD8BB;+Bg;(t!x18~3Mvx?6y_I)su2L3Pfi7;5Bv^zmzg=#uxv%3v$z~&k`dHsgo(pP<;YR6|1 z5v+`{4TFy8FS}S}tG+5-l28i5l0gdX;xcGiiHl(A{2|zSCcdS)9fFG7ghni7a&DTA zoL(ci&6)*{zfUbq*f@$x{z-9$0RQk$3(!LCuQua`ySJ1XEp{Z3-cP6r}z zxr)XyQu?{(X)8)FdA z6AYWmU*F7qnD?n~_ugZ=a8EjyxXCsczFqCZc!>z$WSf&}(5$+8Zycyhnq*}x)n>)+ z$?blcSZi4&Fya!ocvGit!|Uv^j+Zx+^6yLpjVBq@BbCSt-Yv83MNSCPApfS;!GY_h z6M;Wdl;Ne+z*#~lcL2pc_@=ql$ikhfP%8NcKt2rvqO2(_Q#S`nD$gKAt$j664f>5WT8{UNK z;|3B$=*wj=?90e@irdjVUXpYLu6wvTuKji}RrLY|@!Gbp*>>%O`aFN{0>SG`Up=hO zbS>j2fyA()=TTC5ms)C2OVy1m$JmGutGmMESKVd?3I1Tu+F10e=g{qo`P(kwMYTN_ zfd_JYTGjNQ%t*i05$tlzntE$NsM+X4Qz=-Xt0O-MbYMK|8|osD#>RohRr(N_W%EV; zrE%App=1h70%?}Ei;wx0mhaL(8|s|hhZ39D0LQ{lnY(x7evM0sQeAtj85~#9Zayrh za1yUmUL|UOSH->|iK^tp<0k5Q5#c2LK?xFh7Gp(fPr|V{wzTw)FmJPUlGRK{Sz(Wn zexWHhgYniw9?b5e`=*9gCr^`~IV{UjddcK0#TYznK2{-B7RGj2l$lVT`?Kq3X4+Ad zmh3P~gHsbVq72%ta?7-j8z!jwD;+ic3I5jW**}!p99Wr!6A9&^(#w%dAF4AKsv5_ooW{v#3yqRsWiaIYyVO0t>Quo0Xxj78vdU2kO zY?rf=EfR8^^iV|zlrhR(_<{oR($FvK;5UBLzTRYXC>VJbQMAcX#gh%|RQPD0W$Io8idJfrW&-y+Swh9ynV7Jc zZgZy!TcIq0m72d>UuxIJ8~kv68)4IN~3jLB2F=c z#J~P^8gd{)mj=42lb{@wf0;#xi9;w^3J1yo)+4Iexs-Ier4jNiQ~@}CFBTndIFq3S z7x_98NFjbR37pAlaCFtd_yDZFwh6oE{I+w#RNpi*R2wG9{I}H4KTL9YxH{s$#wJUr z$ODc2|5(!R1viFo_0C!e4Q{%?Gc~~Yj?cgkg}cpbPO<5`ip$exwzZjwf{*0yeD<}e zr=HB$L#%Puc0bsVIYjWERJIGvl;DG?6*E62!pcRg=vSUv9WM!pRD;jdDE1{}KWL-k zv^nAjxoHgf@LhFx0e&jp;k!3)XkQ>zQ2L|xTS{Z;k3xtD6qsDR^sJQ=9dX>o0OdDP z=IB9PGk?qwQ6de~r1{&O0}R%Nv42%q|RnHm{QiCJM3DPsb-&nf8NEbm(T+5LAMIR}#O{v{bbuuDy?opmF`L z7}RACJwHILdQI4|L9S5$3A+5hPu{6?^6u`uyt;m# z=8XJtjhv%!(tKz9U4Meve-M<@OVGx~ZkJ84`uyyBu-_ z70~x{dtE~HI#18y*yDI#fMYG?%kFtxYrKyHQ84@(`6S%i?KzmRCxcQ0!6|wm-%O>` zB=GM|zjs?V%384t5cU~fp3Q}+1VzCj=)t>MG2xH|lS;C}5(RBkVo{tbXyA9oa6zao zXs3ZKmlo3Qu0|W@Zz~y8Z$%hEcw3q(Hwce_tZkLc%%}=}V*rY5|Wo1DyR9P3O$%Cjv|#t0X=#l#NqR`(AGL%`{`N z<4Vq3S+)#|NPD5!XHTbbW#YJF7#Inp`*->it>l#Zz?}?tvmVz@`b&5v&uAT7ME~QZ z8g=$@XnuD<9Kp!Kt|$KicPnF+iiEqvlZqRoTq8Kuivf$^EYC&D6FGeACZ6PHyISVB z&S7WoYsS3#yJ`Bs`GpSIWW_2x*IIl6@mAP;&|Yn*Bxsd4<57Zfen;9x-H996vS^!Z zH3Sh6K(|ol+0I0IQ?h$1so*%p=>j9P5UcNZK0U z{rMG>2iQP8QuQ=!Cur+_k3}U+GdDniHIG)U1}Go6E~NMjdDP(fXmc1t!rYr@bP&I5 zi&-~b0R?_^puH$kL-u=1g}EX)ej|M}Yz<@@?)(TXrHHM!=vPb=edy<2i3!9*hY}27 zX=^9;%|M@X2)>)5s-^VjkJnM9zC2CB`6u-e*(Jzp-wTqAKXD(#d$aqtuOH|=KXF@U z%&$f$jDKITEoa+^yTC=kPRU|;INeGz()W-?+g13_1euW>b`7h&YHX>9&_Rp*l3kp| z^p{}6E=MKx;z1>0f*qkrciaBDC#9#r|Dj&posgi?xN0a&&jGbVjU`wh5RiH|fo-b2Q9=82KS?zK zfD!8>j&@MjoGdlp&*IE#nrVxGaMNU-y&TNS&nmKp0q&$=lv%6na_^|Wd*uq+4QOOP zQ>7ZFY)5eT`8k;+h6A%=%izD2qK0Z*_JSXM^I|ibFc-01ES<>ieG4A;VTq2_+9Gg+ z@T4=@Lh)gQboOsdX{B@;OG1fZud3)+7`K#0**BLvx1p!uqekCqWk?e4>gQkbaiO=m zgj-8;ebN+Z3k+_t2Ph%_E`vgWx}AZ*p+Eyh=2DSDfV~l5pP3p1={?$#C>?{})8MdS z2>wfSv?}69U#YP73+hOJsh~#3INY?gy3qe9umEjV@71`-Lhvvy+6RWKNqm(s!#wRi z)uhj`dgLHZB|s9y{E%`+jpSaZmq+(nkq~a#IlaUwbwvLS&ERy(6BYAgd@;L_q}N;r&U9)kK}4Zt!sc3_Gr5eZE1g^bPm$dvVN+NQgGFGCH1I!?su2Pkj7Z#k;CDI+EzwKHa$DF>-W&Eka)CUE z?Lfj|kF(5_PYN8tr#x@<$}BJ*$4V8QpA{wkd3g^-)Z1=r-HhXs`$Vtz)V{(Pt zUiC$&0zn9lr-1x){zC%(WlHNU5i(8n$f7aS&lEqE`6R#g_9z!ZVLlDvfs0`$oQ1Ja zp!M~SVEI>I0BZ=hmmt$4-~2bs1}{Tn)Uvo2Ej5*n#z0P%z>0e9jKr;|UxMx;A+*vi z=qBn@m!9ESwS>~dRriR70W*Qfv$5L-Y5>#$#Z%G1n63fi!N$SgryM9$E;mJ_V5t5~ zZSVu#-wfB&cJb51`W!&WRBhq|ozMeme!(EXvyNwL82YMA|4v-!0d|bnR0iRnLwSVX znx`ddRS65oh}G$C>2BQ8Kn+?o%P1x5L3337?dp3t*QuoVX?-uyFHl?EjK0&PXX2H& z+@YgHep(1Uh&_3>LH(KPMe_LH=Tw_A744 zb=^ROWQB1)+Mdq(1TS{FD9Jp$X`*AgWqhzN-#*S@OUIb#zhr;>;d}y>)4>feb4|6k zA5JgKklKAMBm@dO>hH}k_Rbz;9DM%VHe_jr^9keBRmjG{2c}na2z7Umy!o=Vfyr8m zE0KW|!PW|#k~jN)Q;ky(vxTEzgVo?V@+LdH?Dwg!s&2(K!v3I$(pOAgUneZo8LN>Lqm%)MH|ug}Qo#E!Pi;qci-i**m~i9}{9w zFpuHHD&QA<9^>-8n%o$)xhmDuz?KfX>!KnQC7kHSwt{fla~8hvDJKGRXH!((h3lPw zXbTVI`;STD70%>EaaI>zFc(lBbT+{usJsrx!B%7ub0T;{i)G2jX#jcb^nTq46F_{q zX&0X?V7f3hjh-_C^WfGrzF=}Up2&(dp9?ja5eV?Lfm5^?bcJ~w?Giv*6WD%hz@AHW zI4mpZXh|XoZ2fOWBCh?Gs(;mhV9?r4Ppjs!mzWNo5RWXVY1r^P zBh$J=Ig~ArnIk>tcCOr=4cD*<#*eoRXfW9vS7=D0WD1!N2Xzg{U3@O9XhO;Fp@4+l z6z}?%)zNQoM8_rh+Zec)5$uoTTFTK8z=zh0;RP>{IF1)5^w@I!w5M#hL_FR#qA{8- zH?87ZUtREGtb-yn$S6E1D>be$8>^>hZg7~W~N zcZA^H#`U2cqsX{mrk!ASplNOODrAYP;0`mHv;O& zd!{zK)fKL0$$+y<>~WTTON;V~q0B3YS3k&i4Ti$=l9+Eeq|0@^2SExHGRV*#@v3Hb zQkZ~kCP_yszEVx(A~|y4X^RFFOj^2{N6_-S+P+n)`Eh+)cVPNsM`W)xY~X16#8c=e zquy1*WaPFIUicTs0am8h0A=r-o@p4zBgfk}Vz2iOQ;H^o%k2i zZel`V2=m7trCEBKG`Ac6dZ3oEwo{p+u@c4)3km(cD_L_+^*4nxKb%BQs#w;yTT=^=5!eC&~#d0v>q>5wPfu4cTf ze7m3OnxeR|<$T(?L33f)PW8)02bP_}&8kdsl#wD#QtgtDgNU3&=tG5y8=qOQ=k!Z? z=>{arZonyNOiY9eEDGEcR9$I|WXk3(gqkk?CP-!8E@UmztjJ=2QgP*%Gom*9@se5U zA+eJqN|f4_7pQr%iqkX0lpzCS%5CEhNC%`>>g!JmA9+kXsH*XYE`ewAdv`W*kmb}1 z-?OIa&zd&ssVH7QN|6C?KSj6LazlyAmkOs^vY7XOh%!bL#!&k3xC_Uk;56jAQswoA zQQ(q>rtRrbqW;0!zxoeZZ1e|`7V^c3DOY)^J8o;5u^|kFAvVEv*0GfuZ8P)NlR`#d zHI2fzuVh)l8#bN~y(vxH5Ppdbg1aEa#GYZz`@s94TSzXMNPeY`R{%xm zbSD6Qq$|WN;>}vcL3HqR1o)QWg3XmxdHZz?TQFUkL&+khEIz59lfdp>kX07ZC!r6?gkZalVJOFyxp$g!Nli|pJ`E>HsVtGLu|A!pFG z@od>aq5Phx7D`g@rv%v~iY~9Q&Z=TUggF2_R<+OfS(1jIcYD-uJ7uezRa6-|iVIv= z^BLh#KR&?|{6RYSC<%Y|c~>o%XUN-wsZT-6#X#y>K@E?SXCI3s``0=3tpx8sCZ{T|&XQ_Ot&b&BJ0Pp=-okKgCW%B`zDd(7c#e-ga(hoqo7I z&cB|=XD=7uAd9;21=CT}{Pf{%4wtUQHk;eNxRBQ4P^JK51>Vg*Z$jp^r9!b5m>Fm2?bWE@h)7z5xZ#&=FfSf$uuMRoRTUb$HE(G|Y zK(TctM8h|d#}cQ~yRPso+%l@d%^GyySL&*$N*^1D|TLHZfd5s@hUQ z+cF&2TdS*MN#_a~y}a^vU~~(!iixGEh)}+Sa{B`TNEL3~Ghwi>mfeRd0$v*B&WDQG zyud=i44P%cjap%_tR(k#rw!@YNZTDLt6CL2(PBZwzR7u!w}oL{`vRY{q4l^^n3Zy#vRQ2ss={1TYo#M^f&Z`ZtzQmAK)3;D?R%J zsA->k9Kj&I;to-^{}IY|afXHW-YbxAZz`KC%bE@S@r&OiMy1N^sCt$Fx zuq%3ItkT!{fjx@qDTpIp9%K4*&8m<$(tiZvFjav`sj#M0Q81)-D+2a^3W4Rr*>5Aa} ztld{SC|pCpr`5E0*NSIkr$u(D%2w<1ixGZSuy+~cehQ+d9cfb^IHQRmMNd|JuIp=p z$l%(@oBV$hFMkmWMw{bo!^7|AIzYUDW!#?MWJesa(CrwH6veVdZ#)ZQ(YM7=>wJ(5 zn_tg6vCS1q4vh_j`4OaYB|W)-tJp)n0xO4^K~ltF;>hAq^f>ak@_zcXgbH~!aBWk1 zoxlw43xorKW_T|{vUj&kLmT^GCbYy{u>XE2tNS&(=w%*eMPtkAcqIfQXDh^#F=b5t zcF@abJ@~jX-`Q_)$fde_F%KL$?3xg2+(`A7?=;wb~M@M|Y`t{FTITuCZ z9D2Ss;#WQNHT@_^7?}P{)c8VF&(v`P0wR-f{EG6`uhl0K?KmcGnFL(0u<$g9yE|9Z zh1y5}#K>;~Bl!p2BBsCgw{4NDSZ<|wMJSPlHfhdgV=+mYEMxQ)TjO*-N5<^2FWIe? z`a&=0C%-SV5u+i6=g#FR4SIzGA4Tm>f2Kq*KnU?Ki118+W(YIuEAsGbUM4s-g|88N z!)hXAjNN!#Rm-+U-5$-VH0aXbL8h*Z(AiZC`E?bEaB^RvjS(=B(LRLDDF(qfRW8=@ zb6bHnw3WxSB86* zAI(;GupF3dpAsxiZBD-C5BVW;gxzMNO3Ns~6Bx?<=JZw?I#gooyt83%vWUI$ON%%O z0s!oxEhGvw&1~&d*?=Vz*wGP{_Sa>|(j$O4Q%fdfA`FK+O+_P2=8@yQgAtzXK~79o z%uSbkBEL~92yQqU5aw#aTk}8%m`r)wam>jbtUpEwo}fnkH_&c0yb+j;vygnxhJBzA99*&RM_?E{46_UXZGtR&m+_V5wwL(`n0H@J#Gl@H%zok*rL1NNqY9 z=-^P}&$F(%=nEZsQH~ZPzfH%C`ClJrBRutbbWh)uS^TLA`w;+1e#LW{c>G=U)w^s= z`L;zDHYghF3*A>KaTW0Bg>prwWg8w+KR8znlDUczoM}HL(OUZ7wSoj3)3QzO1W+Hl zv|v?pq@yJ0>!fXj3rGuQ`mZt;*?dJMuS|!-uu{_tW}e#|tcr^Af_VWxfxi?OwW-+;v;C)OP6Gy_aHJDYd>U-NW#h?AWAkU($Y8FBF zO8|=ju49l=U7)yzGkllka&$3`!+J4eeKQ)Q5EN>gHA^u3J={h)OKNfeq#oTCI%f|L zi1?JYkdkzD*K`>FR{%@~v-yayHS1rIG?q==(y@Wjp^0};+fe;=p?@0Oj6Ij5ix?Fm zs9N*YW#pIa!WiwHLnnnt2eQ7ssp{LUdV5vgDs7V(*zo+IpP~nqIIA7>``;o~ABa-LxKE+9+?R>1-u7ew zj;b(1j?z{YoI7_!SMQz;ey~s9<<|{^q6|b;h@=it_OuVzndpHP*afKSQqDOu=5=Jw zCRpz)i%^&+@Em=HZq%Uc+0`=7rx-cp#42DTr>KrqbZYbDj=s**yj+pWMS`)ls6-Vb079>{QbIlLS$o4U-qB?#nFb^d=Bbk!cf(Y4;dqPlK+0q4+E` zCBBkVd5QKl8a*tdIx0W4*JK z(?GW7C~jVzaG)bMk1+U$P)*w|85o59Sl^7VtKm< zw_<-OWwA&nX3|4AOe1y7OsOrS_3@_jp)erx6ID>A%#(W1vvi}*Fozr!N6m}W0Z)Ch=?$YDi zRvh57^aQQ0qqns6?hpg7vGtUL)A5em#=}89SV@oxPvV;e11BRG!y>5frFlCvh^*eE z8e4^Axddrd(T%8C5isl|>FY3!-mG5$t(IO*az!EOCEN$|6~kJa zd{=<`n0-kyI85IbCfu7mHEgKv-((rnr$Wl@h(zl)>gQq1@@hQ{`jSKb+;CQ%|Iufe zcA7kVJHk;$4v`x0PcGPUu~=G|)rL3`tDT8Y2AAetX6gQ2x2+wM;9On-3MmouhT7a$ z+d^OE&k1V;OSL1)Gu(6K_xPJTV$ubs)}}!7j3(3xa@u~;5awiLCIS89lzP=tOOP!Q zb2bVbB(IiF;oE7kpY8$$;!8To^qU!}TKwF@{X2S771vPf(Z0eyySPLgT7TgWBj`a8 za0#)!MV9Vv0udBJs(Iwk_U2A$Vu4kNOv-1=_&4kh0an+)fsLnFiF~++m-ofSEfWF( zzSq4o#!Gop9sZC=jy(L)FTaE0&DstD0-jbfJ^Sef$+4TpVM2cgw7wM+E-1ETE8|vw z*smt0vb3d=+aUvXt_WOHbY*fNFGg%(bY(Vma%Ev{3V7PAx&=^O%eFQO0fM^+TfyDk z-GaOO0v7J>PH++|xCeLl1PxBm;O_34w{p&ZH+!FZ-(T;4@71cBHNVlLM}Nb*dsZ!q z_e!b^B4+j`KuLQ$7X}taW?q1nn5D6k3($!{#opG~4#2|5%F2R3L7@h6u>t<)C<28B z(8(EOZ^!$Wo|qHR*aa*RH+BK5tGe0&B!MOXR%QST2QM=VFFP~%ot5>!6z!dO0rDVI zOJkr7KoxA+0f;~$X7AwX1hTMn;RXEl3Si;kVFnmG1Hg=2?HpW9Y(UPIKr?{5y^}S- z#1kM2a&dM68?*(;*qJi^!-j~B4d7p|&HyK%GtkKmXvX+|vk0{*4VWD>4?XzF!u+o% z%fFti01-PgC!i-lgAt%)Y-jKGzcs+Z#=rn}lKDS8qX(E6JA*mf+r85Lr=5R?7Vxjo zf;j@DfObG9a2(D4xcDbSlJ-s(z&`;56JzEAP+PjVIPfwtnS+PS{|qrYn={%0U6^RV z@s+SM6SKFq1=_hdBd{<7%s{3t0281E$PR(&k0~`z2Oxk2U4T}7+1uH8zN#x2+X4YhQYvz)^73^5Q8IriiHh2L0K6GEn0WvU?5ynI z65!+ju&}bQ0et^yQOOwezZfyU&X%z=w+H+eb2C?m|6=dYuKKXo*L|0bni?__Ii^WQ9}{=EQY zT#Ri%rXqG0Hh+mg&XOPxpqUcL#ncjDZfxTW{I^`)&J5^e1F{1u**k;&Y<&O*7I4M? zb4<+=WNK{(ban=C{=4abc4q%UK*G+{-V9`C0bu3e1QdfiojeH zUlEv#(klXUQT_{YfVrr=A}|-#R|Mvw_KLt<)L#*pi^eMgbJ2W7U@ls(2+T$M6@j_v z{Dr{V7?bf|h~>|qv9YPE3-DFO114c?;skX2n+%+KCSx-Y5Zq%R=f6z{uVifDWc)W( zFcV{22k=H`3@($u6u~|lJA(@we0ZDxO^f9( z`M(?WuK_R>)4w?Zwr2WI$5{V}>}|kR{+AZ(ABnB)-vYwS_DA$zyTD(@!C`v!hV@TT zn%RSiIXi=1b-;}O9x?E0!2gKsA2Y!J9>qU70sb?J;3J0#_zw!Kf6P0&8r!_i0}DJ% zZNOX4e@VE&VK#rA0ah>v{oUxFVS87nSADRC#VZ0w!}8TSI1rYe4wk^zaB+b}ul{m@ zDO$ZEun(`Pe ze!$q(*5uEbYVkLc;5ga8F7}6s{ePt4Un>7S4Pch`c7Im`Qvx5!HfFCfZg2!0UJ)1= zI|1$fQJ_5kOZd+M0&@rVgemw+^S3zsO9rz4TbqFM;b7zX%845+aC~+64{`-M|7)lI zD=dFx_TZbA$!oy5!NS)pbAto*YLXS~rZdnM^v_OU{i6f!_`gZOHk`rNs@GlzV;f`V z*9zeVJMcGmz>d3EIsyL{KyZ9q++TCS4YuI=iol6+dqrSY?ym?u^L1rzu;tf60bdT7 zy#CfZU<7pf_agr|luTWnz*%tl*A)zWV*M932Z4`8AkYJ7im)(iZ^{>9RU6WNS1m%| z&agekB{00F#G65|Ji3`;{pB~y!;**GLRL%yKV{$-8IyL=V88@VxahGRHfFR@Imez%=w> z)e^aF&lAlxU$o(zIk7M@^U1i&0Rx4oU_O_inZK@nn?aQHQzA^ z6`Jf|4A0*ReVR=_V2p!NT#pdZcddz1+@x2zqnt8l$5?f5`S9BZ9VREf+LZR~XcnAH zp2<(Nx4QH3JKbN~ePj`$#lNvzsVoc<*ZqjTN^J-m=@?}e+hk=e3!SnN@w?#WPHIYA zQh6M})DI14s8xyODUjuA{odl!%Jro+m1*8|Zm}V6^gu>t!<5S$aenPjv{ zANK@$iHQWTpr8wQrLlb*zvp#Kjwiq@3lVbC)K^cv(Vn@=vAztUk_{cGuXWwQyYYP6 zz78o9U?rAmI~n9=Jc{9rdI=HR?5_JTj%}`(QswM(hk>#h6}l1nL2)MAlYFaCXFu3! zZ#^+uT)QLDkRp857cM;)rXyu$8x1b~l+!)LQRXZ+EM~a`X78Tvqujavbu?U^)KiM` zi~<@3rsI4XV;t*Cs$O9YoFtWA`~~yT2eIfST4NiLKsq%4?5M0rK7Gx`wE%AhP(ITd zasG03D$fDNa)cWTd@9A0Kziia*NXSoR_Mf?Hn%3jm+=&p2JyWj~(Xr1b9HcQlz9?wGN%)adS~B>ViY*UyXQh ze-BT+L0F3&9P-0l-;!a{GB)|XA^S1LVmUj{2Poy zbY&r`553x%T){lrtYSRyFwv3DEw$fEoRfCL4JWx-$a9U1{L&?1gj!Z$t zgwRO6AgrlOP4lATCAD|Q)D@3x@zKt#Q>C1Y|C0A`jCc$QEvYQ4#mJ%}w*fS)UA}Opv|%BrbXOR|JNYNao1`x6Q}z$!YHw#FI_r^oy;zD!BO+3*7ZPHW(ZDn}Iwwe_A=~`&lfLTbDk2$T=gpdbJH_?bcHAbu1_J=Lt zy$iRAXg=BzRCCE_-I)BOjL3`wb31rNrSgxm;Bb^1?N zstA#*Y{?%Hd@qc%w;kcs^K;#%lTnXlF7h`rhae!4hr`jSmJd$vno-^#iW;i2XpJ_P1b zej@BqR65eRDG$59Z4j=O2 z3Z!YQIk4uK3Gd`z;w9^=3JJMyZRFCNNAB!xRD`HHU2lF?9g7y{|7|&gc_oBD3pinV ztc#W(bKmZYGT+Pw=N%j2fr{06W^tk3D@JfE8fj^RkDo6SyNJ#EQyYqBECf5ySLn8~ z2dBpZ(Mt^7&+k|2GK`e%=V=MdZ#5tGeg#ea5_b#JFsvw{HUOU7%4{|qD)p2mLQxJF znp{PDg*Vj)@b^(|90A%v0NjN|&#(+3*E%FW3O}|G!oVzktA=t*%@3{qGF2|x^hwat zUCjDTOEuqfV}1o9886|j0ATphv&J^AvX8EHj8)2heNEC2Tl4vp2Ve*EDmSNVW2==) zeYyB5k$|zj@;%(IZeSLHD}lY5uOe5$&}uRKf>Osf(v+##@J;NSbK;PGAIoC5%MG!l z-zA+xg_|K88{RrZZoFK;W;LCfQiGb4Vv?ucO>G*SA8m$^Is3hBym4o? z*u-kAW(jw?w|8e$`FVHBV4H1dTAViT=OV&vp)g&-1_xApcY>I$Fx(4_FIykx#Apkj zrv+M5chQfd;bm3E*)%M@Gs?vkC6zWv;j6^38+*e#X;2Xjz~_p3OZIR=qHTOiF8EOK z4Y9UDg(SV^g$JrcoS+x`~Dg!k8P{Sbv}3rE9@Mm5u}M^Trz*HZ5V8_7Dn~u{bXx-M=8TY zw1|)7eB0`wCJ+aUO7TdsFz9=X)hzepX?|CFGIKvEIk0}9GqEmUD$_|pWi3a@x~Kh) zMp^ufQo^Nefp$2~vP;v5-q=I7f0_tGqgwfh1WV5*rFE(r-Rk5mi!-ETV(>waj_y8i z7s^3H7SmDkxH;19P+5~}hhRtAWL4RI(sZ*Dr^tU7Wf9X51vzGnVGa01 zZQVh{u1t&lcX1tIQ;MIVRlflQ?&80en}nN*xvW%@ir3;s%?FJ=_z_Ut#npeNFh4F4 zYLaqK__iY4^;Gk|9ZKc>@)Q~#7pW+_K>b#RXn2Bm438&7hrLT+xzFIU%y4Td)KkEW zR1u5fcf3Sj zXVVh=qp^ze74AO61$h0aHzTL!8qE1k^+Y&f>F&$!6=ib$$SVM)F)(}M!Q8LkZ<v4p}>kI$i~ zN9!#nEIuvo&S|QvuIkV4lKRew{;2Mp+U(93UxR1`_4?O$EBG+yFG>9&;NBr6kPz?t z^>vpbo5CQ|afpo}zZs9N3=;68OvozU=FQya$2ZkmE>BO97c|2!`1R>-J_A18SwL>? zo%3aTMX*85#Hocpgi&4FEyiq6pbA@x*PK^=&6kRtv0Hx2jotgfKyO2BAI$(HC?4iFVkt))PQr!O<9XDakJ zu&`INdfb&+)^<44#{Ou}Qku>976bdadLCnbeGs;2*IY85p|0FsZpm45gTyS*MUzcY zsKZXk$sD0oStMy&zZS<&q#BC<)55lFQbyHi!>X8xrPW9wk!I^xC{yMnfzQ0Ek2uyN zrt4jBQVwUDoU>|H;b|q)U7sC|+DBhJ(35g&a;fn1Rxb-z6QeKfKM;#R?JuhLqy|*_+v?t%dIFtfwR5FHGiVyAC^36f>aozJn4w^5oypKR z$z*PrY{IM*sWrN{HGa;2w zUcQ6k&dm|xeRmdsza-0F7sd|nkjZ+%ov2tTHziS*QL9BaQPI{SFxF4;7x+t2m5;}K8I)js8rr-=wXC22eo!;i+J6u zPF&z9{*T7;*8BF&d1Crrcc*vW{!Ky122V1Gu5eR<*KV{cN;V7yPGMj3Sm@AKWDdu7 zw6VA&h4El%;3r^N=SWP=<0RYdv}C3Qh9=c?VqE6)?u}JUKf+1hs*V%0-5l`*djk}g zL0ngQVVP63d}@yhSy^(Ml19ai-66?dN{2XL{EJC%of`K1NLIWL-;lYV^0sSJ^&a2U$8PqqYiXtbWGb!fIzjazT9e5PdfOTq zl1ibki{;}If%G=d$d0#XjhRs)Oz1@6RLjIdEE_9HrpQ=V4115BBmH6n)hrS3;nMod zL1LEf*Y~o3MQQPi5v*?u(fkuWpDEFBz4JC%(gbc*8m=Za^$I*ZWXGc7i%;-TK@8~a zSNs9}G1ZkZaZ~OVAS=f$$nSHf`8V;#-@ok0Cf1eV%NISoC53-~;!CT7^3G)>NwZ=L zHxNO(v_i1byzRtuJ^j{Qk{}};dxdSso5Dqb=@+9^=~5k;748KU5-Jgq4wAIH0;3=% z+&%tv;xFt}^x zCSfDWNKSpDktU<>fvQXy%op_-6&APbnp<;mm-tGuL;LyS=|e&Yn$U zEEV#dEwf8bUOtIRG_ogfkXbwF&76z;;h7}t)cZDQ;*LJ0gEq~pTSqqAR6Qh4L?#_A z_h*R4dmgI}fj|Ri(BUxu+j{80Ea@(Y^I~pGPr0!lg=q?J$F*QZw^8RRC)7?(yKOuP z{krTW6lC`?EXPi@zK_Z4p|YmH?ARi9q0?w(9 zpk5vmn$0qLTD8s&p`O01u|1IntbC?e&7JXF>j4hY<@2JXbIuFl&189-c(edV1xrVyXja{ zn{oI)!15h|Fre8g3v0*SezqKUTL1pL-YV!cUFJuzgYZw!Aab;YWyA|#whMMq35UL5 zDtJMHt{*}TgcU)K+r2OQHZk&d{%2~e4LEu+D;N5MzlIQ#zI@NkE}38!DA!$siSp{T zd$}wfKqSlL{7I|@*X%w4IOlob%;2m^TJ+JA8Y4zP&r$IiEligCecb70<&4 zB{P!eDRbK0RU(#z$!B#ZQ|}1EY*4Pxz~w0?JeryJTcEPk%vp?_8*QRS|2OA2EC7D79 zK|a`IcvuHaDYK5Z(z+5%0YkhY7P^jApI0o{HDl`w8<}8DKds*M4Zw+IDIBcZ9aB=} zIF;Ul?q%C#??@as{j895;Gd6TI6Zn^R2SzAZXygBF+Ue3Ly(m7WA#?@QM75mvA1|gGsTNQ(#{3Gwc(OTRGK%6s)mQ9)A_=kdl|o*nl4TpJnEW~ zy2f!PYBDP<$S30Ahb5!sM-4A%UJ~rxk?Io8llGN}NtuC%F?Bdj44KviH+?I)q)@H) z1$b2j{cfZD@M;w`c!qVTFV<5SDU5e2gpiz(oqeE{BUigqX)dfcBmWJa`j<{iRx6m4 zF0Sj;W=$2_E}LIZ_65fRImfH6lRi2ep@!^UR0$j()(mLwGVGN5yk`=>0`G9JYBc(= z*hst*>Tjh}Hy$P>-0ld7EMtCY|9-K_^;OoTlyQ`HG9Y&MC7j%#gmL&*2U%sj4=IBb zbAxIk8G2#>LtSTqk1iM4M_TLs#k`}?(d*PX;`VOeLlVYgi0ehRwqM(-)n0rHO(wa{ zD5t;^hVsatE`NL0RH+=b;}*320ljeb)(J9;Bp_21C};aCcf6uK;;m8bbt2`w!j-Yi zAeG@7)>koi3A9j@0pegXq3)n+`r=6CSU*t3r&G^o>;=uShUp~t50Yl9dP$8@o5Y?F zccmZ2^d_U+q&sBj_htiAx4Ait*k6vF;kN>kS_xIkIMCk>G|9~>QtEpq#-DOawE<7PKPgB1w*uI(0 zM{ypE_&6;`Gho=~x=n?A_vkI;%}bTdnvkgbg~RjM2}9pBV#28nXuezk^)A*Z3XL;j zYR{;pqkRVXWbOb)bYOvBKYKyMiqhn1{6u;;kz!(!@i!_%#zn))@D*HxoFED+4gEK? z-`vtS;;;i$E@%5SXD5o;IN@iHUtdOxNzAh9zA1Ix!Os(m`te;Tg!YmW>+J-2 zp^UIJcTA^oABvfaETqDQJgMV}B^p!En5;aN2Z+?)EfY}QJTZKnS9TO7?cUI2r1c?5 zpUB0=s-8tyZE(K(Mo>`EC~s*h_n8dQMD9R2cs?4TdKqh1D5Yh4r#^!xwDrr6{;ciE z`|e^@guuX_TwE1&X>u4YcTHP96q9O@}vyT*wwW6E0rROWy z$doRZDk8#T&e!Yv0U7(9H)7v3KC%Jpdeji8hmxx}Fg#dA*=e971)$~gL$-o#skW}n z;t1XhVSdOr|75c|_cTl4`IeGCB20mKf0%vL1Bu|vdj#N?9Xfxy5iL!ypXF7YZFul+27b6AMYXNX;-oSk*7 zWi!8m<8IatmW%ASf!iKJ2~|kl2M#86q|FYqznsVOR|Xh^fvDt&YJ0KD-9V_Um7|h} zc`ehip2ofq&)nsDs81DfHR%K>chhvvmz(M+ny%lQaHElNK9LPNeVLlYPepMKAqlz8 zf`O2+3wbv9;wRs{&G>xQ(c~JbCnb4w=P#Vc8-iCJKO0iuI%DC95g8ws0yp`)@CrT^ zqrLdY${Xm#Y(b$;I9Z0HQhc)tmW8P+cggmZIrx}%p;YbZFRfk7Sm~@VjF%#7PSE>i zKR5S z-b~p2VVZ=JtNr(^t!H)o6i*v47^hTVNJ8nU!9oNCkCD%R%h+|?t=p!uKe2Sdw|;>*X+idKpaF8z zJvF7r&wZrOrNP^myTwpL8Hz_vcKSLVUl94=TcSxQDq2Rl@lqRzlS{MdTB+8cuXRhG z5BIzAHKcCZYom0D#*Lw&DHcT*^dcxolJJoW?+4PW-dJPN45$b%yoiM(Y5j%W>^Of?j#7pxKO3~vp7Cx`qBjAJ z&xSz`i-#|1l4j^g3Ya8Lgz8R{@%6;$;qTYB;=vvX&rS#@SyOiBg!z@ z;=1+WG2}=GMku!7h!!nrN)V3h+NVS{s}!T{ql0XwF~l_DP!0l|Z&jDe6QyOuUmH7(bH*Q6 zqQ6OSFQWVQ^Ns!vmvwbi{7L>iZ!V%RbGA%3C<`|_c02*qPkhTBP%xZ>KiwN<6N;ly zFE+3eNkrOB+yXl(B4p+pukLnx&}>1aJYS^MYXIA#9_w!R`3OFtj=;0ig%`hn(8`$} zw<;r@6b1Q7VO&=jad+;kkzPxK+f|N_YW*-l!VQvf6nib)Pp(p8shnsX;TpJd^Nf`^ zGEjz?bb?8bHUUOSGkqtC5Y*hh^X>=a_DTU`9P9bjnSS$Vqb&hPX1}9My9@$N1WLyB zjcO#-)s%>O^@J3%gv2jI5_cH6b1+ifpd{ao%*iCy$AVO>__PP}gRqzMEu}4NnL1Z~ z){RkS(B6AURS4Xg?7bis?a#XoiWESW?Lqp=AE6Zv5I=NbCgqL7Xv>&rOG=u~gjAt5 zW(y5s-#oyo7AOpD2Uc<>bW=S-cCKVQIGB3ne&Dz1P)d#DtQcuH`EdcUewWnYa8U+q z>KM9(Ue}NFlV5{pcBJW+fVvvva1*ZKL(){GlrG#9+1Yd}68xwyei5?4$UIe#_hTcp zl>7cs%$A1>%fC_WJHw_yXI?iC5N$of;Xa}}3KHFIf~Pvt&FC`o$pQ z-xzU^NKp;D6NQLuWU?2r>TX&Z_x<6Mx6JGcT=xX5^qoPKK5lv?5wjjUGq)TsSQo<$ zk)&rztRiC(w;KUX8L5&kryN}(Y#T4%u#^OPsz`pbWss}#L8%t6v%SCFLhRLb(^X?f2TBM^ z+o^tJro>~)!B4rxMeF}r8j7pzljd0i;2Aoe^>tIDu+7QZIocw&`sNH+dRs=fZN3G_ ztNt4LlMEE3##eHK>i=m_K&a6^mE_)xzVoeN|M2f0+rnl;Zz8K-IuI#;@x^EC7d!&w z-8m`-Z!ImU(%C?&|_~u#pA6CMf$KUprs$PLWwv#xW~4@d=5? zO{#Q{Pna{XgopRQje|&stY#MiMhFSRnxA7YpYW_=3x+zCXA+-Qrm9in-76{mA3qVu zkJvhru2xjQAMhgoFnwuh1|_T3B%-&s$=G&asUeUE&S)lNf-EXv1iYmcu6L3Q(_1;U z&2j-XHz3s`l0cI1CIwFSM)+jw7YG;`~1|Ij!(#uLlfuY{7 zg2h!n%x%{pQD4NCjNrXwG+Iq{`;F!tB+WoN!Ip2{_w)F1zRY+od(dd-{(>%cZ%B-Y z;XdApdlY;L4!PFfmr&ns@Yn7FSa40&?Z+pEw(VNhnb&pGzoWULCeqO2JlOWPgpPkH z$h&4Mlw>TH0p=?2i3WfBJ@ojs>3)8hFkBQ)Z3VlEhIrPsh`mP{Ux2364%X2p8pf{7 ziARKmUHl-(YT0o9LA?1&_)O?2lEaVF@nZ7ae=fcEqkB|yflm-ZX8`C9Z&*oT|J&u4 zPu$|2778DJqzNb>l^Vo3=fvM|%J@YK&pxvYvnlZiSu8muX`rF0CPljCWXi{3Pm0)6 z{`5$t8cW()%2V7maNmfmajHsxe5u+B`-xYqr&m@r42q29YXx-utg>KGM{j8{4WxvU zaJBQ~wd@lUZ-pB=ORl6@dhTccG~aT{=7=xVsEY*K=D$v}JF&JggHs&<=^RJg`-B)0 z3zhAZ;^Cx7QJ^N{$1m+Z|lw_i+>vD6sRic9-GtQKF{ zpN%MI*6@9BR4LaP0(>FC33SES0pVNEibWURQNc){ZTp9nG7irM2j;V_ znu|6lz9tXtM#8=9z>o?{(cc;uUL_9Bb;naI6h(|1Yq;9J#A(Ou3{Y#m4HJ1pQ=RPvbGCGwR-QIacXEz4 zbd>!3*#ye+4gaIGJ_#lkwfd0XL`D0%^?e27qn=rT#ujSB4mlq+_0wM@20EH+xHwo&kD)guNa5qY2G{QLD)8*<;?2xfjQ2|Ob5 zCXq?sbqzoM85%4ES8};$EOT9?95VV#M(chkl0IS722p~Vba-2)D(W|>)cn9-e2@!D}QtTBI20yvOJj{G&IJ?w$&EvV-F9-+eL zd#SgoEf%qdVGr#{+syjW5!JB;u%AcZawbFiTO*7B>{OH z(&n7kDO+~E`emTcEgl2Wgu-u-71Wk>|51X!VJ7B+3gLmwfsCgGv&jAFV2t|&1J4n< z<_vdtJt0nblWWXi**212-S#Jzs6{u>Xt*$B2CQO-wRHK{WY@4KWsW$h26N-pkf-@_ zs(Nk?N>w`-1`?VK=eAE9F_DfR-V7&qaTVZN9N#%fR4h&I%QKx|AbA&|grpe6^JV)RJxIpT+M1pj?0AX@K^EqI<=F4Wi!M{=qJbqRMGB7gLrr7zdq0JP z^rs0(R;GC@)+}rac{BRfZQPN6r{X{`!lToBCC!JQJe9N*

6>Y@SVBoyjwswXTek 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

yy^k%f>ybGIZ_iuOIGY22x^TnHQ2_7by?9U&bE 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�cD6{h*zK^j&=Eh{k*g!Kph0g(D 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 dict`** — built into `Gemma4Processor`. Returns `{thinking, content, tool_calls}` parsed from raw decoded output. Driven by regexes declared in `tokenizer_config.json` under `response_schema` (new HF feature using `x-regex`, `x-regex-iterator`, and a custom `x-parser: gemma4-tool-call`). **You no longer need to hand-roll tool-call regex parsing** if you use the HF processor — this is the HF-canonical replacement for the manual parsing done in `CORPUS_tool_calling_format.md`. + +3. **`enable_thinking=True`** — a kwarg to `processor.apply_chat_template()`. When set, injects `<|think|>` at the top of the system turn. **This is how you turn reasoning mode on** through the HF API. Not documented in the existing corpus. + +4. **`load_audio_from_video=True`** — another `apply_chat_template` kwarg. Pulls the audio track out of a video URL and feeds it as audio tokens alongside sampled frames. Only relevant for E2B/E4B which have audio; the notebook comment explicitly calls this out. + +5. **`pipeline("any-to-any", model=...)`** — a new HF pipeline task registered for Gemma 4. Accepts the chat-style messages list directly. Easiest one-liner for multimodal inference. + +6. **Object detection via `box_2d` JSON** — prompting with "What's the bounding box for the X?" returns `[{"box_2d": [ymin, xmin, ymax, xmax], "label": "..."}]` in a 1000x1000 normalized coordinate frame, with images resized to multiples of 48 pixels. This is a Gemma-4-specific convention the notebook demonstrates. Corpus doesn't cover this. + +7. **Thinking delimiters are `<|channel>thought...`** — not `...` like some other open-weights models. The Space app explicitly strips these to pass to Gradio 6's `reasoning_tags` for collapsible thinking UI. + +8. **Breaking change in role/turn markers vs Gemma 3** — Gemma 3 used `user ... `. Gemma 4 uses `<|turn>user\n ... `. Tokenizer config: + - `sot_token`: `<|turn>` (start of turn) + - `eot_token`: `` (end of turn) + - Role after `<|turn>` can be `system`, `user`, `model`, or `tool`. + - `enable_thinking` injects a `<|think|>` marker into the first system turn. + Anything in the homelab that hard-codes `` for Gemma needs to branch on family version. Worth adding to `GOTCHAS.md`. + +--- + +## Canonical chat template format + +**Source of truth:** the two `.jinja` files in `model-cards/`. Use them directly — **do not reimplement.** The tokenizer loads them automatically: + +```python +from transformers import AutoProcessor +processor = AutoProcessor.from_pretrained("google/gemma-4-E4B-it") +inputs = processor.apply_chat_template( + messages, + tools=[WEATHER_TOOL], # optional; OpenAI-style tool schema + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, # turns on reasoning, injects <|think|> + load_audio_from_video=False, # only for video inputs +) +output = model.generate(**inputs, max_new_tokens=1000) +generated = processor.decode(output[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True) +result = processor.parse_response(generated) +# → {"thinking": "...", "content": "...", "tool_calls": [...]} +``` + +### Wire format that the template produces + +``` +<|turn>system +<|think|> +{system prompt here if any} +<|tool>declaration:get_weather{city:{type:<|"|>STRING<|"|>,description:<|"|>...<|"|>}} + +<|turn>user +{user text} +<|image|> ← placeholder for each image +<|audio|> ← placeholder for each audio +<|video|> ← placeholder for each video + +<|turn>model +<|channel>thought +{reasoning text} + +<|tool_call>call:get_weather{city:<|"|>London<|"|>} +<|tool_response>response:get_weather{temperature:15} +{final content} + +``` + +Every Gemma-4-specific token appears in `tokenizer_config.json`. The `apply_chat_template` call + the `response_schema` + `parse_response()` round-trip means **homelab code should never hand-emit these tokens** — always go through the processor. + +--- + +## Source URLs (first-party only) + +- Model collection: https://huggingface.co/collections/google/gemma-4 +- transformers gemma4 dir: https://github.com/huggingface/transformers/tree/main/src/transformers/models/gemma4 +- Recipes repo: https://github.com/huggingface/huggingface-gemma-recipes +- Launch blog: https://huggingface.co/blog/gemma4 +- Official 31B Space: https://huggingface.co/spaces/huggingface-projects/gemma-4-31b-it +- Official E4B Space: https://huggingface.co/spaces/huggingface-projects/gemma-4-e4b-it diff --git a/tooling/huggingface/blog/gemma-peft-blog.md b/tooling/huggingface/blog/gemma-peft-blog.md new file mode 100644 index 0000000..a7493fd --- /dev/null +++ b/tooling/huggingface/blog/gemma-peft-blog.md @@ -0,0 +1,207 @@ +--- +title: Fine-Tuning Gemma Models in Hugging Face +thumbnail: /blog/assets/gemma-peft/thumbnail.png +authors: +- user: svaibhav + guest: true +- user: alanwaketan + guest: true +- user: ybelkada +- user: ArthurZ +--- + +# Fine-Tuning Gemma Models in Hugging Face + +We recently announced that [Gemma](https://huggingface.co/blog/gemma), the open weights language model from Google Deepmind, is available for the broader open-source community via Hugging Face. It’s available in 2 billion and 7 billion parameter sizes with pretrained and instruction-tuned flavors. It’s available on Hugging Face, supported in TGI, and easily accessible for deployment and fine-tuning in the Vertex Model Garden and Google Kubernetes Engine. + +

+ + + +The Gemma family of models also happens to be well suited for prototyping and experimentation using the free GPU resource available via Colab. In this post we will briefly review how you can do [Parameter Efficient FineTuning (PEFT)](https://huggingface.co/blog/peft) for Gemma models, using the Hugging Face Transformers and PEFT libraries on GPUs and Cloud TPUs for anyone who wants to fine-tune Gemma models on their own dataset. + + + +## Why PEFT? + +The default (full weight) training for language models, even for modest sizes, tends to be memory and compute-intensive. On one hand, it can be prohibitive for users relying on openly available compute platforms for learning and experimentation, such as Colab or Kaggle. On the other hand, and even for enterprise users, the cost of adapting these models for different domains is an important metric to optimize. PEFT, or parameter-efficient fine tuning, is a popular technique to accomplish this at low cost. + +## PyTorch on GPU and TPU + +Gemma models in Hugging Face `transformers` are optimized for both PyTorch and PyTorch/XLA. This enables both TPU and GPU users to access and experiment with Gemma models as needed. Together with the Gemma release, we have also improved the [FSDP](https://engineering.fb.com/2021/07/15/open-source/fsdp/) experience for PyTorch/XLA in Hugging Face. This [FSDP via SPMD](https://github.com/pytorch/xla/issues/6379) integration also allows other Hugging Face models to take advantage of TPU acceleration via PyTorch/XLA. In this post, we will focus on PEFT, and more specifically on Low-Rank Adaptation (LoRA), for Gemma models. For a more comprehensive set of LoRA techniques, we encourage readers to review the [Scaling Down to Scale Up, from Lialin et al.](https://arxiv.org/pdf/2303.15647.pdf) and [this excellent post](https://pytorch.org/blog/finetune-llms/) post by Belkada et al. + +## Low-Rank Adaptation for Large Language Models + +Low-Rank Adaptation (LoRA) is one of the parameter-efficient fine-tuning techniques for large language models (LLMs). It addresses just a fraction of the total number of model parameters to be fine-tuned, by freezing the original model and only training adapter layers that are decomposed into low-rank matrices. The [PEFT library](https://github.com/huggingface/peft) provides an easy abstraction that allows users to select the model layers where adapter weights should be applied. + +```python +from peft import LoraConfig + +lora_config = LoraConfig( + r=8, + target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"], + task_type="CAUSAL_LM", +) +``` + +In this snippet, we refer to all `nn.Linear` layers as the target layers to be adapted. + +In the following example, we will leverage [QLoRA](https://huggingface.co/blog/4bit-transformers-bitsandbytes), from [Dettmers et al.](https://arxiv.org/abs/2305.14314), in order to quantize the base model in 4-bit precision for a more memory efficient fine-tuning protocol. The model can be loaded with QLoRA by first installing the `bitsandbytes` library on your environment, and then passing a `BitsAndBytesConfig` object to `from_pretrained` when loading the model. + +## Before we begin + +In order to access Gemma model artifacts, users are required to accept [the consent form](https://huggingface.co/google/gemma-7b-it). +Now let’s get started with the implementation. + +## Learning to quote + +Assuming that you have submitted the consent form, you can access the model artifacts from the [Hugging Face Hub](https://huggingface.co/collections/google/gemma-release-65d5efbccdbb8c4202ec078b). + +We start by downloading the model and the tokenizer. We also include a `BitsAndBytesConfig` for weight only quantization. + +```python +import torch +import os +from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig + +model_id = "google/gemma-2b" +bnb_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="nf4", + bnb_4bit_compute_dtype=torch.bfloat16 +) + +tokenizer = AutoTokenizer.from_pretrained(model_id, token=os.environ['HF_TOKEN']) +model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map={"":0}, token=os.environ['HF_TOKEN']) +``` + +Now we test the model before starting the finetuning, using a famous quote: + + +```python +text = "Quote: Imagination is more" +device = "cuda:0" +inputs = tokenizer(text, return_tensors="pt").to(device) + +outputs = model.generate(**inputs, max_new_tokens=20) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) +``` + +The model does a reasonable completion with some extra tokens: +``` +Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. + +-Albert Einstein + +I +``` + +But this is not exactly the format we would love the answer to be. Let’s see if we can use fine-tuning to teach the model to generate the answer in the following format. + +``` +Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. + +Author: Albert Einstein +``` + +To begin with, let's select an English quotes dataset [Abirate/english_quotes](https://huggingface.co/datasets/Abirate/english_quotes). + +```python +from datasets import load_dataset + +data = load_dataset("Abirate/english_quotes") +data = data.map(lambda samples: tokenizer(samples["quote"]), batched=True) +``` + +Now let’s finetune this model using the LoRA config stated above: + +```python +import transformers +from trl import SFTTrainer + +def formatting_func(example): + text = f"Quote: {example['quote'][0]}\nAuthor: {example['author'][0]}" + return [text] + +trainer = SFTTrainer( + model=model, + train_dataset=data["train"], + args=transformers.TrainingArguments( + per_device_train_batch_size=1, + gradient_accumulation_steps=4, + warmup_steps=2, + max_steps=10, + learning_rate=2e-4, + fp16=True, + logging_steps=1, + output_dir="outputs", + optim="paged_adamw_8bit" + ), + peft_config=lora_config, + formatting_func=formatting_func, +) +trainer.train() +``` + +Finally, we are ready to test the model once more with the same prompt we have used earlier: + +```python +text = "Quote: Imagination is" +device = "cuda:0" +inputs = tokenizer(text, return_tensors="pt").to(device) + +outputs = model.generate(**inputs, max_new_tokens=20) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) +``` + +This time we get the response in the format we like: + + +``` +Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. +Author: Albert Einstein +``` + + +## Accelerate with FSDP via SPMD on TPU + +As mentioned earlier, Hugging Face `transformers` now supports PyTorch/XLA’s latest FSDP implementation. This can greatly accelerate the fine-tuning speed. To enable that, one just needs to add a FSDP config to the `transformers.Trainer`: + +```python +from transformers import DataCollatorForLanguageModeling, Trainer, TrainingArguments + +# Set up the FSDP config. To enable FSDP via SPMD, set xla_fsdp_v2 to True. +fsdp_config = { + "fsdp_transformer_layer_cls_to_wrap": ["GemmaDecoderLayer"], + "xla": True, + "xla_fsdp_v2": True, + "xla_fsdp_grad_ckpt": True +} + +# Finally, set up the trainer and train the model. +trainer = Trainer( + model=model, + train_dataset=data, + args=TrainingArguments( + per_device_train_batch_size=64, # This is actually the global batch size for SPMD. + num_train_epochs=100, + max_steps=-1, + output_dir="./output", + optim="adafactor", + logging_steps=1, + dataloader_drop_last = True, # Required for SPMD. + fsdp="full_shard", + fsdp_config=fsdp_config, + ), + data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False), +) +trainer.train() +``` + +## Next Steps + +We walked through this simple example adapted from the source notebook to illustrate the LoRA finetuning method applied to Gemma models. The full colab for GPU can be found [here](https://huggingface.co/google/gemma-7b/blob/main/examples/notebook_sft_peft.ipynb), and the full script for TPU can be found [here](https://huggingface.co/google/gemma-7b/blob/main/examples/example_fsdp.py). We are excited about the endless possibilities for research and learning thanks to this recent addition to our open source ecosystem. We encourage users to also visit the [Gemma documentation](https://huggingface.co/docs/transformers/v4.38.0/en/model_doc/gemma), as well as our [launch blog](https://huggingface.co/blog/gemma) for more examples to train, finetune and deploy Gemma models. + + diff --git a/tooling/huggingface/blog/gemma4-blog.md b/tooling/huggingface/blog/gemma4-blog.md new file mode 100644 index 0000000..66ea09c --- /dev/null +++ b/tooling/huggingface/blog/gemma4-blog.md @@ -0,0 +1,764 @@ +--- +title: "Welcome Gemma 4: Frontier multimodal intelligence on device" +thumbnail: /blog/assets/gemma4/thumbnail.png +authors: +- user: merve +- user: pcuenq +- user: sergiopaniego +- user: burtenshaw +- user: Steveeeeeeen +- user: alvarobartt +- user: SaylorTwift +--- + +# Welcome Gemma 4: Frontier multimodal intelligence on device + +The Gemma 4 family of multimodal models by Google DeepMind is out on Hugging Face, with support for your favorite agents, inference engines, and fine-tuning libraries 🤗 + +These models are the real deal: truly open with Apache 2 licenses, high quality with pareto frontier arena scores, multimodal including audio, and sizes you can use _everywhere_ including on-device. Gemma 4 builds on advances from previous families and makes them click together. In our tests with pre-release checkpoints we have been impressed by their capabilities, to the extent that we struggled to find good fine-tuning examples because they are _so good_ out of the box. + +We collaborated with Google and the community to make them available everywhere: transformers, llama.cpp, MLX, WebGPU, Rust; you name it. This blog post will show you how to build with [your favorite tools](https://huggingface.co/collections/google/gemma-4) so let us know what you think! + +## Table of Contents + +- [What is New with Gemma 4?](#what-is-new-with-gemma-4) +- [Overview of Capabilities and Architecture](#overview-of-capabilities-and-architecture) + - [Architecture at a Glance](#architecture-at-a-glance) + - [Per-Layer Embeddings (PLE)](#per-layer-embeddings-ple) + - [Shared KV Cache](#shared-kv-cache) +- [Multimodal Capabilities](#multimodal-capabilities) +- [Deploy Anywhere](#deploy-anywhere) + - [transformers](#transformers) + - [Llama.cpp](#llamacpp) + - [Plug in to your local agent](#Plug-in-your-local-agent) + - [transformers.js](#transformersjs) + - [MLX](#mlx) + - [Mistral.rs](#mistralrs) +- [Fine-tuning & Demos](#fine-tuning--demos) + - [Fine-tuning with TRL](#fine-tuning-with-trl) + - [Fine-tuning with TRL on Vertex AI](#fine-tuning-with-trl-on-vertex-ai) + - [Fine-tuning with Unsloth Studio](#fine-tuning-with-unsloth-studio) +- [Try Gemma 4](#try-gemma-4) +- [Benchmark Results](#benchmark-results) +- [Acknowledgements](#acknowledgements) + +# What is new with Gemma 4? + +Similar to Gemma-3n, Gemma 4 supports image, text, and audio inputs, and generates text responses. The text decoder is based on the Gemma model with support for long context windows. The image encoder is similar to the one from Gemma 3 but with two crucial improvements: variable aspect ratios, and configurable number of image token inputs to find your sweet spot between speed, memory, and quality. All models support images (or video) and text inputs, while the small variants (E2B and E4B) support audio as well. + +Gemma 4 comes in four sizes, all base and instruction fine-tuned: + +| Model | Parameter Size | Context Window | Checkpoints | +| :---- | :---- | :---- | :---- | +| Gemma 4 E2B | 2.3B effective, 5.1B with embeddings | 128k | [base](https://huggingface.co/google/gemma-4-E2B), [IT](https://huggingface.co/google/gemma-4-E2B-it) | +| Gemma 4 E4B | 4.5B effective, 8B with embeddings | 128k | [base](https://huggingface.co/google/gemma-4-E4B), [IT](https://huggingface.co/google/gemma-4-E4B-it) | +| Gemma 4 31B | 31B dense model | 256K | [base](https://huggingface.co/google/gemma-4-31B), [IT](https://huggingface.co/google/gemma-4-31B-it) | +| Gemma 4 26B A4B | mixture-of-experts with 4B activated/26B total parameters | 256K | [base](https://huggingface.co/google/gemma-4-26B-A4B), [IT](https://huggingface.co/google/gemma-4-26B-A4B-it) | + +## Overview of Capabilities and Architecture + +Gemma 4 leverages several architecture components used in previous Gemma versions and other open models, and leaves out complex or inconclusive features such as Altup. The combination is a mix designed to be highly compatible across libraries and devices, that can efficiently support long context and agentic use cases, whilst being ideal for quantization. + +As shown in the benchmarks above, this feature mix (combined with the training data and recipe) enables the 31B dense model to achieve an estimated LMArena score (text only) of 1452, while the 26B MoE reaches 1441 with just 4B active parameters 🤯. As we'll see, multimodal operation is comparatively as good as text generation, at least in informal and subjective tests. + +These are the main architecture characteristics in Gemma 4: + +* Alternating **local sliding-window** and **global full-context** attention layers. Smaller dense models use sliding windows of 512 tokens while larger models use 1024 tokens. +* **Dual RoPE** configurations: standard RoPE for sliding layers, pruned RoPE for global layers, to enable longer context. +* **Per-Layer Embeddings (PLE)**: a second embedding table that feeds a small residual signal into every decoder layer. +* **Shared KV Cache**: the last N layers of the model reuse key-value states from earlier layers, eliminating redundant KV projections. +* **Vision encoder**: uses learned 2D positions and multidimensional RoPE. Preserves the original aspect ratios and can encode images to a few different token budgets (70, 140, 280, 560, 1120). +* **Audio encoder**: USM-style conformer with the same base architecture as the one in Gemma-3n. + +#### Per-Layer Embeddings (PLE) + +One of the most distinctive features in smaller Gemma 4 models is Per-Layer Embeddings (PLE), which was introduced previously in Gemma-3n. In a standard transformer, each token gets a single embedding vector at input, and the same initial representation is what the residual stream builds on across all layers, forcing the embedding to frontload everything the model might need. PLE adds a parallel, lower-dimensional conditioning pathway alongside the main residual stream. For each token, it produces a small dedicated vector for every layer by combining two signals: a token-identity component (from an embedding lookup) and a context-aware component (from a learned projection of the main embeddings). Each decoder layer then uses its corresponding vector to modulate the hidden states via a lightweight residual block after attention and feed-forward. This gives each layer its own channel to receive token-specific information only when it becomes relevant, rather than requiring everything to be packed into a single upfront embedding. Because the PLE dimension is much smaller than the main hidden size, this adds meaningful per-layer specialization at modest parameter cost. For multimodal inputs (images, audio, video), PLE is computed before soft tokens are merged into the embedding sequence — since PLE relies on token IDs that are lost once multimodal features replace the placeholders. Multimodal positions use the pad token ID, effectively receiving neutral per-layer signals. + +#### Shared KV Cache + +The **shared KV cache** is an efficiency optimization that reduces both compute and memory during inference. The last `num_kv_shared_layers` layers of the model don't compute their own key and value projections. Instead, they **reuse** the K and V tensors from the last non-shared layer of the same attention type (sliding or full). + +In practice, this has a minimal impact on quality while being much more efficient (in terms of both memory and compute) for long context generation and on-device use. + +## Multimodal Capabilities + +We saw in our tests that Gemma 4 supports comprehensive multimodal capabilities out of the box. We don't know what was the training mix, but we had success using it for tasks such as OCR, speech-to-text, object detection, or pointing. It also supports text-only and multimodal function calling, reasoning, code completion and correction. + +Here, we show a few inference examples across different model sizes. You can run them conveniently with [this notebook](https://github.com/huggingface/huggingface-gemma-recipes/blob/main/notebooks/Gemma4_(E2B)-Multimodal.ipynb). We encourage you to try the demos and share them below this blog! + +### Object Detection and Pointing + +### GUI detection + +We test Gemma 4 on GUI element detection and pointing across different sizes, with the following image and text prompt: "What's the bounding box for the "view recipe" element in the image?" + +![Image](https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/food_resized.png) + +With this prompt, the model natively responds in JSON format with the detected bounding boxes - no need for specific instructions or grammar-constrained generation. We found the coordinates refer to an image size of 1000x1000, relative to the input dimensions. + +We visualize the outputs below for your convenience. We parse the bounding boxes from the returned JSON: ```json\n[\n {"box_2d": [171, 75, 245, 308], "label": "view recipe element"}\n]\n``` + +| E2B | E4B | +| :---- | :---- | +| ![E2B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e2b.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e4b.png) | +| 26/A4B | 31B | +| ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/26b.png) | ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/31b.png) | + +### Object Detection + +We test models to detect everyday objects, here we ask them to detect the bike and compare different model outputs. As in the previous case, we parse the bounding box from the json and translate to image space coordinates. + +| E2B | E4B | 26B/A3B | 31B | +| :---- | :---- | :---- | :---- | +| ![E2B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/e2b_bike.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/bike_e4b.png) | ![26B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/bike_26b.png) | ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/31b_bike.png) | + +### Multimodal Thinking and Function Calling + +We asked Gemma 4 to write HTML code to reconstruct a page we made with Gemini 3. Below you can find the code to do this, we enable thinking and ask each model to generate up to 4000 new tokens, to make it foolproof. + +| Gemini Generated Website (Reference) | Gemini Reproduced Image | +| :---- | :---- | +| ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/landing_page.png) | ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_repro_gemini.png) | + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + { + "type": "image", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/landing_page.png", + }, + {"type": "text", "text": "Write HTML code for this page."}, + ], + } +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=4000) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| E2B | E4B | +| :---- | :---- | +| ![Reference](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_e2b.png) | ![E4B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_e4b.png) | + +| 31B | 26/A4B | +| :---- | :---- | +| ![31B](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_31b.png) | ![MoE](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/g4-blog/page_26b.png) | + +### Video Understanding + +Smaller Gemma 4 models can take in videos with audio while larger ones can take in videos without audio. While the models are not explicitly post-trained on videos, they can understand videos both with and without audio. The model is particularly strong in audios + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "video", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"}, + {"type": "text", "text": "What is happening in the video? What is the song about?"}, + ], + }, +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + load_audio_from_video=True, # disable this for larger models +).to(model.device) +output = model.generate(**inputs, max_new_tokens=200) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B (hallucinated for the audio) | Based on the video provided, here is an analysis: **What is happening in this video?** The video captures a live musical performance, likely at a large outdoor festival or concert. * **Setting:** The scene is a large stage set up outdoors, indicated by the extensive lighting rig, large speakers, and the audience visible in the foreground. * **Performers:** There are several musicians on stage. The focal point seems to be a lead singer/guitarist in a blue shirt and white pants who is actively performing, playing an acoustic or electric guitar. There are also other musicians, including drummers and bassists, visible in the background. * **Atmosphere:** The atmosphere is energetic and dramatic, characterized by bright stage lights, intense blue and white spotlights, and a significant amount of stage fog/smoke, which adds to the concert mood. * **Audience:** The foreground is filled with the backs of audience members, showing they are close to the stage and engaged in watching the performance. **What is the song about?** The lyrics provided below the video are: > "I don't care 'bout street > From what I cherish > Could it's time to protest | +| E4B ✅ | The video captures a live performance of a band on a stage with bright lights and smoke effects, surrounded by an audience. The band performs and sings to the crowd. The song appears to be about the struggles and disillusionment of modern life, specifically the feeling of being stuck and the difficulties in finding one's place in a chaotic and overwhelming world. Lyrics mention themes of the "concrete street," "broken promises," "storm of the day," and the difficulty of finding oneself amidst societal pressures. | +| 26/A4B (no audio) ✅ | This video shows a live music performance at an outdoor concert or festival at night. A solo male artist, dressed in a blue shirt and white pants, is the central focus. He is playing an acoustic guitar and singing into a microphone on a large, lit stage. The performance is accompanied by a band, including a drummer and other musicians visible in the background and on large video screens. The stage is filled with atmospheric blue lighting, smoke, and bright spotlights. The video captures different perspectives, including shots from the crowd looking up at the stage and close-up views of the performers projected onto large screens. The crowd is visible in the foreground, watching the show. One of the screens also displays the "Estrella Damm" brand name. | +| 31B (no audio) ✅ | A musician is performing on stage during a concert, playing an acoustic guitar and singing into a microphone. He is wearing a blue shirt and white pants. The stage is filled with atmospheric smoke and illuminated by bright blue and white lights. Other band members, including a drummer and a keyboardist, are also visible on stage. The video shows the musician from the perspective of the audience, with some shots focusing on him and others showing the large screen on the side of the stage, which displays close-ups of the performer and the crowd. | + +### Captioning + +We have tested all models on captioning. All checkpoints perform very well and accurately capture nuance in complex scenerios. +Here's the image we use, with the prompt "Write single detailed caption for this image.". + +![image](https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png) + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "image", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png"}, + {"type": "text", "text": "Write single detailed caption for this image."}, + ], + }, +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=512) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B ✅ | A medium shot captures a weathered seagull perched atop a stone pedestal in what appears to be a bustling European square, with a grand, classical-style building featuring ornate columns and architectural details dominating the right side of the frame. In the background, a low, light-colored building stretches across the middle ground, flanked by some green foliage, and hints of other structures, including a terracotta-roofed building, are visible. In the foreground, part of a modern bus stop or shelter is visible, with signage indicating routes, and the overall scene is bathed in bright daylight under a pale sky. | +| E4B ✅ | A solitary seagull perches atop a grey stone pedestal in a bustling European piazza, with the historical grandeur of a classical building dominating the right side of the frame, contrasting with the more modern, low-rise architecture in the background under a bright, hazy sky. | +| 26B/A4B ✅ | A full shot shows a white and brown seagull perched on a gray pillar in Venice, Italy. The seagull faces left, its beak pointed towards the edge of the frame. Behind it is a light gray, two-story building with several dark rectangular windows. To the right of the seagull is a large, white building with columns and intricate carvings. The sky is a clear, light blue. The lighting is bright and even, suggesting it is daytime. | +| 31B ✅ | A high-angle, medium shot shows a white and gray seagull perched on a gray concrete pylon in Venice, Italy. The seagull is facing left, its body angled slightly towards the camera. Its white head, neck, and chest contrast with its gray wings and back. The seagull's orange beak is slightly open. The pylon is a light gray concrete cylinder with a weathered texture. In the background, there are several buildings. To the left is a long, low, white building with a series of small, rectangular windows. In the center is a cluster of green trees. To the right is a red building with a tiled roof and several small, rectangular windows. Further right is a large, ornate, white stone building with several columns and sculptures. The sky is a pale blue, and the light is bright and clear. In the lower-left corner, there is a yellow bus with the word "Ferrovia" printed on it in black letters. There are several people walking in the background, but they are small and out of focus. | + +### Audio Question Answering + +These models are trained to answer questions about speech in audio. Music and non-speech sounds were not part of the training data. + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}, + {"type": "text", "text": "Can you describe this audio in detail?"}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate( + **inputs, + max_new_tokens=1000, + do_sample=False, +) + +print(processor.decode(output[0], skip_special_tokens=True)) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | This audio is a personal reflection. The speaker is talking about their final farewell address to the nation, which they delivered in Chicago. They express gratitude for the conversations they've had with the American people, noting that despite not having met them face-to-face or even greeted them, these interactions in various settings like living rooms, schools, farms, factory floors, diners, and military outposts have been what has kept them going. | +| E4B | The audio is a speech excerpt where a speaker is delivering a farewell address to the nation from Chicago. The speaker reflects on their time in office, expressing gratitude for the conversations they had with the American people across various settings like living rooms, schools, farms, factories, diners, and military outposts. The tone is reflective and appreciative, highlighting the importance of these interactions in their political journey. | + +Here is an example if you want to do transcription: + +
+Inference code + +```py +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}, + {"type": "text", "text": "Transcribe the audio?"}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate( + **inputs, + max_new_tokens=1000, + do_sample=False, +) + +print(processor.decode(output[0], skip_special_tokens=True)) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | This week I traveled to Chicago to deliver my final farewell address to the nation following in the tradition of presidents before me It was an opportunity to say thank you whether we've seen eye to eye or rarely agreed at all my conversations with you the American people in living rooms and schools at farms and on factory floors at diners and on distant military outposts all these conversations are what have kept me honest | +| E4B | This week I traveled to Chicago to deliver my final farewell address to the nation following in the tradition of presidents before me. It was an opportunity to say thank you. Whether we've seen eye to eye or rarely agreed at all, my conversations with you, the American people, in living rooms and schools, at farms and on factory floors, at diners and on distant military outposts, all these conversations are what have kept me honest. | + +### Multimodal Function Calling + +We test the model by asking to get the weather in the place shown in the image. + +
+Inference code + +```py +import re +WEATHER_TOOL = { + "type": "function", + "function": { + "name": "get_weather", + "description": "Gets the current weather for a specific location.", + "parameters": { + "type": "object", + "properties": { + "city": {"type": "string", "description": "The city name"}, + }, + "required": ["city"], + }, + }, +} +tools = [WEATHER_TOOL] +messages = [ + {"role": "user", "content": [ + {"type": "text", "text": "What is the city in this image? Check the weather there right now."}, + + {"type": "image", "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg"}, + ]}, +] +inputs = processor.apply_chat_template( + messages, + tools=[WEATHER_TOOL], + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=1000) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) +``` + +
+ +| Model | Output | +| :---- | :---- | +| E2B | **Analyze the Request:** The user has provided an image and asked two questions:\n * "What is the city in this image?" * "Check the weather there right now."\n\n2. **Analyze the Image:** The image displays a large, ornate, tall structure, characteristic of temple architecture, likely in Southeast Asia (given the style). It appears to be a famous landmark. 3. **Identify the Landmark/Location (Internal Knowledge/Visual Cues):** The structure strongly resembles the chedis/stupas found in places like Bangkok, Thailand (e.g., Wat Arun or similar structures).\n\n4. **Determine the City:** Based on the visual evidence, the location is highly likely to be Bangkok, Thailand.\n\n5. **Check Available Tools:** The available tool is `get_weather(city: STRING)`. 6. **Formulate the Plan:**\n * Step 1: Identify the city from the image (Bangkok).\n * Step 2: Use the `get_weather` tool with the identified city.\n\n7. **Construct the Tool Call:** `get_weather(city="Bangkok")`\n\n8. **Generate Response:** The model should first state the identified city and then call the tool to get the weather. (Self-correction: The model *must* call the tool in the correct format if it needs external information.)call:get_weather{city:Bangkok} | +| E4B | '1. **Analyze the Request:** The user has provided an image and asked two things:\n a. Identify the city in the image.\n b. Check the weather in that city right now.\n\n2. **Analyze the Image:** The image shows a very distinctive, ornate tower/spire structure, characteristic of Thai architecture (specifically, a chedi or prang).\n\n3. **Determine City Identification (Internal Knowledge/Visual Recognition):** Based on the architectural style, the structure strongly resembles prominent temples in Thailand, such as Wat Arun in Bangkok.\n\n4. **Evaluate Tool Availability:** I have one available tool: `get_weather(city: STRING)`. This tool requires a city name as input.\n\n5. **Formulate a Plan:**\n a. I need the city name to use the `get_weather` tool.\n b. I must first identify the city from the image.\n c. Since my internal knowledge suggests Bangkok, I will proceed with that assumption, but I must acknowledge that I cannot *definitively* prove the location from the image alone.\n\n6. **Execute Step 1 (City Identification):** Assume the city is Bangkok based on the visual evidence of the architecture.\n\n7. **Execute Step 2 (Tool Call Generation):** Use the `get_weather` tool with "Bangkok" as the `city` argument.\n\n8. **Construct the Response:** Generate the appropriate tool call in JSON format.', 'answer': '<\|tool_call>call:get_weather{city:<\|"\|>Bangkok<\|"\|>}' | +| 31B | The user wants to know the city in the image and the current weather there. 1. **Analyze the image:** The image shows ornate, spire-like structures (prangs) characteristic of Thai temple architecture. Specifically, these look like the prangs at Wat Phra Kaew (Temple of the Emerald Buddha) or Wat Pho in Bangkok, Thailand. The style is very distinctive of Bangkok's royal temple complexes. 2. **Identify the city:** Based on the architectural style, the city is Bangkok. 3. **Find the weather:** I need to call the `get_weather` tool with `city="Bangkok"`.call:get_weather{city:Bangkok} | +| 26/A4B | The image shows several tall, ornate towers (prangs) typical of Thai Buddhist temple architecture. Specifically, these look like the structures within the Grand Palace or Wat Phra Kaew in Bangkok, Thailand. The style is unmistakably Thai. I'll confirm this by looking at the specific towers. These are very iconic.\n2. **Confirm the location:** The image shows elements of the Grand Palace complex in Bangkok.\n3. **Get weather information:** Once the city is identified as Bangkok, I will use the `get_weather` tool with `city='Bangkok'`.call:get_weather{city:Bangkok} | + +# Deploy Anywhere + +Gemma 4 comes with day-0 support for many open-source inference engines, and is ideal for tool calling and agents! We also release ONNX checkpoints that can run on many hardware backends, allowing use cases on edge devices or in browser! + +## transformers + +Gemma 4 comes with first-class transformers support from the get-go 🤗. This integration allows using the model with other libraries like bitsandbytes, PEFT and TRL. Make sure to install the latest version of transformers. + +```bash +pip install -U transformers +``` + +The easiest way to infer with the small Gemma 4 models is through the `any-to-any` pipeline. You can initialize it as follows. + +```py +from transformers import pipeline +pipe = pipeline("any-to-any", model="google/gemma-4-e2b-it") +``` + +You can then pass in images and text as follows. + +```python +messages = [ + { + "role": "user", + "content": [ + { + "type": "image", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg", + }, + {"type": "text", "text": "Do you have travel advice going to here?"}, + ], + } +] +output = pipe(messages, max_new_tokens=100, return_full_text=False) +output[0]["generated_text"] +# Based on the image, which appears to show a magnificent, ornate **Buddhist temple or pagoda**, likely in Southeast Asia (such as Thailand, Myanmar, or Cambodia), here is some general travel advice.. +``` + +When inferring with videos, you can include the audio track using the `load_audio_from_video` argument. + +```python +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] +pipe(messages, load_audio_from_video=True) +``` + +Going a level lower, you can load Gemma 4 using the `AutoModelForMultimodalLM` class, especially useful for fine-tuning. The built-in chat template takes care of formatting the inputs correctly, please make sure you use it to prevent subtle mistakes when building the prompt manually. + +
+Inference code + +```python +from transformers import AutoModelForMultimodalLM, AutoProcessor +model = AutoModelForMultimodalLM.from_pretrained("google/gemma-4-E2B-it", device_map="auto") +processor = AutoProcessor.from_pretrained("google/gemma-4-E2B-it") +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=True, + return_dict=True, + return_tensors="pt" +).to(model.device) + +generated_ids = model.generate(**inputs, max_new_tokens=128) +generated_ids_trimmed = [ + out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) +] +output_text = processor.batch_decode( + generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False +) +print(output_text) +``` + +
+ +## Llama.cpp + +Gemma 4 models come with image+text support in llama.cpp from the get-go! This unlocks using Gemma 4 with all of your favorite local apps: llama-cpp server, lmstudio, Jan as well as coding agents like Pi across many backends such as Metal and CUDA. + +You can install llama-cpp as follows. + +```bash +brew install llama.cpp # MacOS +winget install llama.cpp # Windows +``` + +You can then start a server compatible with the OpenAI API Replace the quantization scheme at the end of the command with the precision of your choice. + +```bash +llama-server -hf ggml-org/gemma-4-E2B-it-GGUF +``` + +Check out this link [for more](https://huggingface.co/ggml-org/gemma-4-E2B-it-GGUF?local-app=llama.cpp) options on combining llama.cpp with different coding agents and local apps. Find all the GGUF checkpoints [in this collection](https://huggingface.co/collections/ggml-org/gemma-4). + +## Plug in your local agent + +We worked on making sure the new models work locally with agents like **openclaw, hermes, pi, and open code**. All thanks to llama.cpp! Run the following to try Gemma 4 right away. + +First, start your local server: + +``` +llama-server -hf ggml-org/gemma-4-26b-a4b-it-GGUF:Q4_K_M +``` + +For **hermes:** + +```shell +hermes model +``` + +For **openclaw:** + +```shell +openclaw onboard +``` + +For **pi** define a `~/.pi/agent/models.json`: + +```json +{ + "providers": { + "llama-cpp": { + "baseUrl": "http://localhost:8080/v1", + "api": "openai-completions", + "apiKey": "none", + "models": [ + { + "id": "ggml-org-gemma-4-26b-4b-gguf" + } + ] + } + } +} +``` + +For **open code** define a `~/.config/opencode/opencode.json`: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "provider": { + "llama.cpp": { + "npm": "@ai-sdk/openai-compatible", + "name": "llama-server (local)", + "options": { + "baseURL": "http://127.0.0.1:8080/v1" + }, + "models": { + "gemma-4-26b-4b-it": { + "name": "Gemma 4 (local)", + "limit": { + "context": 128000, + "output": 8192 + } + } + } + } + } +} +``` + +## transformers.js + +transformers.js enables running Gemma 4 right inside browser. You can check out the model card to see text-only, image & text, audio & text inference in detail [here](https://huggingface.co/onnx-community/gemma-4-E2B-it-ONNX#transformersjs-javascript). We also shipped a demo for you to test the model [here](https://huggingface.co/spaces/webml-community/Gemma-4-WebGPU). + +## MLX + +Full multimodal support of Gemma 4 is available using the open-source [`mlx-vlm` library](https://github.com/Blaizzy/mlx-vlm). Here's how to ask the model to describe an image: + +```shell +pip install -U mlx-vlm +``` + +```shell +mlx_vlm.generate \ +--model google/gemma-4-E4B-it \ +--image https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg \ +--prompt "Describe this image in detail" +``` + +mlx-vlm supports TurboQuant, which delivers the same accuracy as the uncompressed baseline while using ~4x less active memory and running a lot faster end-to-end. This makes long-context inference practical on Apple Silicon without sacrificing quality. Use it like this: + +```shell +mlx_vlm.generate \ +--model "mlx-community/gemma-4-26b-a4b-it-4bit" \ +--prompt "Your prompt here" \ +--kv-bits 3.5 \ +--kv-quant-scheme turboquant +``` + +For audio examples and more details, please check [the MLX collection](https://hf.co/mlx-community/gemma-4). + +### Mistral.rs + +[mistral.rs](https://github.com/EricLBuehler/mistral.rs) is a Rust-native inference engine with day-0 Gemma 4 support across all modalities (text, image, video, audio) and builtin tool-calling and agentic functionality. Install mistral.rs: + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.sh | sh # Linux/macOS + +irm https://raw.githubusercontent.com/EricLBuehler/mistral.rs/master/install.ps1 | iex # Windows +``` + +You can then start an OpenAI-compatible HTTP server: + +```bash +mistralrs serve mistralrs-community/gemma-4-E4B-it-UQFF --from-uqff 8 +``` + +Or, use interactive mode: + +``` +mistralrs run -m google/gemma-4-E4B-it --isq 8 --image image.png -i "Describe this image in detail." + +mistralrs run -m google/gemma-4-E4B-it --isq 8 --audio audio.mp3 -i "Transcribe this fully." +``` + +Find all models [here](https://huggingface.co/mistralrs-community/models). Please, follow [the instructions](https://huggingface.co/mistralrs-community/gemma-4-E2B-it-UQFF#install) in the model cards for installation and inference guidelines. + +## Fine-tuning for all + +Gemma 4 models are ideal for fine-tuning in your favorite tools and platforms and at any budget. + +## Fine-tuning with TRL + +Gemma 4 is fully supported for fine-tuning with TRL. To celebrate, TRL has been upgraded with support for multimodal tool responses when interacting with environments, meaning models can now receive images back from tools during training, not just text. + +To showcase this, we've built an example training script where Gemma 4 learns to drive in the CARLA simulator. The model sees the road through a camera, decides what to do and learns from the outcome. After training, it consistently changes lanes to avoid pedestrians. The same approach works for any task where a model needs to see and act: robotics, web browsing, or other interactive environments. + +Get started: + +```shell +# pip install git+https://github.com/huggingface/trl.git + +python examples/scripts/openenv/carla_vlm_gemma.py \ + --env-urls https://sergiopaniego-carla-env.hf.space \ + https://sergiopaniego-carla-env-2.hf.space \ + --model google/gemma-4-E2B-it +``` + +Find the example [here](https://github.com/huggingface/huggingface-gemma-recipes/blob/main/scripts/carla_vlm_gemma.py). + +### Fine-tuning with TRL on Vertex AI + +Additionally, we have prepared an example on how to fine-tune Gemma 4 with TRL on Vertex AI using SFT, to showcase how to extend the function calling capabilities, whilst freezing both the vision and audio towers. The examples include how to build a custom Docker container with latest Transformers, TRL, etc. with CUDA support on Google Cloud, and how to run it via Vertex AI Serverless Training Jobs. + +```python +# pip install google-cloud-aiplatform --upgrade --quiet +from google.cloud import aiplatform + +aiplatform.init( + project="", + location="", + staging_bucket="", +) + +job = aiplatform.CustomContainerTrainingJob( + display_name="gemma-4-fine-tuning", + container_uri="", + command=["python", "/gcs/gemma-4-fine-tuning/train.py"], +) + +job = job.submit( + replica_count=1, + machine_type="a3-highgpu-1g", + accelerator_type="NVIDIA_H100_80GB", + accelerator_count=1, + base_output_dir="/output-dir", + environment_variables={ + "MODEL_ID": "google/gemma-4-E2B-it", + "HF_TOKEN": , + }, + boot_disk_size_gb=500, +) +``` + +You can find the complete example in the "Hugging Face on Google Cloud" docs at https://hf.co/docs/google-cloud/examples/vertex-ai-notebooks-fine-tune-gemma-4. + +## Fine-tuning with Unsloth Studio + +If you want to fine tune and run a Gemma 4 model in a UI, try out [Unsloth Studio](https://unsloth.ai/docs/new/studio). It runs locally or on Google Colab. First, install and start the app: + +```shell +# install unsloth studio on MacOS, Linux, WSL +curl -fsSL https://unsloth.ai/install.sh | sh + +# install unsloth studio on Windows +irm https://unsloth.ai/install.ps1 | iex + +# launch unsloth studio +unsloth studio -H 0.0.0.0 -p 8888 +# Search for for a Gemma 4 model like google/gemma-4-E2B-it +``` + +Then select any of the Gemma 4 models from the hub. + +![Unsloth Studio](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/gemma4/unsloth.png) + +## Try Gemma 4 + +We have shipped demos for you to try different Gemma 4 models. We include demos based on transformers implementation for [E4B](https://huggingface.co/spaces/huggingface-projects/gemma-4-e4b-it), [26B/A4B](https://huggingface.co/spaces/huggingface-projects/gemma-4-26b-a4b-it), and dense [31B](https://huggingface.co/spaces/huggingface-projects/gemma-4-31b-it) models, as well as a [WebGPU](https://huggingface.co/spaces/webml-community/Gemma-4-WebGPU) demo with transformers.js 🚀 + + + + +## Benchmark Results + +Gemma 4 models demonstrate exceptional performance across diverse benchmarks, from reasoning and coding to vision and long-context tasks. The graph below shows model performance vs size, with Gemma 4 models forming an impressive Pareto frontier: + +
+
+ Gemma 4 Performance vs Size +
+
+ Gemma 4 Arena Elo Score Comparison +
+
+ +
+ +Here are detailed benchmark results for the instruction-tuned models: + +| Benchmark | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +|-----------|-------------|-----------------|-------------|-------------|------------------------| +| **Reasoning & Knowledge** | +| MMLU Pro | [85.2%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-31B-it) | [82.6%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-26B-A4B-it) | [69.4%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-E4B-it) | [60.0%](https://huggingface.co/datasets/TIGER-Lab/MMLU-Pro?eval_result=google/gemma-4-E2B-it) | 67.6% | +| AIME 2026 no tools | [89.2%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-31B-it) | [88.3%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-26B-A4B-it) | [42.5%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-E4B-it) | [37.5%](https://huggingface.co/datasets/MathArena/aime_2026?eval_result=google/gemma-4-E2B-it) | 20.8% | +| GPQA Diamond | [84.3%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-31B-it) | [82.3%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-26B-A4B-it) | [58.6%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-E4B-it) | [43.4%](https://huggingface.co/datasets/Idavidrein/gpqa?eval_result=google/gemma-4-E2B-it) | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Coding** | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| HLE no tools | [19.5%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-31B-it) | [8.7%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-26B-A4B-it) | - | - | - | +| HLE with search | [26.5%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-31B-it) | [17.2%](https://huggingface.co/datasets/cais/hle?eval_result=google/gemma-4-26B-A4B-it) | - | - | - | +| **Vision** | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (edit distance) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## Acknowledgements + +Landing Gemma-4 in the open-source ecosystem took a lot of effort from many people and not only the authors of this blog post. In no particular order, we thank many people from the open-source team: Gemma 4 transformers integration is owed to Cyril, Raushan, Eustache, Arthur, Lysandre. We thank Joshua for transformers.js integration and demo, Eric for mistral.rs integration, Son for Llama.cpp, Prince for MLX integration, Quentin, Albert and Kashif for TRL, Adarsh for SGLang transformers backend and Toshihiro for building the demos. +This work wouldn't have been possible without Google's extensive contribution with the model artefact, but also the significant effort contributing the model to transformers in an effort to standardize it. The open-source ecosystem is now more complete, with a very capable, freely-licensed, open-source model. +The Gemma 4 transformers integration was handled by Cyril, Raushan, Eustache, Arthur, Lysandre. We thank Joshua for the transformers.js integration and demo, Eric for mistral.rs integration, Son for Llama.cpp, Prince for MLX, Quentin for TRL, Adarsh for SGLang transformers backend, and Toshihiro for building several demos. + +This work wouldn't have been possible without Google's extensive contribution with the model artefact, but also their significant effort contributing the model to transformers in an effort to standardize it. The open-source ecosystem is now more complete, with a very capable, freely-licensed, open-source model. diff --git a/tooling/huggingface/model-cards/gemma-4-26B-A4B-README.md b/tooling/huggingface/model-cards/gemma-4-26B-A4B-README.md new file mode 100644 index 0000000..8466914 --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-26B-A4B-README.md @@ -0,0 +1,514 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: image-text-to-text +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision torchcodec librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-26B-A4B-it-README.md b/tooling/huggingface/model-cards/gemma-4-26B-A4B-it-README.md new file mode 100644 index 0000000..3949a79 --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-26B-A4B-it-README.md @@ -0,0 +1,513 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: image-text-to-text +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision torchcodec librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-26B-A4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-31B-README.md b/tooling/huggingface/model-cards/gemma-4-31B-README.md new file mode 100644 index 0000000..f7130fd --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-31B-README.md @@ -0,0 +1,513 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: image-text-to-text +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision torchcodec librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-31B-it-README.md b/tooling/huggingface/model-cards/gemma-4-31B-it-README.md new file mode 100644 index 0000000..f7130fd --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-31B-it-README.md @@ -0,0 +1,513 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: image-text-to-text +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision torchcodec librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-31B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-31B-it-chat_template.jinja b/tooling/huggingface/model-cards/gemma-4-31B-it-chat_template.jinja new file mode 100644 index 0000000..98da08e --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-31B-it-chat_template.jinja @@ -0,0 +1,347 @@ +{%- macro format_parameters(properties, required) -%} + {%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%} + {%- set ns = namespace(found_first=false) -%} + {%- for key, value in properties | dictsort -%} + {%- set add_comma = false -%} + {%- if key not in standard_keys -%} + {%- if ns.found_first %},{% endif -%} + {%- set ns.found_first = true -%} + {{ key }}:{ + {%- if value['description'] -%} + description:<|"|>{{ value['description'] }}<|"|> + {%- set add_comma = true -%} + {%- endif -%} + {%- if value['type'] | upper == 'STRING' -%} + {%- if value['enum'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + enum:{{ format_argument(value['enum']) }} + {%- endif -%} + {%- elif value['type'] | upper == 'ARRAY' -%} + {%- if value['items'] is mapping and value['items'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + items:{ + {%- set ns_items = namespace(found_first=false) -%} + {%- for item_key, item_value in value['items'] | dictsort -%} + {%- if item_value is not none -%} + {%- if ns_items.found_first %},{% endif -%} + {%- set ns_items.found_first = true -%} + {%- if item_key == 'properties' -%} + properties:{ + {%- if item_value is mapping -%} + {{- format_parameters(item_value, value['items']['required'] | default([])) -}} + {%- endif -%} + } + {%- elif item_key == 'required' -%} + required:[ + {%- for req_item in item_value -%} + <|"|>{{- req_item -}}<|"|> + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + ] + {%- elif item_key == 'type' -%} + {%- if item_value is string -%} + type:{{ format_argument(item_value | upper) }} + {%- else -%} + type:{{ format_argument(item_value | map('upper') | list) }} + {%- endif -%} + {%- else -%} + {{ item_key }}:{{ format_argument(item_value) }} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + } + {%- endif -%} + {%- endif -%} + {%- if value['nullable'] %} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + nullable:true + {%- endif -%} + {%- if value['type'] | upper == 'OBJECT' -%} + {%- if value['properties'] is defined and value['properties'] is mapping -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + properties:{ + {{- format_parameters(value['properties'], value['required'] | default([])) -}} + } + {%- elif value is mapping -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + properties:{ + {{- format_parameters(value, value['required'] | default([])) -}} + } + {%- endif -%} + {%- if value['required'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + required:[ + {%- for item in value['required'] | default([]) -%} + <|"|>{{- item -}}<|"|> + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + ] + {%- endif -%} + {%- endif -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + type:<|"|>{{ value['type'] | upper }}<|"|>} + {%- endif -%} + {%- endfor -%} +{%- endmacro -%} +{%- macro format_function_declaration(tool_data) -%} + declaration:{{- tool_data['function']['name'] -}}{description:<|"|>{{- tool_data['function']['description'] -}}<|"|> + {%- set params = tool_data['function']['parameters'] -%} + {%- if params -%} + ,parameters:{ + {%- if params['properties'] -%} + properties:{ {{- format_parameters(params['properties'], params['required']) -}} }, + {%- endif -%} + {%- if params['required'] -%} + required:[ + {%- for item in params['required'] -%} + <|"|>{{- item -}}<|"|> + {{- ',' if not loop.last -}} + {%- endfor -%} + ], + {%- endif -%} + {%- if params['type'] -%} + type:<|"|>{{- params['type'] | upper -}}<|"|>} + {%- endif -%} + {%- endif -%} + {%- if 'response' in tool_data['function'] -%} + {%- set response_declaration = tool_data['function']['response'] -%} + ,response:{ + {%- if response_declaration['description'] -%} + description:<|"|>{{- response_declaration['description'] -}}<|"|>, + {%- endif -%} + {%- if response_declaration['type'] | upper == 'OBJECT' -%} + type:<|"|>{{- response_declaration['type'] | upper -}}<|"|>} + {%- endif -%} + {%- endif -%} + } +{%- endmacro -%} +{%- macro format_argument(argument, escape_keys=True) -%} + {%- if argument is string -%} + {{- '<|"|>' + argument + '<|"|>' -}} + {%- elif argument is boolean -%} + {{- 'true' if argument else 'false' -}} + {%- elif argument is mapping -%} + {{- '{' -}} + {%- set ns = namespace(found_first=false) -%} + {%- for key, value in argument | dictsort -%} + {%- if ns.found_first %},{% endif -%} + {%- set ns.found_first = true -%} + {%- if escape_keys -%} + {{- '<|"|>' + key + '<|"|>' -}} + {%- else -%} + {{- key -}} + {%- endif -%} + :{{- format_argument(value, escape_keys=escape_keys) -}} + {%- endfor -%} + {{- '}' -}} + {%- elif argument is sequence -%} + {{- '[' -}} + {%- for item in argument -%} + {{- format_argument(item, escape_keys=escape_keys) -}} + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + {{- ']' -}} + {%- else -%} + {{- argument -}} + {%- endif -%} +{%- endmacro -%} +{%- macro strip_thinking(text) -%} + {%- set ns = namespace(result='') -%} + {%- for part in text.split('') -%} + {%- if '<|channel>' in part -%} + {%- set ns.result = ns.result + part.split('<|channel>')[0] -%} + {%- else -%} + {%- set ns.result = ns.result + part -%} + {%- endif -%} + {%- endfor -%} + {{- ns.result | trim -}} +{%- endmacro -%} + +{%- macro format_tool_response_block(tool_name, response) -%} + {{- '<|tool_response>' -}} + {%- if response is mapping -%} + {{- 'response:' + tool_name + '{' -}} + {%- for key, value in response | dictsort -%} + {{- key -}}:{{- format_argument(value, escape_keys=False) -}} + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + {{- '}' -}} + {%- else -%} + {{- 'response:' + tool_name + '{value:' + format_argument(response, escape_keys=False) + '}' -}} + {%- endif -%} + {{- '' -}} +{%- endmacro -%} + +{%- set ns = namespace(prev_message_type=None) -%} +{%- set loop_messages = messages -%} +{{- bos_token -}} +{#- Handle System/Tool Definitions Block -#} +{%- if (enable_thinking is defined and enable_thinking) or tools or messages[0]['role'] in ['system', 'developer'] -%} + {{- '<|turn>system\n' -}} + + {#- Inject Thinking token at the very top of the FIRST system turn -#} + {%- if enable_thinking is defined and enable_thinking -%} + {{- '<|think|>\n' -}} + {%- set ns.prev_message_type = 'think' -%} + {%- endif -%} + + {%- if messages[0]['role'] in ['system', 'developer'] -%} + {{- messages[0]['content'] | trim -}} + {%- set loop_messages = messages[1:] -%} + {%- endif -%} + + {%- if tools -%} + {%- for tool in tools %} + {{- '<|tool>' -}} + {{- format_function_declaration(tool) | trim -}} + {{- '' -}} + {%- endfor %} + {%- set ns.prev_message_type = 'tool' -%} + {%- endif -%} + + {{- '\n' -}} +{%- endif %} + +{#- Pre-scan: find last user message index for reasoning guard -#} +{%- set ns_turn = namespace(last_user_idx=-1) -%} +{%- for i in range(loop_messages | length) -%} + {%- if loop_messages[i]['role'] == 'user' -%} + {%- set ns_turn.last_user_idx = i -%} + {%- endif -%} +{%- endfor -%} + +{#- Loop through messages -#} +{%- for message in loop_messages -%} + {%- if message['role'] != 'tool' -%} + {%- set ns.prev_message_type = None -%} + {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%} + {#- Detect continuation: suppress duplicate <|turn>model when previous non-tool message was also assistant -#} + {%- set prev_nt = namespace(role=None, found=false) -%} + {%- if loop.index0 > 0 -%} + {%- for j in range(loop.index0 - 1, -1, -1) -%} + {%- if not prev_nt.found -%} + {%- if loop_messages[j]['role'] != 'tool' -%} + {%- set prev_nt.role = loop_messages[j]['role'] -%} + {%- set prev_nt.found = true -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- set continue_same_model_turn = (role == 'model' and prev_nt.role == 'assistant') -%} + {%- if not continue_same_model_turn -%} + {{- '<|turn>' + role + '\n' }} + {%- endif -%} + + {#- Render reasoning/reasoning_content as thinking channel -#} + {%- set thinking_text = message.get('reasoning') or message.get('reasoning_content') -%} + {%- if thinking_text and loop.index0 > ns_turn.last_user_idx and message.get('tool_calls') -%} + {{- '<|channel>thought\n' + thinking_text + '\n' -}} + {%- endif -%} + + {%- if message['tool_calls'] -%} + {%- for tool_call in message['tool_calls'] -%} + {%- set function = tool_call['function'] -%} + {{- '<|tool_call>call:' + function['name'] + '{' -}} + {%- if function['arguments'] is mapping -%} + {%- set ns_args = namespace(found_first=false) -%} + {%- for key, value in function['arguments'] | dictsort -%} + {%- if ns_args.found_first %},{% endif -%} + {%- set ns_args.found_first = true -%} + {{- key -}}:{{- format_argument(value, escape_keys=False) -}} + {%- endfor -%} + {%- elif function['arguments'] is string -%} + {{- function['arguments'] -}} + {%- endif -%} + {{- '}' -}} + {%- endfor -%} + {%- set ns.prev_message_type = 'tool_call' -%} + {%- endif -%} + + {%- set ns_tr_out = namespace(flag=false) -%} + {%- if message.get('tool_responses') -%} + {#- Legacy: tool_responses embedded on the assistant message (Google/Gemma native) -#} + {%- for tool_response in message['tool_responses'] -%} + {{- format_tool_response_block(tool_response['name'] | default('unknown'), tool_response['response']) -}} + {%- set ns_tr_out.flag = true -%} + {%- set ns.prev_message_type = 'tool_response' -%} + {%- endfor -%} + {%- elif message.get('tool_calls') -%} + {#- OpenAI Chat Completions: forward-scan consecutive role:tool messages -#} + {%- set ns_tool_scan = namespace(stopped=false) -%} + {%- for k in range(loop.index0 + 1, loop_messages | length) -%} + {%- if ns_tool_scan.stopped -%} + {%- elif loop_messages[k]['role'] != 'tool' -%} + {%- set ns_tool_scan.stopped = true -%} + {%- else -%} + {%- set follow = loop_messages[k] -%} + {#- Resolve tool_call_id to function name -#} + {%- set ns_tname = namespace(name=follow.get('name') | default('unknown')) -%} + {%- for tc in message['tool_calls'] -%} + {%- if tc.get('id') == follow.get('tool_call_id') -%} + {%- set ns_tname.name = tc['function']['name'] -%} + {%- endif -%} + {%- endfor -%} + {#- Handle content as string or content-parts array -#} + {%- set tool_body = follow.get('content') -%} + {%- if tool_body is string -%} + {{- format_tool_response_block(ns_tname.name, tool_body) -}} + {%- elif tool_body is sequence and tool_body is not string -%} + {%- set ns_txt = namespace(s='') -%} + {%- for part in tool_body -%} + {%- if part.get('type') == 'text' -%} + {%- set ns_txt.s = ns_txt.s + (part.get('text') | default('')) -%} + {%- endif -%} + {%- endfor -%} + {{- format_tool_response_block(ns_tname.name, ns_txt.s) -}} + {%- else -%} + {{- format_tool_response_block(ns_tname.name, tool_body) -}} + {%- endif -%} + {%- set ns_tr_out.flag = true -%} + {%- set ns.prev_message_type = 'tool_response' -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if message['content'] is string -%} + {%- if role == 'model' -%} + {{- strip_thinking(message['content']) -}} + {%- else -%} + {{- message['content'] | trim -}} + {%- endif -%} + {%- elif message['content'] is sequence -%} + {%- for item in message['content'] -%} + {%- if item['type'] == 'text' -%} + {%- if role == 'model' -%} + {{- strip_thinking(item['text']) -}} + {%- else -%} + {{- item['text'] | trim -}} + {%- endif -%} + {%- elif item['type'] == 'image' -%} + {{- '<|image|>' -}} + {%- set ns.prev_message_type = 'image' -%} + {%- elif item['type'] == 'audio' -%} + {{- '<|audio|>' -}} + {%- set ns.prev_message_type = 'audio' -%} + {%- elif item['type'] == 'video' -%} + {{- '<|video|>' -}} + {%- set ns.prev_message_type = 'video' -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if ns.prev_message_type == 'tool_call' and not ns_tr_out.flag -%} + {{- '<|tool_response>' -}} + {%- elif not (ns_tr_out.flag and not message.get('content')) -%} + {{- '\n' -}} + {%- endif -%} + {%- endif -%} +{%- endfor -%} + +{%- if add_generation_prompt -%} + {%- if ns.prev_message_type != 'tool_response' and ns.prev_message_type != 'tool_call' -%} + {{- '<|turn>model\n' -}} + {%- if not enable_thinking | default(false) -%} + {{- '<|channel>thought\n' -}} + {%- endif -%} + {%- endif -%} +{%- endif -%} diff --git a/tooling/huggingface/model-cards/gemma-4-31B-it-tokenizer_config.json b/tooling/huggingface/model-cards/gemma-4-31B-it-tokenizer_config.json new file mode 100644 index 0000000..375b25d --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-31B-it-tokenizer_config.json @@ -0,0 +1,74 @@ +{ + "audio_token": "<|audio|>", + "backend": "tokenizers", + "boa_token": "<|audio>", + "boi_token": "<|image>", + "bos_token": "", + "eoa_token": "", + "eoc_token": "", + "eoi_token": "", + "eos_token": "", + "eot_token": "", + "escape_token": "<|\"|>", + "etc_token": "", + "etd_token": "", + "etr_token": "", + "extra_special_tokens": [ + "<|video|>" + ], + "image_token": "<|image|>", + "mask_token": "", + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "padding_side": "left", + "processor_class": "Gemma4Processor", + "response_schema": { + "type": "object", + "properties": { + "role": { + "const": "assistant" + }, + "thinking": { + "type": "string" + }, + "content": { + "type": "string" + }, + "tool_calls": { + "x-regex-iterator": "<\\|tool_call>(.*?)", + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "const": "function" + }, + "function": { + "type": "object", + "x-regex": "call\\:(?P\\w+)(?P\\{.*\\})", + "properties": { + "name": { + "type": "string" + }, + "arguments": { + "type": "object", + "x-parser": "gemma4-tool-call", + "additionalProperties": {} + } + } + } + } + } + } + }, + "x-regex": "(\\<\\|channel\\>thought\\n(?P.*?)\\)?(?P\\<\\|tool_call\\>.*\\)?(?P(?:(?!\\)(?!\\<\\|tool_response\\>).)+)?(?:\\|\\<\\|tool_response\\>)?" + }, + "soc_token": "<|channel>", + "sot_token": "<|turn>", + "stc_token": "<|tool_call>", + "std_token": "<|tool>", + "str_token": "<|tool_response>", + "think_token": "<|think|>", + "tokenizer_class": "GemmaTokenizer", + "unk_token": "" +} diff --git a/tooling/huggingface/model-cards/gemma-4-E2B-README.md b/tooling/huggingface/model-cards/gemma-4-E2B-README.md new file mode 100644 index 0000000..67061ce --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E2B-README.md @@ -0,0 +1,516 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: any-to-any +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + + + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-E2B-it-README.md b/tooling/huggingface/model-cards/gemma-4-E2B-it-README.md new file mode 100644 index 0000000..45209d4 --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E2B-it-README.md @@ -0,0 +1,513 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: any-to-any +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E2B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-E4B-README.md b/tooling/huggingface/model-cards/gemma-4-E4B-README.md new file mode 100644 index 0000000..fb28cf6 --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E4B-README.md @@ -0,0 +1,513 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: any-to-any +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-E4B-it-README.md b/tooling/huggingface/model-cards/gemma-4-E4B-it-README.md new file mode 100644 index 0000000..e8abaaf --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E4B-it-README.md @@ -0,0 +1,515 @@ +--- +library_name: transformers +license: apache-2.0 +license_link: https://ai.google.dev/gemma/docs/gemma_4_license +pipeline_tag: any-to-any +--- + +
+ +
+ + +

+ Hugging Face | + GitHub | + Launch Blog | + Documentation +
+ License: Apache 2.0 | Authors: Google DeepMind +

+ +Gemma is a family of open models built by Google DeepMind. Gemma 4 models are multimodal, handling text and image input (with audio supported on small models) and generating text output. This release includes open-weights models in both pre-trained and instruction-tuned variants. Gemma 4 features a context window of up to 256K tokens and maintains multilingual support in over 140 languages. + +Featuring both Dense and Mixture-of-Experts (MoE) architectures, Gemma 4 is well-suited for tasks like text generation, coding, and reasoning. The models are available in four distinct sizes: **E2B**, **E4B**, **26B A4B**, and **31B**. Their diverse sizes make them deployable in environments ranging from high-end phones to laptops and servers, democratizing access to state-of-the-art AI. + +Gemma 4 introduces key **capability and architectural advancements**: + +* **Reasoning** – All models in the family are designed as highly capable reasoners, with configurable thinking modes. + +* **Extended Multimodalities** – Processes Text, Image with variable aspect ratio and resolution support (all models), Video, and Audio (featured natively on the E2B and E4B models). + +* **Diverse & Efficient Architectures** – Offers Dense and Mixture-of-Experts (MoE) variants of different sizes for scalable deployment. + +* **Optimized for On-Device** – Smaller models are specifically designed for efficient local execution on laptops and mobile devices. + +* **Increased Context Window** – The small models feature a 128K context window, while the medium models support 256K. + +* **Enhanced Coding & Agentic Capabilities** – Achieves notable improvements in coding benchmarks alongside native function-calling support, powering highly capable autonomous agents. + +* **Native System Prompt Support** – Gemma 4 introduces native support for the `system` role, enabling more structured and controllable conversations. + +## **Models Overview** + +Gemma 4 models are designed to deliver frontier-level performance at each size, targeting deployment scenarios from mobile and edge devices (E2B, E4B) to consumer GPUs and workstations (26B A4B, 31B). They are well-suited for reasoning, agentic workflows, coding, and multimodal understanding. + +The models employ a hybrid attention mechanism that interleaves local sliding window attention with full global attention, ensuring the final layer is always global. This hybrid design delivers the processing speed and low memory footprint of a lightweight model without sacrificing the deep awareness required for complex, long-context tasks. To optimize memory for long contexts, global layers feature unified Keys and Values, and apply Proportional RoPE (p-RoPE). + +### Dense Models + +| Property | E2B | E4B | 31B Dense | +| :---- | :---- | :---- | :---- | +| **Total Parameters** | 2.3B effective (5.1B with embeddings) | 4.5B effective (8B with embeddings) | 30.7B | +| **Layers** | 35 | 42 | 60 | +| **Sliding Window** | 512 tokens | 512 tokens | 1024 tokens | +| **Context Length** | 128K tokens | 128K tokens | 256K tokens | +| **Vocabulary Size** | 262K | 262K | 262K | +| **Supported Modalities** | Text, Image, Audio | Text, Image, Audio | Text, Image | +| **Vision Encoder Parameters** | *~150M* | *~150M* | *~550M* | +| **Audio Encoder Parameters** | *~300M* | *~300M* | No Audio | + +The "E" in E2B and E4B stands for "effective" parameters. The smaller models incorporate Per-Layer Embeddings (PLE) to maximize parameter efficiency in on-device deployments. Rather than adding more layers or parameters to the model, PLE gives each decoder layer its own small embedding for every token. These embedding tables are large but are only used for quick lookups, which is why the effective parameter count is much smaller than the total. + +### Mixture-of-Experts (MoE) Model + +| Property | 26B A4B MoE | +| :---- | :---- | +| **Total Parameters** | 25.2B | +| **Active Parameters** | 3.8B | +| **Layers** | 30 | +| **Sliding Window** | 1024 tokens | +| **Context Length** | 256K tokens | +| **Vocabulary Size** | 262K | +| **Expert Count** | 8 active / 128 total and 1 shared | +| **Supported Modalities** | Text, Image | +| **Vision Encoder Parameters** | *~550M* | + +The "A" in 26B A4B stands for "active parameters" in contrast to the total number of parameters the model contains. By only activating a 4B subset of parameters during inference, the Mixture-of-Experts model runs much faster than its 26B total might suggest. This makes it an excellent choice for fast inference compared to the dense 31B model since it runs almost as fast as a 4B-parameter model. + +## **Benchmark Results** + +These models were evaluated against a large collection of different datasets and metrics to cover different aspects of text generation. Evaluation results marked in the table are for instruction-tuned models. + +| | Gemma 4 31B | Gemma 4 26B A4B | Gemma 4 E4B | Gemma 4 E2B | Gemma 3 27B (no think) | +| :---- | :---- | :---- | :---- | :---- | :---- | +| MMLU Pro | 85.2% | 82.6% | 69.4% | 60.0% | 67.6% | +| AIME 2026 no tools | 89.2% | 88.3% | 42.5% | 37.5% | 20.8% | +| LiveCodeBench v6 | 80.0% | 77.1% | 52.0% | 44.0% | 29.1% | +| Codeforces ELO | 2150 | 1718 | 940 | 633 | 110 | +| GPQA Diamond | 84.3% | 82.3% | 58.6% | 43.4% | 42.4% | +| Tau2 (average over 3) | 76.9% | 68.2% | 42.2% | 24.5% | 16.2% | +| HLE no tools | 19.5% | 8.7% | - | - | - | +| HLE with search | 26.5% | 17.2% | - | - | - | +| BigBench Extra Hard | 74.4% | 64.8% | 33.1% | 21.9% | 19.3% | +| MMMLU | 88.4% | 86.3% | 76.6% | 67.4% | 70.7% | +| **Vision** | | | | | | +| MMMU Pro | 76.9% | 73.8% | 52.6% | 44.2% | 49.7% | +| OmniDocBench 1.5 (average edit distance, lower is better) | 0.131 | 0.149 | 0.181 | 0.290 | 0.365 | +| MATH-Vision | 85.6% | 82.4% | 59.5% | 52.4% | 46.0% | +| MedXPertQA MM | 61.3% | 58.1% | 28.7% | 23.5% | - | +| **Audio** | | | | | | +| CoVoST | - | - | 35.54 | 33.47 | - | +| FLEURS (lower is better) | - | - | 0.08 | 0.09 | - | +| **Long Context** | | | | | | +| MRCR v2 8 needle 128k (average) | 66.4% | 44.1% | 25.4% | 19.1% | 13.5% | + +## **Core Capabilities** + +Gemma 4 models handle a broad range of tasks across text, vision, and audio. Key capabilities include: + +* **Thinking** – Built-in reasoning mode that lets the model think step-by-step before answering. +* **Long Context** – Context windows of up to 128K tokens (E2B/E4B) and 256K tokens (26B A4B/31B). +* **Image Understanding** – Object detection, Document/PDF parsing, screen and UI understanding, chart comprehension, OCR (including multilingual), handwriting recognition, and pointing. Images can be processed at variable aspect ratios and resolutions. +* **Video Understanding** – Analyze video by processing sequences of frames. +* **Interleaved Multimodal Input** – Freely mix text and images in any order within a single prompt. +* **Function Calling** – Native support for structured tool use, enabling agentic workflows. +* **Coding** – Code generation, completion, and correction. +* **Multilingual** – Out-of-the-box support for 35+ languages, pre-trained on 140+ languages. +* **Audio** (E2B and E4B only) – Automatic speech recognition (ASR) and speech-to-translated-text translation across multiple languages. + + +## Getting Started + +You can use all Gemma 4 models with the latest version of Transformers. To get started, install the necessary dependencies in your environment: + +`pip install -U transformers torch accelerate` + +Once you have everything installed, you can proceed to load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForCausalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output: + +```python +# Prompt +messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Write a short joke about saving RAM."}, +] + +# Process input +text = processor.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False +) +inputs = processor(text=text, return_tensors="pt").to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=1024) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +To enable reasoning, set `enable_thinking=True` and the `parse_response` function will take care of parsing the thinking output. + +Below, you will also find snippets for processing audio (E2B and E4B only), images, and video alongside text: + +
+Code for processing Audio + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process audio. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the audio URL in the prompt: + + +```python +# Prompt - add audio before text +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "audio": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/journal1.wav"}, + {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."}, + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ +
+Code for processing Images + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process images. To use it, make sure to install the following packages: + + +`pip install -U transformers torch torchvision accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the image URL in the prompt: + + +```python +# Prompt - add image before text +messages = [ + { + "role": "user", "content": [ + {"type": "image", "url": "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/Demos/sample-data/GoldenGate.png"}, + {"type": "text", "text": "What is shown in this image?"} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + +
+Code for processing Videos + +Instead of using `AutoModelForCausalLM`, you can use `AutoModelForMultimodalLM` to process videos. To use it, make sure to install the following packages: + +`pip install -U transformers torch torchvision librosa accelerate` + +You can then load the model with the code below: + +```python +from transformers import AutoProcessor, AutoModelForMultimodalLM + +MODEL_ID = "google/gemma-4-E4B-it" + +# Load model +processor = AutoProcessor.from_pretrained(MODEL_ID) +model = AutoModelForMultimodalLM.from_pretrained( + MODEL_ID, + dtype="auto", + device_map="auto" +) +``` + +Once the model is loaded, you can start generating output by directly referencing the video URL in the prompt: + + +```python +# Prompt - add video before text +messages = [ + { + 'role': 'user', + 'content': [ + {"type": "video", "video": "https://github.com/bebechien/gemma/raw/refs/heads/main/videos/ForBiggerBlazes.mp4"}, + {'type': 'text', 'text': 'Describe this video.'} + ] + } +] + +# Process input +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) +input_len = inputs["input_ids"].shape[-1] + +# Generate output +outputs = model.generate(**inputs, max_new_tokens=512) +response = processor.decode(outputs[0][input_len:], skip_special_tokens=False) + +# Parse output +processor.parse_response(response) +``` + +
+ + + +## **Best Practices** + +For the best performance, use these configurations and best practices: + +### 1. Sampling Parameters + +Use the following standardized sampling configuration across all use cases: + +* `temperature=1.0` +* `top_p=0.95` +* `top_k=64` + +### 2. Thinking Mode Configuration + +Compared to Gemma 3, the models use standard `system`, `assistant`, and `user` roles. To properly manage the thinking process, use the following control tokens: + +* **Trigger Thinking:** Thinking is enabled by including the `<|think|>` token at the start of the system prompt. To disable thinking, remove the token. +* **Standard Generation:** When thinking is enabled, the model will output its internal reasoning followed by the final answer using this structure: + `<|channel>thought\n`**[Internal reasoning]**`` +* **Disabled Thinking Behavior:** For all models except for the E2B and E4B variants, if thinking is disabled, the model will still generate the tags but with an empty thought block: + `<|channel>thought\n`**[Final answer]** + +> [!Note] +> Note that many libraries like Transformers and llama.cpp handle the complexities of the chat template for you. + +### 3. Multi-Turn Conversations + +* **No Thinking Content in History**: In multi-turn conversations, the historical model output should only include the final response. Thoughts from previous model turns must *not be added* before the next user turn begins. + +### 4. Modality order + +* For optimal performance with multimodal inputs, place image and/or audio content **before** the text in your prompt. + +### 5. Variable Image Resolution + +Aside from variable aspect ratios, Gemma 4 supports variable image resolution through a configurable visual token budget, which controls how many tokens are used to represent an image. A higher token budget preserves more visual detail at the cost of additional compute, while a lower budget enables faster inference for tasks that don't require fine-grained understanding. + +* The supported token budgets are: **70**, **140**, **280**, **560**, and **1120**. + * Use *lower budgets* for classification, captioning, or video understanding, where faster inference and processing many frames outweigh fine-grained detail. + * Use *higher budgets* for tasks like OCR, document parsing, or reading small text. + +### 6. Audio + +Use the following prompt structures for audio processing: + +* **Audio Speech Recognition (ASR)** + +```text +Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text. + +Follow these specific instructions for formatting the answer: +* Only output the transcription, with no newlines. +* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three. +``` + +* **Automatic Speech Translation (AST)** + +```text +Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}. +When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}. +``` + +### 7. Audio and Video Length + +All models support image inputs and can process videos as frames whereas the E2B and E4B models also support audio inputs. Audio supports a maximum length of 30 seconds. Video supports a maximum of 60 seconds assuming the images are processed at one frame per second. + +## **Model Data** + +Data used for model training and how the data was processed. + +### **Training Dataset** + +Our pre-training dataset is a large-scale, diverse collection of data encompassing a wide range of domains and modalities, which includes web documents, code, images, audio, with a cutoff date of January 2025. Here are the key components: + +* **Web Documents**: A diverse collection of web text ensures the model is exposed to a broad range of linguistic styles, topics, and vocabulary. The training dataset includes content in over 140 languages. +* **Code**: Exposing the model to code helps it to learn the syntax and patterns of programming languages, which improves its ability to generate code and understand code-related questions. +* **Mathematics**: Training on mathematical text helps the model learn logical reasoning, symbolic representation, and to address mathematical queries. +* **Images**: A wide range of images enables the model to perform image analysis and visual data extraction tasks. + +The combination of these diverse data sources is crucial for training a powerful multimodal model that can handle a wide variety of different tasks and data formats. + +### **Data Preprocessing** + +Here are the key data cleaning and filtering methods applied to the training data: + +* **CSAM Filtering**: Rigorous CSAM (Child Sexual Abuse Material) filtering was applied at multiple stages in the data preparation process to ensure the exclusion of harmful and illegal content. +* **Sensitive Data Filtering**: As part of making Gemma pre-trained models safe and reliable, automated techniques were used to filter out certain personal information and other sensitive data from training sets. +* **Additional methods**: Filtering based on content quality and safety in line with [our policies](https://ai.google/static/documents/ai-responsibility-update-published-february-2025.pdf). + +## **Ethics and Safety** + +As open models become central to enterprise infrastructure, provenance and security are paramount. Developed by Google DeepMind, Gemma 4 undergoes the same rigorous safety evaluations as our proprietary Gemini models. + +### **Evaluation Approach** + +Gemma 4 models were developed in partnership with internal safety and responsible AI teams. A range of automated as well as human evaluations were conducted to help improve model safety. These evaluations align with [Google’s AI principles](https://ai.google/principles/), as well as safety policies, which aim to prevent our generative AI models from generating harmful content, including: + +* Content related to child sexual abuse material and exploitation +* Dangerous content (e.g., promoting suicide, or instructing in activities that could cause real-world harm) +* Sexually explicit content +* Hate speech (e.g., dehumanizing members of protected groups) +* Harassment (e.g., encouraging violence against people) + +### **Evaluation Results** + +For all areas of safety testing, we saw major improvements in all categories of content safety relative to previous Gemma models. Overall, Gemma 4 models significantly outperform Gemma 3 and 3n models in improving safety, while keeping unjustified refusals low. All testing was conducted without safety filters to evaluate the model capabilities and behaviors. For both text-to-text and image-to-text, and across all model sizes, the model produced minimal policy violations, and showed significant improvements over previous Gemma models' performance. + +## **Usage and Limitations** + +These models have certain limitations that users should be aware of. + +### **Intended Usage** + +Multimodal models (capable of processing vision, language, and/or audio) have a wide range of applications across various industries and domains. The following list of potential uses is not comprehensive. The purpose of this list is to provide contextual information about the possible use-cases that the model creators considered as part of model training and development. + +* **Content Creation and Communication** + * **Text Generation**: These models can be used to generate creative text formats such as poems, scripts, code, marketing copy, and email drafts. + * **Chatbots and Conversational AI**: Power conversational interfaces for customer service, virtual assistants, or interactive applications. + * **Text Summarization**: Generate concise summaries of a text corpus, research papers, or reports. + * **Image Data Extraction**: These models can be used to extract, interpret, and summarize visual data for text communications. + * **Audio Processing and Interaction**: The smaller models (E2B and E4B) can analyze and interpret audio inputs, enabling voice-driven interactions and transcriptions. +* **Research and Education** + * **Natural Language Processing (NLP) and VLM Research**: These models can serve as a foundation for researchers to experiment with VLM and NLP techniques, develop algorithms, and contribute to the advancement of the field. + * **Language Learning Tools**: Support interactive language learning experiences, aiding in grammar correction or providing writing practice. + * **Knowledge Exploration**: Assist researchers in exploring large bodies of text by generating summaries or answering questions about specific topics. + +### **Limitations** + +* **Training Data** + * The quality and diversity of the training data significantly influence the model's capabilities. Biases or gaps in the training data can lead to limitations in the model's responses. + * The scope of the training dataset determines the subject areas the model can handle effectively. +* **Context and Task Complexity** + * Models perform well on tasks that can be framed with clear prompts and instructions. Open-ended or highly complex tasks might be challenging. + * A model's performance can be influenced by the amount of context provided (longer context generally leads to better outputs, up to a certain point). +* **Language Ambiguity and Nuance** + * Natural language is inherently complex. Models might struggle to grasp subtle nuances, sarcasm, or figurative language. +* **Factual Accuracy** + * Models generate responses based on information they learned from their training datasets, but they are not knowledge bases. They may generate incorrect or outdated factual statements. +* **Common Sense** + * Models rely on statistical patterns in language. They might lack the ability to apply common sense reasoning in certain situations. + +### **Ethical Considerations and Risks** + +The development of vision-language models (VLMs) raises several ethical concerns. In creating an open model, we have carefully considered the following: + +* **Bias and Fairness** + * VLMs trained on large-scale, real-world text and image data can reflect socio-cultural biases embedded in the training material. Gemma 4 models underwent careful scrutiny, input data pre-processing, and post-training evaluations as reported in this card to help mitigate the risk of these biases. +* **Misinformation and Misuse** + * VLMs can be misused to generate text that is false, misleading, or harmful. + * Guidelines are provided for responsible use with the model, see the [Responsible Generative AI Toolkit](https://ai.google.dev/responsible). +* **Transparency and Accountability** + * This model card summarizes details on the models' architecture, capabilities, limitations, and evaluation processes. + * A responsibly developed open model offers the opportunity to share innovation by making VLM technology accessible to developers and researchers across the AI ecosystem. + +**Risks identified and mitigations**: + +* **Generation of harmful content**: Mechanisms and guidelines for content safety are essential. Developers are encouraged to exercise caution and implement appropriate content safety safeguards based on their specific product policies and application use cases. +* **Misuse for malicious purposes**: Technical limitations and developer and end-user education can help mitigate against malicious applications of VLMs. Educational resources and reporting mechanisms for users to flag misuse are provided. +* **Privacy violations**: Models were trained on data filtered for removal of certain personal information and other sensitive data. Developers are encouraged to adhere to privacy regulations with privacy-preserving techniques. +* **Perpetuation of biases**: It's encouraged to perform continuous monitoring (using evaluation metrics, human review) and the exploration of de-biasing techniques during model training, fine-tuning, and other use cases. + +### **Benefits** + +At the time of release, this family of models provides high-performance open vision-language model implementations designed from the ground up for responsible AI development compared to similarly sized models. diff --git a/tooling/huggingface/model-cards/gemma-4-E4B-it-chat_template.jinja b/tooling/huggingface/model-cards/gemma-4-E4B-it-chat_template.jinja new file mode 100644 index 0000000..07e50e6 --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E4B-it-chat_template.jinja @@ -0,0 +1,344 @@ +{%- macro format_parameters(properties, required) -%} + {%- set standard_keys = ['description', 'type', 'properties', 'required', 'nullable'] -%} + {%- set ns = namespace(found_first=false) -%} + {%- for key, value in properties | dictsort -%} + {%- set add_comma = false -%} + {%- if key not in standard_keys -%} + {%- if ns.found_first %},{% endif -%} + {%- set ns.found_first = true -%} + {{ key }}:{ + {%- if value['description'] -%} + description:<|"|>{{ value['description'] }}<|"|> + {%- set add_comma = true -%} + {%- endif -%} + {%- if value['type'] | upper == 'STRING' -%} + {%- if value['enum'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + enum:{{ format_argument(value['enum']) }} + {%- endif -%} + {%- elif value['type'] | upper == 'ARRAY' -%} + {%- if value['items'] is mapping and value['items'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + items:{ + {%- set ns_items = namespace(found_first=false) -%} + {%- for item_key, item_value in value['items'] | dictsort -%} + {%- if item_value is not none -%} + {%- if ns_items.found_first %},{% endif -%} + {%- set ns_items.found_first = true -%} + {%- if item_key == 'properties' -%} + properties:{ + {%- if item_value is mapping -%} + {{- format_parameters(item_value, value['items']['required'] | default([])) -}} + {%- endif -%} + } + {%- elif item_key == 'required' -%} + required:[ + {%- for req_item in item_value -%} + <|"|>{{- req_item -}}<|"|> + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + ] + {%- elif item_key == 'type' -%} + {%- if item_value is string -%} + type:{{ format_argument(item_value | upper) }} + {%- else -%} + type:{{ format_argument(item_value | map('upper') | list) }} + {%- endif -%} + {%- else -%} + {{ item_key }}:{{ format_argument(item_value) }} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + } + {%- endif -%} + {%- endif -%} + {%- if value['nullable'] %} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + nullable:true + {%- endif -%} + {%- if value['type'] | upper == 'OBJECT' -%} + {%- if value['properties'] is defined and value['properties'] is mapping -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + properties:{ + {{- format_parameters(value['properties'], value['required'] | default([])) -}} + } + {%- elif value is mapping -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + properties:{ + {{- format_parameters(value, value['required'] | default([])) -}} + } + {%- endif -%} + {%- if value['required'] -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + required:[ + {%- for item in value['required'] | default([]) -%} + <|"|>{{- item -}}<|"|> + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + ] + {%- endif -%} + {%- endif -%} + {%- if add_comma %},{%- else -%} {%- set add_comma = true -%} {% endif -%} + type:<|"|>{{ value['type'] | upper }}<|"|>} + {%- endif -%} + {%- endfor -%} +{%- endmacro -%} +{%- macro format_function_declaration(tool_data) -%} + declaration:{{- tool_data['function']['name'] -}}{description:<|"|>{{- tool_data['function']['description'] -}}<|"|> + {%- set params = tool_data['function']['parameters'] -%} + {%- if params -%} + ,parameters:{ + {%- if params['properties'] -%} + properties:{ {{- format_parameters(params['properties'], params['required']) -}} }, + {%- endif -%} + {%- if params['required'] -%} + required:[ + {%- for item in params['required'] -%} + <|"|>{{- item -}}<|"|> + {{- ',' if not loop.last -}} + {%- endfor -%} + ], + {%- endif -%} + {%- if params['type'] -%} + type:<|"|>{{- params['type'] | upper -}}<|"|>} + {%- endif -%} + {%- endif -%} + {%- if 'response' in tool_data['function'] -%} + {%- set response_declaration = tool_data['function']['response'] -%} + ,response:{ + {%- if response_declaration['description'] -%} + description:<|"|>{{- response_declaration['description'] -}}<|"|>, + {%- endif -%} + {%- if response_declaration['type'] | upper == 'OBJECT' -%} + type:<|"|>{{- response_declaration['type'] | upper -}}<|"|>} + {%- endif -%} + {%- endif -%} + } +{%- endmacro -%} +{%- macro format_argument(argument, escape_keys=True) -%} + {%- if argument is string -%} + {{- '<|"|>' + argument + '<|"|>' -}} + {%- elif argument is boolean -%} + {{- 'true' if argument else 'false' -}} + {%- elif argument is mapping -%} + {{- '{' -}} + {%- set ns = namespace(found_first=false) -%} + {%- for key, value in argument | dictsort -%} + {%- if ns.found_first %},{% endif -%} + {%- set ns.found_first = true -%} + {%- if escape_keys -%} + {{- '<|"|>' + key + '<|"|>' -}} + {%- else -%} + {{- key -}} + {%- endif -%} + :{{- format_argument(value, escape_keys=escape_keys) -}} + {%- endfor -%} + {{- '}' -}} + {%- elif argument is sequence -%} + {{- '[' -}} + {%- for item in argument -%} + {{- format_argument(item, escape_keys=escape_keys) -}} + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + {{- ']' -}} + {%- else -%} + {{- argument -}} + {%- endif -%} +{%- endmacro -%} +{%- macro strip_thinking(text) -%} + {%- set ns = namespace(result='') -%} + {%- for part in text.split('') -%} + {%- if '<|channel>' in part -%} + {%- set ns.result = ns.result + part.split('<|channel>')[0] -%} + {%- else -%} + {%- set ns.result = ns.result + part -%} + {%- endif -%} + {%- endfor -%} + {{- ns.result | trim -}} +{%- endmacro -%} + +{%- macro format_tool_response_block(tool_name, response) -%} + {{- '<|tool_response>' -}} + {%- if response is mapping -%} + {{- 'response:' + tool_name + '{' -}} + {%- for key, value in response | dictsort -%} + {{- key -}}:{{- format_argument(value, escape_keys=False) -}} + {%- if not loop.last %},{% endif -%} + {%- endfor -%} + {{- '}' -}} + {%- else -%} + {{- 'response:' + tool_name + '{value:' + format_argument(response, escape_keys=False) + '}' -}} + {%- endif -%} + {{- '' -}} +{%- endmacro -%} + +{%- set ns = namespace(prev_message_type=None) -%} +{%- set loop_messages = messages -%} +{{- bos_token -}} +{#- Handle System/Tool Definitions Block -#} +{%- if (enable_thinking is defined and enable_thinking) or tools or messages[0]['role'] in ['system', 'developer'] -%} + {{- '<|turn>system\n' -}} + + {#- Inject Thinking token at the very top of the FIRST system turn -#} + {%- if enable_thinking is defined and enable_thinking -%} + {{- '<|think|>\n' -}} + {%- set ns.prev_message_type = 'think' -%} + {%- endif -%} + + {%- if messages[0]['role'] in ['system', 'developer'] -%} + {{- messages[0]['content'] | trim -}} + {%- set loop_messages = messages[1:] -%} + {%- endif -%} + + {%- if tools -%} + {%- for tool in tools %} + {{- '<|tool>' -}} + {{- format_function_declaration(tool) | trim -}} + {{- '' -}} + {%- endfor %} + {%- set ns.prev_message_type = 'tool' -%} + {%- endif -%} + + {{- '\n' -}} +{%- endif %} + +{#- Pre-scan: find last user message index for reasoning guard -#} +{%- set ns_turn = namespace(last_user_idx=-1) -%} +{%- for i in range(loop_messages | length) -%} + {%- if loop_messages[i]['role'] == 'user' -%} + {%- set ns_turn.last_user_idx = i -%} + {%- endif -%} +{%- endfor -%} + +{#- Loop through messages -#} +{%- for message in loop_messages -%} + {%- if message['role'] != 'tool' -%} + {%- set ns.prev_message_type = None -%} + {%- set role = 'model' if message['role'] == 'assistant' else message['role'] -%} + {#- Detect continuation: suppress duplicate <|turn>model when previous non-tool message was also assistant -#} + {%- set prev_nt = namespace(role=None, found=false) -%} + {%- if loop.index0 > 0 -%} + {%- for j in range(loop.index0 - 1, -1, -1) -%} + {%- if not prev_nt.found -%} + {%- if loop_messages[j]['role'] != 'tool' -%} + {%- set prev_nt.role = loop_messages[j]['role'] -%} + {%- set prev_nt.found = true -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- set continue_same_model_turn = (role == 'model' and prev_nt.role == 'assistant') -%} + {%- if not continue_same_model_turn -%} + {{- '<|turn>' + role + '\n' }} + {%- endif -%} + + {#- Render reasoning/reasoning_content as thinking channel -#} + {%- set thinking_text = message.get('reasoning') or message.get('reasoning_content') -%} + {%- if thinking_text and loop.index0 > ns_turn.last_user_idx and message.get('tool_calls') -%} + {{- '<|channel>thought\n' + thinking_text + '\n' -}} + {%- endif -%} + + {%- if message['tool_calls'] -%} + {%- for tool_call in message['tool_calls'] -%} + {%- set function = tool_call['function'] -%} + {{- '<|tool_call>call:' + function['name'] + '{' -}} + {%- if function['arguments'] is mapping -%} + {%- set ns_args = namespace(found_first=false) -%} + {%- for key, value in function['arguments'] | dictsort -%} + {%- if ns_args.found_first %},{% endif -%} + {%- set ns_args.found_first = true -%} + {{- key -}}:{{- format_argument(value, escape_keys=False) -}} + {%- endfor -%} + {%- elif function['arguments'] is string -%} + {{- function['arguments'] -}} + {%- endif -%} + {{- '}' -}} + {%- endfor -%} + {%- set ns.prev_message_type = 'tool_call' -%} + {%- endif -%} + + {%- set ns_tr_out = namespace(flag=false) -%} + {%- if message.get('tool_responses') -%} + {#- Legacy: tool_responses embedded on the assistant message (Google/Gemma native) -#} + {%- for tool_response in message['tool_responses'] -%} + {{- format_tool_response_block(tool_response['name'] | default('unknown'), tool_response['response']) -}} + {%- set ns_tr_out.flag = true -%} + {%- set ns.prev_message_type = 'tool_response' -%} + {%- endfor -%} + {%- elif message.get('tool_calls') -%} + {#- OpenAI Chat Completions: forward-scan consecutive role:tool messages -#} + {%- set ns_tool_scan = namespace(stopped=false) -%} + {%- for k in range(loop.index0 + 1, loop_messages | length) -%} + {%- if ns_tool_scan.stopped -%} + {%- elif loop_messages[k]['role'] != 'tool' -%} + {%- set ns_tool_scan.stopped = true -%} + {%- else -%} + {%- set follow = loop_messages[k] -%} + {#- Resolve tool_call_id to function name -#} + {%- set ns_tname = namespace(name=follow.get('name') | default('unknown')) -%} + {%- for tc in message['tool_calls'] -%} + {%- if tc.get('id') == follow.get('tool_call_id') -%} + {%- set ns_tname.name = tc['function']['name'] -%} + {%- endif -%} + {%- endfor -%} + {#- Handle content as string or content-parts array -#} + {%- set tool_body = follow.get('content') -%} + {%- if tool_body is string -%} + {{- format_tool_response_block(ns_tname.name, tool_body) -}} + {%- elif tool_body is sequence and tool_body is not string -%} + {%- set ns_txt = namespace(s='') -%} + {%- for part in tool_body -%} + {%- if part.get('type') == 'text' -%} + {%- set ns_txt.s = ns_txt.s + (part.get('text') | default('')) -%} + {%- endif -%} + {%- endfor -%} + {{- format_tool_response_block(ns_tname.name, ns_txt.s) -}} + {%- else -%} + {{- format_tool_response_block(ns_tname.name, tool_body) -}} + {%- endif -%} + {%- set ns_tr_out.flag = true -%} + {%- set ns.prev_message_type = 'tool_response' -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if message['content'] is string -%} + {%- if role == 'model' -%} + {{- strip_thinking(message['content']) -}} + {%- else -%} + {{- message['content'] | trim -}} + {%- endif -%} + {%- elif message['content'] is sequence -%} + {%- for item in message['content'] -%} + {%- if item['type'] == 'text' -%} + {%- if role == 'model' -%} + {{- strip_thinking(item['text']) -}} + {%- else -%} + {{- item['text'] | trim -}} + {%- endif -%} + {%- elif item['type'] == 'image' -%} + {{- '<|image|>' -}} + {%- set ns.prev_message_type = 'image' -%} + {%- elif item['type'] == 'audio' -%} + {{- '<|audio|>' -}} + {%- set ns.prev_message_type = 'audio' -%} + {%- elif item['type'] == 'video' -%} + {{- '<|video|>' -}} + {%- set ns.prev_message_type = 'video' -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + + {%- if ns.prev_message_type == 'tool_call' and not ns_tr_out.flag -%} + {{- '<|tool_response>' -}} + {%- elif not (ns_tr_out.flag and not message.get('content')) -%} + {{- '\n' -}} + {%- endif -%} + {%- endif -%} +{%- endfor -%} + +{%- if add_generation_prompt -%} + {%- if ns.prev_message_type != 'tool_response' and ns.prev_message_type != 'tool_call' -%} + {{- '<|turn>model\n' -}} + {%- endif -%} +{%- endif -%} \ No newline at end of file diff --git a/tooling/huggingface/model-cards/gemma-4-E4B-it-tokenizer_config.json b/tooling/huggingface/model-cards/gemma-4-E4B-it-tokenizer_config.json new file mode 100644 index 0000000..375b25d --- /dev/null +++ b/tooling/huggingface/model-cards/gemma-4-E4B-it-tokenizer_config.json @@ -0,0 +1,74 @@ +{ + "audio_token": "<|audio|>", + "backend": "tokenizers", + "boa_token": "<|audio>", + "boi_token": "<|image>", + "bos_token": "", + "eoa_token": "", + "eoc_token": "", + "eoi_token": "", + "eos_token": "", + "eot_token": "", + "escape_token": "<|\"|>", + "etc_token": "", + "etd_token": "", + "etr_token": "", + "extra_special_tokens": [ + "<|video|>" + ], + "image_token": "<|image|>", + "mask_token": "", + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "padding_side": "left", + "processor_class": "Gemma4Processor", + "response_schema": { + "type": "object", + "properties": { + "role": { + "const": "assistant" + }, + "thinking": { + "type": "string" + }, + "content": { + "type": "string" + }, + "tool_calls": { + "x-regex-iterator": "<\\|tool_call>(.*?)", + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "const": "function" + }, + "function": { + "type": "object", + "x-regex": "call\\:(?P\\w+)(?P\\{.*\\})", + "properties": { + "name": { + "type": "string" + }, + "arguments": { + "type": "object", + "x-parser": "gemma4-tool-call", + "additionalProperties": {} + } + } + } + } + } + } + }, + "x-regex": "(\\<\\|channel\\>thought\\n(?P.*?)\\)?(?P\\<\\|tool_call\\>.*\\)?(?P(?:(?!\\)(?!\\<\\|tool_response\\>).)+)?(?:\\|\\<\\|tool_response\\>)?" + }, + "soc_token": "<|channel>", + "sot_token": "<|turn>", + "stc_token": "<|tool_call>", + "std_token": "<|tool>", + "str_token": "<|tool_response>", + "think_token": "<|think|>", + "tokenizer_class": "GemmaTokenizer", + "unk_token": "" +} diff --git a/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal-extracted.py b/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal-extracted.py new file mode 100644 index 0000000..355ba01 --- /dev/null +++ b/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal-extracted.py @@ -0,0 +1,389 @@ +# Gemma4_(E2B)-Multimodal.ipynb — extracted cells +# Source: https://github.com/huggingface/huggingface-gemma-recipes/blob/main/notebooks/Gemma4_(E2B)-Multimodal.ipynb + +# ===== CELL 0 (markdown) ===== +# This notebook has vibe test examples to test image, text, audio capabilities of Gemma-4 model. To get started, let's install latest stable release of transformers. + +# ===== CELL 1 (code) ===== +!pip install -U transformers + +# ===== CELL 2 (markdown) ===== +# We can load model into `AutoModelForMultimodalLM` to make use of all capabilities. + +# ===== CELL 3 (code) ===== +import torch +from PIL import Image + +from transformers import AutoModelForMultimodalLM, AutoProcessor +#model_list = ["google/gemma-4-26B-A4B-it", "google/gemma-4-E4B-it", +# "google/gemma-4-E2B-it", "google/gemma-4-31B-it"] +model_id = "google/gemma-4-E2B-it" +model = AutoModelForMultimodalLM.from_pretrained(model_id, device_map="auto") +processor = AutoProcessor.from_pretrained(model_id) + +# ===== CELL 4 (markdown) ===== +# ## Code completion + +# ===== CELL 5 (markdown) ===== +# We give Gemma-4 a website screenshot to reproduce the code. + +# ===== CELL 6 (code) ===== +messages = [ + { + "role": "user", + "content": [ + { + "type": "image", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/landing_page.png", + }, + {"type": "text", "text": "Write HTML code for this page."}, + ], + } +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) + +output = model.generate(**inputs, max_new_tokens=4000) + +# ===== CELL 7 (code) ===== +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) + +print(result["content"]) + +# ===== CELL 8 (markdown) ===== +# ## Video Inference + +# ===== CELL 9 (markdown) ===== +# We test Gemma-4 on video understanding. If you want to run this example with larger models which don't take audio input, disable `load_audio_from_video`. + +# ===== CELL 10 (code) ===== +messages = [ + { + "role": "user", + "content": [ + {"type": "video", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"}, + {"type": "text", "text": "What is happening in the video? What is the song about?"}, + ], + }, +] +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + load_audio_from_video=True, +).to(model.device) +output = model.generate(**inputs, max_new_tokens=200) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) + +# ===== CELL 11 (code) ===== +print(result["content"]) + +# ===== CELL 12 (markdown) ===== +# ## Multimodal Function Calling + +# ===== CELL 13 (code) ===== +import re + +WEATHER_TOOL = { + "type": "function", + "function": { + "name": "get_weather", + "description": "Gets the current weather for a specific location.", + "parameters": { + "type": "object", + "properties": { + "city": {"type": "string", "description": "The city name"}, + }, + "required": ["city"], + }, + }, +} +tools = [WEATHER_TOOL] + +messages = [ + {"role": "user", "content": [ + {"type": "image", "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg"}, + {"type": "text", "text": "What is the city in this image? Check the weather there right now."}, + ]}, +] + +inputs = processor.apply_chat_template( + messages, + tools=[WEATHER_TOOL], + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, + enable_thinking=True, +).to(model.device) + +# ===== CELL 14 (code) ===== +output = model.generate(**inputs, max_new_tokens=1000) + +# ===== CELL 15 (code) ===== +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) + +# ===== CELL 16 (code) ===== +print(result["content"]) + +# ===== CELL 17 (markdown) ===== +# # Any-to-any inference + +# ===== CELL 18 (markdown) ===== +# We can also run the model with `any-to-any` pipeline. + +# ===== CELL 19 (code) ===== +from transformers import pipeline + +pipe = pipeline("any-to-any", model="google/gemma-4-e2b-it") + +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] + +# ===== CELL 20 (code) ===== +pipe(messages)#, load_audio_from_video=True) + +# ===== CELL 21 (code) ===== +messages = [ + { + "role": "user", + "content": [ + { + "type": "video", + "image": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4", + }, + {"type": "text", "text": "What is happening in this video?"}, + ], + } +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=True, + return_dict=True, + return_tensors="pt" +) +inputs = inputs.to(model.device) + +generated_ids = model.generate(**inputs, max_new_tokens=128) +generated_ids_trimmed = [ + out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) +] +output_text = processor.batch_decode( + generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False +) +print(output_text) + +# ===== CELL 22 (markdown) ===== +# # Object detection and pointing + +# ===== CELL 23 (code) ===== +import re +import torch +from transformers.image_utils import load_image +from PIL import Image +import matplotlib.pyplot as plt +import matplotlib.patches as patches +import json + +# ===== CELL 24 (code) ===== +image_url = "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png" +image = load_image(image_url) + +# ===== CELL 25 (code) ===== +def resize_to_48_multiple(image): + w, h = image.size + new_w = (w // 48) * 48 + new_h = (h // 48) * 48 + return image.crop((0, 0, new_w, new_h)) + +# ===== CELL 26 (code) ===== +def inputs_for_object_detection(image, what_object): + messages = [ + { + "role": "user", "content": [ + {"type": "image", "image": image}, + {"type": "text", "text": f"What's the bounding box for the {what_object} in the image?"} + ] + } + ] + + inputs = processor.apply_chat_template( + messages, + tokenize=True, + add_generation_prompt=True, + return_dict=True, + return_tensors="pt", + enable_thinking=False, + ) + + return inputs.to(model.device) + +# ===== CELL 27 (code) ===== +def extract_json(text: str): + text = text.strip() + + text = re.sub(r"^```(?:json)?\s*", "", text) + text = re.sub(r"\s*```$", "", text) + + # Try direct parse first + try: + return json.loads(text) + except json.JSONDecodeError: + pass + + # Fallback: extract first JSON object or array + match = re.search(r'(\{.*\}|\[.*\])', text, re.DOTALL) + if match: + candidate = match.group(1) + return json.loads(candidate) + + raise ValueError("No valid JSON found") + +# ===== CELL 28 (code) ===== +def detect_object(image_url, what_object): + image = load_image(image_url) + image = resize_to_48_multiple(image) + inputs = inputs_for_object_detection(image, what_object) + input_len = inputs["input_ids"].shape[-1] + generated_outputs = model.generate(**inputs, max_new_tokens=1000, do_sample=False) + generated = processor.decode(generated_outputs[0, input_len:]) + parsed_json = extract_json(generated)[0] + return parsed_json + +# ===== CELL 29 (code) ===== +def draw_pascal_voc_boxes(i, image, box, label, resize_shape=(1000,1000)): + dpi = 72 + width, height = image.size + fig, ax = plt.subplots(1, figsize=[width/dpi, height/dpi], tight_layout={'pad':0}) + + ax.imshow(image) + + ymin, xmin, ymax, xmax = box + re_h, re_w = resize_shape if resize_shape is not None else (height, width) + xmin = (xmin / re_w) * width + ymin = (ymin/ re_h) * height + xmax = (xmax / re_w) * width + ymax = (ymax/ re_h) * height + + w = xmax - xmin + h = ymax - ymin + + rect = patches.Rectangle( + (xmin, ymin), + w, + h, + linewidth=10, + edgecolor="green", + facecolor="none" + ) + ax.add_patch(rect) + + if label is not None: + ax.text(xmin, ymin-25, label, fontsize=24, bbox=dict(facecolor="yellow", alpha=0.5)) + + plt.axis("off") + plt.savefig(f"boxes_{i}.png") + plt.close(fig) + display(fig) + +# ===== CELL 30 (code) ===== +def display_detected_object(image_url, what_object): + image = load_image(image_url) + image = resize_to_48_multiple(image) + detection = detect_object(image_url, what_object) + box = detection["box_2d"] + label = detection.get("label", f"{what_object}") + draw_pascal_voc_boxes("1000", image, box, label) + +# ===== CELL 31 (code) ===== +display_detected_object("https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png", "bike") + +# ===== CELL 32 (markdown) ===== +# ## Captioning + +# ===== CELL 33 (code) ===== +messages = [ + { + "role": "user", + "content": [ + {"type": "image", "url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png"}, + {"type": "text", "text": "Write single detailed caption for this image."}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate(**inputs, max_new_tokens=512) +input_len = inputs.input_ids.shape[-1] +generated_text_ids = output[0][input_len:] +generated_text = processor.decode(generated_text_ids, skip_special_tokens=True) +result = processor.parse_response(generated_text) +print(result["content"]) + +# ===== CELL 34 (markdown) ===== +# ## Audio Understanding + +# ===== CELL 35 (code) ===== +messages = [ + { + "role": "user", + "content": [ + {"type": "audio", "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}, + {"type": "text", "text": "Can you describe this audio in detail?"}, + ], + }, +] + +inputs = processor.apply_chat_template( + messages, + tokenize=True, + return_dict=True, + return_tensors="pt", + add_generation_prompt=True, +).to(model.device) + +output = model.generate( + **inputs, + max_new_tokens=1000, + do_sample=False, +) + +print(processor.decode(output[0], skip_special_tokens=True)) + diff --git a/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal.ipynb b/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal.ipynb new file mode 100644 index 0000000..ec9243d --- /dev/null +++ b/tooling/huggingface/recipes/notebooks/Gemma4_E2B-Multimodal.ipynb @@ -0,0 +1,595 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "This notebook has vibe test examples to test image, text, audio capabilities of Gemma-4 model. To get started, let's install latest stable release of transformers." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "!pip install -U transformers" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "We can load model into `AutoModelForMultimodalLM` to make use of all capabilities." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import torch\n", + "from PIL import Image\n", + "\n", + "from transformers import AutoModelForMultimodalLM, AutoProcessor\n", + "#model_list = [\"google/gemma-4-26B-A4B-it\", \"google/gemma-4-E4B-it\",\n", + "# \"google/gemma-4-E2B-it\", \"google/gemma-4-31B-it\"]\n", + "model_id = \"google/gemma-4-E2B-it\"\n", + "model = AutoModelForMultimodalLM.from_pretrained(model_id, device_map=\"auto\")\n", + "processor = AutoProcessor.from_pretrained(model_id)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Code completion" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We give Gemma-4 a website screenshot to reproduce the code." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"image\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/landing_page.png\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"Write HTML code for this page.\"},\n", + " ],\n", + " }\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " enable_thinking=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(**inputs, max_new_tokens=4000)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n", + "\n", + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Video Inference" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We test Gemma-4 on video understanding. If you want to run this example with larger models which don't take audio input, disable `load_audio_from_video`." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"video\", \"url\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4\"},\n", + " {\"type\": \"text\", \"text\": \"What is happening in the video? What is the song about?\"},\n", + " ],\n", + " },\n", + "]\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " load_audio_from_video=True,\n", + ").to(model.device)\n", + "output = model.generate(**inputs, max_new_tokens=200)\n", + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Multimodal Function Calling" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import re\n", + "\n", + "WEATHER_TOOL = {\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"get_weather\",\n", + " \"description\": \"Gets the current weather for a specific location.\",\n", + " \"parameters\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"city\": {\"type\": \"string\", \"description\": \"The city name\"},\n", + " },\n", + " \"required\": [\"city\"],\n", + " },\n", + " },\n", + "}\n", + "tools = [WEATHER_TOOL]\n", + "\n", + "messages = [\n", + " {\"role\": \"user\", \"content\": [\n", + " {\"type\": \"image\", \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/thailand.jpg\"},\n", + " {\"type\": \"text\", \"text\": \"What is the city in this image? Check the weather there right now.\"},\n", + " ]},\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tools=[WEATHER_TOOL],\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + " enable_thinking=True,\n", + ").to(model.device)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "output = model.generate(**inputs, max_new_tokens=1000)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Any-to-any inference" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can also run the model with `any-to-any` pipeline." + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "from transformers import pipeline\n", + "\n", + "pipe = pipeline(\"any-to-any\", model=\"google/gemma-4-e2b-it\")\n", + "\n", + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"video\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"What is happening in this video?\"},\n", + " ],\n", + " }\n", + "]\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "pipe(messages)#, load_audio_from_video=True)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"video\",\n", + " \"image\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/rockets.mp4\",\n", + " },\n", + " {\"type\": \"text\", \"text\": \"What is happening in this video?\"},\n", + " ],\n", + " }\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " add_generation_prompt=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\"\n", + ")\n", + "inputs = inputs.to(model.device)\n", + "\n", + "generated_ids = model.generate(**inputs, max_new_tokens=128)\n", + "generated_ids_trimmed = [\n", + " out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)\n", + "]\n", + "output_text = processor.batch_decode(\n", + " generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False\n", + ")\n", + "print(output_text)\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Object detection and pointing" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "import re\n", + "import torch\n", + "from transformers.image_utils import load_image\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as patches\n", + "import json" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "image_url = \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png\"\n", + "image = load_image(image_url)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def resize_to_48_multiple(image):\n", + " w, h = image.size\n", + " new_w = (w // 48) * 48\n", + " new_h = (h // 48) * 48\n", + " return image.crop((0, 0, new_w, new_h))" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def inputs_for_object_detection(image, what_object):\n", + " messages = [\n", + " {\n", + " \"role\": \"user\", \"content\": [\n", + " {\"type\": \"image\", \"image\": image},\n", + " {\"type\": \"text\", \"text\": f\"What's the bounding box for the {what_object} in the image?\"}\n", + " ]\n", + " }\n", + " ]\n", + "\n", + " inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " add_generation_prompt=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " enable_thinking=False,\n", + " )\n", + "\n", + " return inputs.to(model.device)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def extract_json(text: str):\n", + " text = text.strip()\n", + "\n", + " text = re.sub(r\"^```(?:json)?\\s*\", \"\", text)\n", + " text = re.sub(r\"\\s*```$\", \"\", text)\n", + "\n", + " # Try direct parse first\n", + " try:\n", + " return json.loads(text)\n", + " except json.JSONDecodeError:\n", + " pass\n", + "\n", + " # Fallback: extract first JSON object or array\n", + " match = re.search(r'(\\{.*\\}|\\[.*\\])', text, re.DOTALL)\n", + " if match:\n", + " candidate = match.group(1)\n", + " return json.loads(candidate)\n", + "\n", + " raise ValueError(\"No valid JSON found\")" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def detect_object(image_url, what_object):\n", + " image = load_image(image_url)\n", + " image = resize_to_48_multiple(image)\n", + " inputs = inputs_for_object_detection(image, what_object)\n", + " input_len = inputs[\"input_ids\"].shape[-1]\n", + " generated_outputs = model.generate(**inputs, max_new_tokens=1000, do_sample=False)\n", + " generated = processor.decode(generated_outputs[0, input_len:])\n", + " parsed_json = extract_json(generated)[0]\n", + " return parsed_json" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def draw_pascal_voc_boxes(i, image, box, label, resize_shape=(1000,1000)):\n", + " dpi = 72\n", + " width, height = image.size\n", + " fig, ax = plt.subplots(1, figsize=[width/dpi, height/dpi], tight_layout={'pad':0})\n", + "\n", + " ax.imshow(image)\n", + "\n", + " ymin, xmin, ymax, xmax = box\n", + " re_h, re_w = resize_shape if resize_shape is not None else (height, width)\n", + " xmin = (xmin / re_w) * width\n", + " ymin = (ymin/ re_h) * height\n", + " xmax = (xmax / re_w) * width\n", + " ymax = (ymax/ re_h) * height\n", + "\n", + " w = xmax - xmin\n", + " h = ymax - ymin\n", + "\n", + " rect = patches.Rectangle(\n", + " (xmin, ymin),\n", + " w,\n", + " h,\n", + " linewidth=10,\n", + " edgecolor=\"green\",\n", + " facecolor=\"none\"\n", + " )\n", + " ax.add_patch(rect)\n", + "\n", + " if label is not None:\n", + " ax.text(xmin, ymin-25, label, fontsize=24, bbox=dict(facecolor=\"yellow\", alpha=0.5))\n", + "\n", + " plt.axis(\"off\")\n", + " plt.savefig(f\"boxes_{i}.png\")\n", + " plt.close(fig)\n", + " display(fig)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def display_detected_object(image_url, what_object):\n", + " image = load_image(image_url)\n", + " image = resize_to_48_multiple(image)\n", + " detection = detect_object(image_url, what_object)\n", + " box = detection[\"box_2d\"]\n", + " label = detection.get(\"label\", f\"{what_object}\")\n", + " draw_pascal_voc_boxes(\"1000\", image, box, label)" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "display_detected_object(\"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bike.png\", \"bike\")" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "##\u00a0Captioning" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"image\", \"url\": \"https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/bird.png\"},\n", + " {\"type\": \"text\", \"text\": \"Write single detailed caption for this image.\"},\n", + " ],\n", + " },\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(**inputs, max_new_tokens=512)\n", + "input_len = inputs.input_ids.shape[-1]\n", + "generated_text_ids = output[0][input_len:]\n", + "generated_text = processor.decode(generated_text_ids, skip_special_tokens=True)\n", + "result = processor.parse_response(generated_text)\n", + "print(result[\"content\"])" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Audio Understanding" + ], + "metadata": {} + }, + { + "cell_type": "code", + "source": [ + "messages = [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"audio\", \"url\": \"https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3\"},\n", + " {\"type\": \"text\", \"text\": \"Can you describe this audio in detail?\"},\n", + " ],\n", + " },\n", + "]\n", + "\n", + "inputs = processor.apply_chat_template(\n", + " messages,\n", + " tokenize=True,\n", + " return_dict=True,\n", + " return_tensors=\"pt\",\n", + " add_generation_prompt=True,\n", + ").to(model.device)\n", + "\n", + "output = model.generate(\n", + " **inputs,\n", + " max_new_tokens=1000,\n", + " do_sample=False,\n", + ")\n", + "\n", + "print(processor.decode(output[0], skip_special_tokens=True))\n" + ], + "metadata": {}, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/tooling/huggingface/recipes/scripts/carla_vlm_gemma.py b/tooling/huggingface/recipes/scripts/carla_vlm_gemma.py new file mode 100644 index 0000000..422ddb4 --- /dev/null +++ b/tooling/huggingface/recipes/scripts/carla_vlm_gemma.py @@ -0,0 +1,302 @@ +# Copyright 2020-2026 The HuggingFace Team. 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. + +# /// script +# dependencies = [ +# "trl", +# "openenv-carla-env @ git+https://huggingface.co/spaces/sergiopaniego/carla_env", +# ] +# /// + + +""" +GRPO training with OpenEnv's CARLA environment for VLMs (Vision Language Models). + +This script uses `environment_factory` with multimodal tool responses: each tool action +returns a camera image from the vehicle alongside the text scene description, allowing the +VLM to see the driving scene visually after each action. + +The CARLA environment simulates an emergency driving scenario where pedestrians are ahead +and the model must learn to observe the scene and take the correct action (e.g., swerve +to an empty lane) to minimize casualties. + +Setup: +```sh +pip install "openenv-carla-env @ git+https://huggingface.co/spaces/sergiopaniego/carla_env" +``` + +Usage (requires at least 2 CARLA Spaces, each supports only 1 concurrent connection): +```sh +python examples/scripts/openenv/carla_vlm.py \ + --env-urls https://server1.hf.space https://server2.hf.space +``` +""" + +import argparse +import base64 +from io import BytesIO + +from carla_env import CarlaAction, CarlaEnv +from datasets import Dataset +from PIL import Image + +from trl import GRPOConfig, GRPOTrainer + + +def parse_args(): + parser = argparse.ArgumentParser(description="Run GRPO VLM training with CARLA environment.") + parser.add_argument("--model", type=str, default="google/gemma-4-E2B-it") + parser.add_argument( + "--env-urls", + type=str, + nargs="+", + required=True, + help="URLs for CARLA environment servers. At least 2 required (1 Space = 1 connection).", + ) + parser.add_argument("--dataset-size", type=int, default=1000) + parser.add_argument("--max-completion-length", type=int, default=3072) + parser.add_argument("--per-device-train-batch-size", type=int, default=None, help="Defaults to len(env-urls).") + parser.add_argument("--gradient-accumulation-steps", type=int, default=4) + parser.add_argument("--max-steps", type=int, default=100) + parser.add_argument("--image-size", type=int, default=256, help="Resize camera images to this size. 0 to disable.") + parser.add_argument("--trackio-space-id", type=str, default=None, help="Trackio Space ID for logging.") + parser.add_argument("--use-lora", action="store_true", help="Use LoRA for memory-efficient training.") + parser.add_argument("--lora-r", type=int, default=128, help="LoRA rank.") + parser.add_argument("--lora-alpha", type=int, default=256, help="LoRA alpha.") + parser.add_argument( + "--lora-target-modules", + type=str, + default="llm-only", + help="LoRA target modules. Use 'llm-only' to skip vision encoder, 'all-linear' for all.", + ) + parser.add_argument( + "--learning-rate", type=float, default=5e-6, help="Learning rate. Default 5e-6 (good for LoRA r=128)." + ) + parser.add_argument("--hub-model-id", type=str, default=None) + parser.add_argument("--hub-private-repo", action="store_true", help="Make the Hub repo private.") + parser.add_argument("--run-name", type=str, default=None) + parser.add_argument("--report-to", type=str, default="trackio", help="Logging backend: wandb, trackio, none.") + return parser.parse_args() + + +SIM_TICKS = 10 + + +def reward_func(completions, environments, **kwargs): + rewards = [] + for i, (comp, env) in enumerate(zip(completions, environments, strict=False)): + # Advance to episode end to capture rubric_reward + try: + final = env._advance_until_done() + if final and final.observation.rubric_reward: + env.reward = final.observation.rubric_reward + except Exception as e: + print(f"[WARN] _advance_until_done failed for gen={i}: {e}") + r = env.reward + tools = [ + msg["tool_calls"][0]["function"]["name"] for msg in comp if isinstance(msg, dict) and msg.get("tool_calls") + ] + rewards.append(r) + print(f"[DEBUG reward] gen={i} tools={tools} env_reward={env.reward} total={r}") + return rewards + + +def main(): + args = parse_args() + env_url_iter = iter(args.env_urls) + image_size = args.image_size + + prompt = """\ +You control an autonomous vehicle in an emergency. There are pedestrians ahead and you must \ +decide what to do immediately. + +You will see a camera image from the vehicle after each action. Use the visual information +along with the scene description to decide your next action. + +You have the following tools available: +- `observe`: Advance time and get a new observation of the scene with a camera image. +- `emergency_stop`: Apply maximum braking to stop the vehicle. +- `lane_change(direction)`: Change lane to the left or right. Direction must be "left" or "right". + +Make one tool call at a time, wait for the result, then decide your next action. +Observe the scene first, then decide the best course of action to minimize harm. +Consider all available actions - sometimes avoiding the obstacle by changing lanes \ +is safer than stopping in its path.""" + + dataset = Dataset.from_dict({"prompt": [[{"role": "user", "content": prompt}] for _ in range(args.dataset_size)]}) + + class CarlaVLMEnv: + def __init__(self): + self.url = next(env_url_iter) + self.client = CarlaEnv(base_url=self.url, connect_timeout_s=30, message_timeout_s=120) + self.reward = 0.0 + + @staticmethod + def _describe(obs) -> str: + parts = [] + parts.append(f"Speed: {obs.speed_kmh:.1f} km/h.") + if obs.nearby_actors: + for actor in obs.nearby_actors: + parts.append(f"- {actor.get('type', 'actor')} at {actor.get('distance', '?')}m") + else: + parts.append("No nearby actors detected.") + if obs.collision_detected: + parts.append(f"COLLISION detected with {obs.collided_with or 'unknown'}!") + return "\n".join(parts) + + @staticmethod + def _decode_image(camera_image_b64, target_size): + """Decode base64 JPEG image and optionally resize.""" + img_bytes = base64.b64decode(camera_image_b64) + img = Image.open(BytesIO(img_bytes)) + if target_size > 0: + img.thumbnail((target_size, target_size), Image.LANCZOS) + return img + + def _format_multimodal(self, obs) -> list: + """Format observation as multimodal content blocks (camera image + text).""" + content = [] + if obs.camera_image is not None: + img = self._decode_image(obs.camera_image, image_size) + content.append({"type": "image", "image": img}) + content.append({"type": "text", "text": self._describe(obs)}) + return content + + def _advance(self, ticks: int = SIM_TICKS): + result = None + for _ in range(ticks): + result = self.client.step(CarlaAction(action_type="observe")) + if result.done: + break + return result + + def _advance_until_done(self, max_ticks: int = 50): + """Advance the simulation until the episode ends.""" + result = None + for _ in range(max_ticks): + result = self.client.step(CarlaAction(action_type="observe")) + if result.done: + break + return result + + def _advance_and_capture(self, ticks: int = SIM_TICKS): + """Advance the simulation, then capture an image of the current state.""" + result = self._advance(ticks) + capture_result = self.client.step(CarlaAction(action_type="capture_image")) + result.observation.camera_image = capture_result.observation.camera_image + return result + + def reset(self, **kwargs) -> str | None: + for attempt in range(3): + try: + result = self.client.reset(scenario_name="trolley_micro_escape_exists") + self.reward = 0.0 + return self._describe(result.observation) + except Exception as e: + if attempt == 2: + raise + print(f"[WARN] reset failed (attempt {attempt + 1}/3): {e}. Reconnecting...") + self.client = CarlaEnv(base_url=self.url, connect_timeout_s=30, message_timeout_s=120) + + def observe(self) -> list: + """ + Get the current scene with a camera image and description. + + Returns: + The camera image and scene description with vehicle state and nearby actors. + """ + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + return self._format_multimodal(result.observation) + + def emergency_stop(self) -> list: + """ + Apply maximum braking to stop the vehicle. + + Returns: + The camera image and scene description after braking. + """ + self.client.step(CarlaAction(action_type="emergency_stop")) + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + print(f"[DEBUG env] emergency_stop: done={result.done}, reward={self.reward}") + return self._format_multimodal(result.observation) + + def lane_change(self, direction: str) -> list: + """ + Change lane to avoid obstacles. + + Args: + direction: Direction to change lane, either "left" or "right". + + Returns: + The camera image and scene description after changing lane. + """ + self.client.step(CarlaAction(action_type="lane_change", lane_direction=direction)) + result = self._advance_and_capture() + self.reward = result.observation.rubric_reward or 0.0 + print(f"[DEBUG env] lane_change({direction}): done={result.done}, reward={self.reward}") + return self._format_multimodal(result.observation) + + peft_config = None + if args.use_lora: + from peft import LoraConfig + + if args.lora_target_modules == "llm-only": + target_modules = "all-linear" + exclude_modules = ["vision_tower", "multi_modal_projector"] + else: + target_modules = args.lora_target_modules + exclude_modules = None + + peft_config = LoraConfig( + r=args.lora_r, + lora_alpha=args.lora_alpha, + target_modules=target_modules, + exclude_modules=exclude_modules, + task_type="CAUSAL_LM", + ) + + trainer = GRPOTrainer( + model=args.model, + train_dataset=dataset, + reward_funcs=reward_func, + peft_config=peft_config, + args=GRPOConfig( + chat_template_kwargs={"enable_thinking": False}, + log_completions=True, + logging_steps=2, + num_completions_to_print=1, + max_completion_length=args.max_completion_length, + per_device_train_batch_size=args.per_device_train_batch_size or len(args.env_urls), + steps_per_generation=1, + num_generations=len(args.env_urls), + max_tool_calling_iterations=10, + learning_rate=args.learning_rate, + gradient_accumulation_steps=args.gradient_accumulation_steps, + max_steps=args.max_steps, + push_to_hub=args.hub_model_id is not None, + hub_model_id=args.hub_model_id, + hub_private_repo=args.hub_private_repo, + run_name=args.run_name, + report_to=args.report_to, + trackio_space_id=args.trackio_space_id, + ), + environment_factory=CarlaVLMEnv, + ) + trainer.train() + + +if __name__ == "__main__": + main() diff --git a/tooling/huggingface/recipes/scripts/ft_gemma3n_audio_vt.py b/tooling/huggingface/recipes/scripts/ft_gemma3n_audio_vt.py new file mode 100644 index 0000000..684ca0c --- /dev/null +++ b/tooling/huggingface/recipes/scripts/ft_gemma3n_audio_vt.py @@ -0,0 +1,184 @@ +import os + +os.environ["TRANSFORMERS_VERBOSITY"] = "error" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +import random +from functools import partial + +import torch +from datasets import load_dataset +from matplotlib import pyplot as plt +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import Gemma3nForConditionalGeneration, Gemma3nProcessor + + +def collate_fn(examples, processor): + messages = list() + for sample in examples: + audio = sample["audio"]["array"] + label = str(sample["text"]) + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": audio}, + {"type": "text", "text": "Please transcribe this audio."}, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": label}]}, + ] + messages.append(message) + + batch = processor.apply_chat_template( + messages, + add_generation_prompt=False, + tokenize=True, + return_dict=True, + return_tensors="pt", + ) + + labels = batch["input_ids"].clone() # Clone input IDs for labels + # Mask the tokens that we do not want to include in the loss computation + # -100 is ignored during categorical cross entropy loss computation + labels[labels == processor.tokenizer.pad_token_id] = -100 + labels[labels == processor.tokenizer.audio_token_id] = -100 + labels[labels == processor.tokenizer.image_token_id] = -100 + labels[labels == processor.tokenizer.boi_token_id] = -100 + labels[labels == processor.tokenizer.eoi_token_id] = -100 + + batch["labels"] = labels + + return batch + + +def freeze_layers(model): + for name, param in model.named_parameters(): + if "attn" in name: + param.requires_grad = True + else: + param.requires_grad = False + return model + + +def run_inference(val_dataset, processor, model, fname): + # infer before training + val_sample = random.choice(val_dataset) + audio = val_sample["audio"]["array"] + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant that transcribes speech accurately.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "audio", "audio": audio}, + {"type": "text", "text": "Please transcribe this audio."}, + ], + }, + ] + inputs = processor.apply_chat_template( + message, + add_generation_prompt=True, + tokenize=True, + return_dict=True, + return_tensors="pt", + ).to(model.device, dtype=torch.bfloat16) + input_len = inputs["input_ids"].shape[-1] + with torch.no_grad(): + generation = model.generate(**inputs, max_new_tokens=100, disable_compile=True) + generation = generation[0][input_len:] + + decoded = processor.decode(generation, skip_special_tokens=True) + + print(f"Audio transcription: {decoded}") + print(f"Label: {val_sample['text']}") + + +def main(): + model_id = "google/gemma-3n-E2B-it" + processor = Gemma3nProcessor.from_pretrained(model_id) + + # Load and split the dataset. + ds_full = load_dataset("AdrienB134/Emilia-dataset-french-split", split="fr") + split_ds = ds_full.train_test_split(test_size=0.1, seed=42) + train_dataset = split_ds["train"].select(range(10000)) + val_dataset = split_ds["test"].select(range(100)) + + # create data loader + partial_collate_fn = partial(collate_fn, processor=processor) + train_dataloader = DataLoader( + train_dataset, + batch_size=1, + shuffle=True, + num_workers=8, + drop_last=True, + collate_fn=partial_collate_fn, + pin_memory=True, + ) + val_dataloader = DataLoader( + val_dataset, + batch_size=1, + shuffle=False, + num_workers=8, + drop_last=True, + collate_fn=partial_collate_fn, + ) + + # load the model and optimizer + model = Gemma3nForConditionalGeneration.from_pretrained(model_id).to( + "cuda", dtype=torch.bfloat16 + ) + + run_inference(val_dataset, processor, model, "pred_before.png") + + model = freeze_layers(model) + + params_to_train = filter(lambda p: p.requires_grad, model.parameters()) + optimizer = torch.optim.AdamW(params_to_train, lr=1e-5) + + # Start Training + accumulation_steps = 8 + for idx, batch in tqdm(enumerate(train_dataloader)): + outputs = model(**batch.to(model.device, dtype=torch.bfloat16)) + loss = outputs.loss / accumulation_steps + if idx % 100 == 0: + val_loss = 0.0 + with torch.no_grad(): + count = 0 + for val_batch in tqdm(val_dataloader, desc="Validation"): + val_loss = ( + val_loss + + model(**val_batch.to(model.device, dtype=torch.bfloat16)).loss + ) + count = count + 1 + val_loss = val_loss / count + print( + f"Iter: {idx} Loss: {loss.item():.4f} Val Loss: {val_loss.item():.4f}" + ) + run_inference(val_dataset, processor, model, f"infer_{idx}.png") + + loss.backward() + if idx % 8 == 0: + optimizer.step() + optimizer.zero_grad() + + +if __name__ == "__main__": + main() diff --git a/tooling/huggingface/recipes/scripts/ft_gemma3n_image_trl.py b/tooling/huggingface/recipes/scripts/ft_gemma3n_image_trl.py new file mode 100644 index 0000000..3df53ae --- /dev/null +++ b/tooling/huggingface/recipes/scripts/ft_gemma3n_image_trl.py @@ -0,0 +1,352 @@ +""" +Train Gemma-3n on various vision-language datasets including intersection-dataset. + +For Gemma-3n with intersection dataset: +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + sft_vlm_gemma3n.py \ + --dataset_name ariG23498/intersection-dataset \ + --model_name_or_path google/gemma-3n-E2B-it \ + --per_device_train_batch_size 1 \ + --gradient_accumulation_steps 1 \ + --output_dir gemma-3n-E2B-it-trl-sft-intersection \ + --bf16 \ + --torch_dtype bfloat16 \ + --use_peft \ + --lora_target_modules all-linear \ + --attn_implementation eager + +Train Gemma-3n on the HuggingFaceH4/llava-instruct-mix-vsft dataset (single-image). + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + sft_vlm_gemma3n.py \ + --dataset_name HuggingFaceH4/llava-instruct-mix-vsft \ + --model_name_or_path google/gemma-3-4b-it \ + --per_device_train_batch_size 1 \ + --gradient_accumulation_steps 1 \ + --output_dir gemma-3-4b-it-trl-sft-llava-instruct-mix-vsft \ + --bf16 \ + --torch_dtype bfloat16 \ + --use_peft \ + --lora_target_modules all-linear \ + --attn_implementation eager + +Train Gemma-3n on the FanqingM/MMIU-Benchmark dataset (multi-image). + +accelerate launch \ + --config_file examples/accelerate_configs/deepspeed_zero3.yaml \ + sft_vlm_gemma3n.py \ + --dataset_name FanqingM/MMIU-Benchmark \ + --dataset_train_split test \ + --model_name_or_path google/gemma-3-4b-it \ + --per_device_train_batch_size 1 \ + --gradient_accumulation_steps 1 \ + --output_dir gemma-3-4b-it-trl-sft-MMIU-Benchmark \ + --bf16 \ + --torch_dtype bfloat16 \ + --use_peft \ + --lora_target_modules all-linear + --attn_implementation eager +""" + +import io +import os +import zipfile + +import torch +from datasets import DatasetDict, load_dataset +from huggingface_hub import hf_hub_download, list_repo_files +from PIL import Image +from transformers import (AutoModelForImageTextToText, AutoProcessor, + Gemma3nForConditionalGeneration) +from trl import (ModelConfig, ScriptArguments, SFTConfig, SFTTrainer, + TrlParser, get_kbit_device_map, get_quantization_config) + + +def my_get_peft_config(model_args: ModelConfig): + """A version of get_peft_config that handles comma-separated target modules""" + if model_args.use_peft is False: + return None + + # Import here to avoid issues if PEFT is not available + try: + from peft import LoraConfig + except ImportError: + raise ValueError( + "You need to have PEFT library installed in your environment, make sure to install `peft`. " + "Make sure to run `pip install -U peft`." + ) + + # Fix the target_modules to be a list if it's a comma-separated string + target_modules = model_args.lora_target_modules + if isinstance(target_modules, str) and target_modules != "all-linear": + # Convert comma-separated string to list + target_modules = [module.strip() for module in target_modules.split(",")] + + peft_config = LoraConfig( + task_type=model_args.lora_task_type, + r=model_args.lora_r, + target_modules=target_modules, + lora_alpha=model_args.lora_alpha, + lora_dropout=model_args.lora_dropout, + bias="none", + use_rslora=model_args.use_rslora, + use_dora=model_args.use_dora, + modules_to_save=model_args.lora_modules_to_save, + ) + + return peft_config + + +# For intersection dataset processing +def format_intersection_data(samples: dict) -> dict[str, list]: + """Format intersection dataset to match expected message format""" + formatted_samples = {"messages": []} + for idx in range(len(samples["image"])): + image = samples["image"][idx].convert("RGB") + label = str(samples["label"][idx]) + + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant with great geometry skills.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "image", "image": image}, + { + "type": "text", + "text": "How many intersection points are there in the image?", + }, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": label}]}, + ] + formatted_samples["messages"].append(message) + return formatted_samples + + +# For multi-image example +def process_vision_info(messages: list[dict]) -> list[Image.Image]: + image_inputs = [] + for msg in messages: + content = msg.get("content", []) + if not isinstance(content, list): + content = [content] + + for element in content: + if isinstance(element, dict) and ( + "image" in element or element.get("type") == "image" + ): + if "image" in element: + image = element["image"] + else: + image = element + if image is not None: + # Handle dictionary with bytes + if isinstance(image, dict) and "bytes" in image: + pil_image = Image.open(io.BytesIO(image["bytes"])) + image_inputs.append(pil_image.convert("RGB")) + # Handle PIL Image objects + elif hasattr(image, "convert"): + image_inputs.append(image.convert("RGB")) + return image_inputs + + +def format_data(samples: dict) -> dict[str, list]: + formatted_samples = {"messages": []} + for cont in range(len(samples["question"])): + images = [] + for img_path in samples["input_image_path"][cont]: + try: + with open(img_path, "rb") as f: + img_bytes = f.read() + image = Image.open(io.BytesIO(img_bytes)).convert("RGB") + images.append({"type": "image", "image": image}) + except Exception as e: + print(f"Error processing image {img_path}: {e}") + continue + + formatted_samples["messages"].append( + [ + { + "role": "system", + "content": [{"type": "text", "text": samples["context"][cont]}], + }, + { + "role": "user", + "content": images + + [{"type": "text", "text": samples["question"][cont]}], + }, + { + "role": "assistant", + "content": [{"type": "text", "text": samples["output"][cont]}], + }, + ] + ) + return formatted_samples + + +# For multi-image example +def prepare_dataset( + dataset: DatasetDict, dataset_name: str, dataset_train_split: str +) -> DatasetDict: + all_files = list_repo_files(dataset_name, repo_type="dataset") + zip_files = [f for f in all_files if f.endswith(".zip")] + + for zip_filename in zip_files: + zip_path = hf_hub_download( + repo_id=dataset_name, filename=zip_filename, repo_type="dataset" + ) + extract_folder = zip_filename.replace(".zip", "") + os.makedirs(extract_folder, exist_ok=True) + + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(extract_folder) + + dataset = dataset.map(format_data, batched=True, batch_size=4, num_proc=16) + return dataset + + +def main(): + parser = TrlParser((ScriptArguments, SFTConfig, ModelConfig)) + script_args, training_args, model_args = parser.parse_args_and_config() + training_args.gradient_checkpointing_kwargs = dict(use_reentrant=False) + training_args.remove_unused_columns = False + training_args.dataset_kwargs = {"skip_prepare_dataset": True} + + ################ + # Model, Tokenizer & Processor + ################ + torch_dtype = ( + model_args.torch_dtype + if model_args.torch_dtype in ["auto", None] + else getattr(torch, model_args.torch_dtype) + ) + quantization_config = get_quantization_config(model_args) + model_kwargs = dict( + revision=model_args.model_revision, + attn_implementation=model_args.attn_implementation, + torch_dtype=torch_dtype, + device_map=get_kbit_device_map() if quantization_config is not None else None, + quantization_config=quantization_config, + ) + processor = AutoProcessor.from_pretrained( + model_args.model_name_or_path, trust_remote_code=model_args.trust_remote_code + ) + processor.tokenizer.padding_side = "right" + + # Use appropriate model class based on model name + if "gemma-3n" in model_args.model_name_or_path.lower(): + model = Gemma3nForConditionalGeneration.from_pretrained( + model_args.model_name_or_path, + trust_remote_code=model_args.trust_remote_code, + **model_kwargs, + ) + else: + model = AutoModelForImageTextToText.from_pretrained( + model_args.model_name_or_path, + trust_remote_code=model_args.trust_remote_code, + **model_kwargs, + ) + + def collate_fn(examples): + texts = [] + images_list = [] + + for example in examples: + # Apply chat template to get text + text = processor.apply_chat_template( + example["messages"], tokenize=False, add_generation_prompt=False + ).strip() + texts.append(text) + + # Extract images + if "images" in example: # single-image case + images = [img.convert("RGB") for img in example["images"]] + else: # multi-image case or intersection dataset + images = process_vision_info(example["messages"]) + images_list.append(images) + + # Tokenize the texts and process the images + batch = processor( + text=texts, images=images_list, return_tensors="pt", padding=True + ) + + # The labels are the input_ids, and we mask the padding tokens in the loss computation + labels = batch["input_ids"].clone() + + # Mask tokens for Gemma3n model + if "gemma-3n" in model_args.model_name_or_path.lower(): + # Use Gemma3n specific token masking + labels[labels == processor.tokenizer.pad_token_id] = -100 + if hasattr(processor.tokenizer, "image_token_id"): + labels[labels == processor.tokenizer.image_token_id] = -100 + if hasattr(processor.tokenizer, "boi_token_id"): + labels[labels == processor.tokenizer.boi_token_id] = -100 + if hasattr(processor.tokenizer, "eoi_token_id"): + labels[labels == processor.tokenizer.eoi_token_id] = -100 + else: + # Original masking for other models + image_token_id = [ + processor.tokenizer.convert_tokens_to_ids( + processor.tokenizer.special_tokens_map["boi_token"] + ) + ] + labels[labels == processor.tokenizer.pad_token_id] = -100 + labels[labels == image_token_id] = -100 + labels[labels == 262144] = -100 + + batch["labels"] = labels + return batch + + ################ + # Dataset + ################ + dataset = load_dataset(script_args.dataset_name, name=script_args.dataset_config) + + # Handle different dataset formats + if script_args.dataset_name == "FanqingM/MMIU-Benchmark": + dataset = prepare_dataset( + dataset, script_args.dataset_name, script_args.dataset_train_split + ) + elif script_args.dataset_name == "ariG23498/intersection-dataset": + # Format intersection dataset + dataset = dataset.map( + format_intersection_data, batched=True, batch_size=4, num_proc=4 + ) + + ################ + # Training + ################ + trainer = SFTTrainer( + model=model, + args=training_args, + data_collator=collate_fn, + train_dataset=dataset[script_args.dataset_train_split], + eval_dataset=dataset[script_args.dataset_test_split] + if training_args.eval_strategy != "no" + else None, + processing_class=processor.tokenizer, + peft_config=my_get_peft_config(model_args), + ) + + trainer.train() + + # Save and push to hub + trainer.save_model(training_args.output_dir) + if training_args.push_to_hub: + trainer.push_to_hub(dataset_name=script_args.dataset_name) + if trainer.accelerator.is_main_process: + processor.push_to_hub(training_args.hub_model_id) + + +if __name__ == "__main__": + main() diff --git a/tooling/huggingface/recipes/scripts/ft_gemma3n_image_vt.py b/tooling/huggingface/recipes/scripts/ft_gemma3n_image_vt.py new file mode 100644 index 0000000..fd20a2d --- /dev/null +++ b/tooling/huggingface/recipes/scripts/ft_gemma3n_image_vt.py @@ -0,0 +1,186 @@ +import os + +os.environ["TRANSFORMERS_VERBOSITY"] = "error" +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +import random +from functools import partial + +import torch +from datasets import load_dataset +from matplotlib import pyplot as plt +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import Gemma3nForConditionalGeneration, Gemma3nProcessor + + +def collate_fn(examples, processor): + messages = list() + for sample in examples: + image = sample["image"].convert("RGB") + label = str(sample["label"]) + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant with great geometry skills.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "image", "image": image}, + { + "type": "text", + "text": "How many intersection points are there in the image?", + }, + ], + }, + {"role": "assistant", "content": [{"type": "text", "text": label}]}, + ] + messages.append(message) + + batch = processor.apply_chat_template( + messages, + add_generation_prompt=False, + tokenize=True, + return_dict=True, + return_tensors="pt", + ) + + labels = batch["input_ids"].clone() # Clone input IDs for labels + # Mask the tokens that we do not want to include in the loss computation + # -100 is ignored during categorical cross entropy loss computation + labels[labels == processor.tokenizer.pad_token_id] = -100 + labels[labels == processor.tokenizer.image_token_id] = -100 + labels[labels == processor.tokenizer.boi_token_id] = -100 + labels[labels == processor.tokenizer.eoi_token_id] = -100 + + batch["labels"] = labels + + return batch + + +def freeze_layers(model): + for name, param in model.named_parameters(): + if "attn" in name: + param.requires_grad = True + else: + param.requires_grad = False + return model + + +def run_inference(val_dataset, processor, model, fname): + # infer before training + val_sample = random.choice(val_dataset) + image = val_sample["image"].convert("RGB") + message = [ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are an assistant with great geometry skills.", + } + ], + }, + { + "role": "user", + "content": [ + {"type": "image", "image": image}, + { + "type": "text", + "text": "How many intersection points are there in the image?", + }, + ], + }, + ] + inputs = processor.apply_chat_template( + message, + add_generation_prompt=True, + tokenize=True, + return_dict=True, + return_tensors="pt", + ).to(model.device, dtype=torch.bfloat16) + input_len = inputs["input_ids"].shape[-1] + with torch.no_grad(): + generation = model.generate(**inputs, max_new_tokens=10, disable_compile=True) + generation = generation[0][input_len:] + + decoded = processor.decode(generation, skip_special_tokens=True) + + plt.imshow(image) + plt.axis("off") + plt.title(f"Pred: {decoded}") + plt.show() + plt.savefig(f"outputs_fine_tune/{fname}") + + +def main(): + model_id = "google/gemma-3n-E2B-it" + processor = Gemma3nProcessor.from_pretrained(model_id) + + # load the dataset + dataset_id = "ariG23498/intersection-dataset" + train_dataset = load_dataset(dataset_id, split="train") + val_dataset = load_dataset(dataset_id, split="validation") + + # create data loader + partial_collate_fn = partial(collate_fn, processor=processor) + train_dataloader = DataLoader( + train_dataset, + batch_size=2, + shuffle=True, + num_workers=8, + drop_last=True, + collate_fn=partial_collate_fn, + pin_memory=True, + ) + val_dataloader = DataLoader( + val_dataset, + batch_size=2, + shuffle=False, + num_workers=8, + drop_last=True, + collate_fn=partial_collate_fn, + ) + + # load the model and optimizer + model = Gemma3nForConditionalGeneration.from_pretrained(model_id).to("cuda") + + run_inference(val_dataset, processor, model, "pred_before.png") + + model = freeze_layers(model) + + params_to_train = filter(lambda p: p.requires_grad, model.parameters()) + optimizer = torch.optim.AdamW(params_to_train, lr=1e-5) + + # Start Training + accumulation_steps = 8 + for idx, batch in tqdm(enumerate(train_dataloader)): + outputs = model(**batch.to(model.device)) + loss = outputs.loss / accumulation_steps + if idx % 50 == 0: + val_loss = 0.0 + with torch.no_grad(): + count = 0 + for val_batch in val_dataloader: + val_loss = val_loss + model(**val_batch.to(model.device)).loss + count = count + 1 + val_loss = val_loss / count + print( + f"Iter: {idx} Loss: {loss.item():.4f} Val Loss: {val_loss.item():.4f}" + ) + run_inference(val_dataset, processor, model, f"infer_{idx}.png") + + loss.backward() + if idx % 8 == 0: + optimizer.step() + optimizer.zero_grad() + + +if __name__ == "__main__": + main() diff --git a/tooling/huggingface/recipes/scripts/gemma3n_fine_tuning_on_all_modalities.py b/tooling/huggingface/recipes/scripts/gemma3n_fine_tuning_on_all_modalities.py new file mode 100644 index 0000000..54036ad --- /dev/null +++ b/tooling/huggingface/recipes/scripts/gemma3n_fine_tuning_on_all_modalities.py @@ -0,0 +1,425 @@ +# -*- coding: utf-8 -*- +"""Gemma3n Fine-tuning on All Modalities.ipynb + +Automatically generated by Colab. + +Original file is located at + https://colab.research.google.com/drive/1iEZUJuvKJpGU8t50BqfkiCQmGkaR6gd4 + +# Fine-tune Gemma3n on FineVideo + +In this notebook, we will see how to fine-tune Gemma3n an videos with audios inside. +Using all three modalities is very costly compute-wise, so keep in mind that this is an educational tutorial to fit the model in 40GB VRAM. +""" + +!pip install -U -q timm transformers trl peft datasets + +import io +import os +import zipfile + +import torch +from datasets import load_dataset +from PIL import Image +from transformers import AutoProcessor, Gemma3nForConditionalGeneration + +from trl import ( + SFTConfig, + SFTTrainer, +) + +"""## Download videos and preprocessing + +FineVideo is a quite large dataset, we don't need a ton of examples, so we stream the dataset, check the duration and download the videos shorter than 30 secs. +""" + +from datasets import load_dataset +import json +import os + +dataset = load_dataset("HuggingFaceFV/finevideo", split="train", streaming=True) + + +os.makedirs("videos", exist_ok=True) +os.makedirs("metadata", exist_ok=True) + +for idx, sample in enumerate(dataset): + data = sample["json"] + duration = data.get("duration_seconds", 0) + if duration < 30: + video_filename = f"videos/sample_{idx}.mp4" + with open(video_filename, 'wb') as video_file: + video_file.write(sample['mp4']) + + json_filename = f"metadata/sample_{idx}.json" + with open(json_filename, 'w') as json_file: + json.dump(sample['json'], json_file) + +print(f"Number of items in content/videos: {len(os.listdir('videos'))}") + +"""In FineVideo some frames are dark so we downsample 6 frames and if we can't get meaningful videos we remove them.""" + +import cv2 +from PIL import Image +import numpy as np + +def is_dark(frame, threshold=10): + return np.max(frame) < threshold # all pixels are very close to 0 + +def downsample_video(video_path): + vidcap = cv2.VideoCapture(video_path) + total_frames = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT)) + fps = vidcap.get(cv2.CAP_PROP_FPS) + + frames = [] + + # Generate 8 evenly spaced indices, skip first and last + full_indices = np.linspace(0, total_frames - 1, 8, dtype=int)[1:-1] + + for i in full_indices: + found_valid = False + for offset in [0, -1, 1, -2, 2]: # Try nearby frames if original is dark + candidate_idx = i + offset + if 0 <= candidate_idx < total_frames: + vidcap.set(cv2.CAP_PROP_POS_FRAMES, candidate_idx) + success, image = vidcap.read() + if success: + if not is_dark(image): + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + pil_image = Image.fromarray(image) + timestamp = round(candidate_idx / fps, 2) + frames.append((pil_image, timestamp)) + found_valid = True + break + if not found_valid: + print(f"Warning: Could not find non-dark frame near index {i}") + + vidcap.release() + + # If still fewer than 8, try to top off by scanning more frames + if len(frames) < 6: + print("Trying to top off with additional non-dark frames...") + idx = 0 + while len(frames) < 8 and idx < total_frames: + vidcap.set(cv2.CAP_PROP_POS_FRAMES, idx) + success, image = vidcap.read() + if success and not is_dark(image): + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + pil_image = Image.fromarray(image) + timestamp = round(idx / fps, 2) + # Avoid adding duplicate timestamps + if not any(ts == timestamp for _, ts in frames): + frames.append((pil_image, timestamp)) + idx += 1 + + return frames[:8] # Ensure exactly 8 frames + +import os +import glob + +def remove_dark_videos(video_dir, metadata_dir, audio_dir): + """ + Remove videos (and their metadata/audio files) if all frames are dark. + """ + video_paths = glob.glob(os.path.join(video_dir, "*.mp4")) + + for video_path in video_paths: + filename = os.path.basename(video_path) + base_name = os.path.splitext(filename)[0] + + frames = downsample_video(video_path) + if len(frames) < 6: + try: + os.remove(video_path) + print(f"Deleted: {video_path}") + except Exception as e: + print(f"Failed to delete {video_path}: {e}") + + metadata_path = os.path.join(metadata_dir, f"{base_name}.json") + if os.path.exists(metadata_path): + os.remove(metadata_path) + + # Remove audio + audio_path = os.path.join(audio_dir, f"{base_name}.wav") + if os.path.exists(audio_path): + os.remove(audio_path) + +remove_dark_videos( + video_dir="videos", + metadata_dir="metadata", + audio_dir="audios" + ) + +"""Gemma-3n accepts video (image frames) and audio separately, so we strip audio from video.""" + +import os +import subprocess + +video_dir = "videos" +audio_dir = "audios" +os.makedirs(audio_dir, exist_ok=True) + +for filename in os.listdir(video_dir): + if not filename.endswith(".mp4"): + continue + + idx = filename.split("_")[1].split(".")[0] + video_path = os.path.join(video_dir, filename) + audio_path = os.path.join(audio_dir, f"sample_{idx}.wav") + + subprocess.run([ + "ffmpeg", "-i", video_path, + "-q:a", "0", "-map", "a", + audio_path, + "-y" + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + +"""Construct a new dataset with audio, video, metadata (video categories). This dataset is very cool, it has some questions and answers, captions and more so get creative if you have the GPU VRAM to do so. Here we solve an easier task for educational purposes.""" + +from datasets import Dataset +import json + +def gen(): + meta_dir = "metadata" + for filename in os.listdir(meta_dir): + if not filename.endswith(".json"): + continue + + idx = filename.split("_")[1].split(".")[0] + if os.path.exists(f"videos/sample_{idx}.mp4"): + video_filename = f"sample_{idx}.mp4" + audio_filename = f"sample_{idx}.wav" + json_path = os.path.join(meta_dir, filename) + + with open(json_path, "r") as f: + metadata = json.load(f) + + + yield { + "video": video_filename, + "audio": audio_filename, + "content_parent_category": metadata["content_parent_category"], + "sample_index": int(idx) + } + else: + pass + +dataset = Dataset.from_generator(gen) + +"""We will speed-up and downsample the audios to save space during training.""" + +import torchaudio +from torchaudio.transforms import Resample +import os +import torch + +def preprocess_audio(audio_path, target_sample_rate=16000, max_duration_sec=5, speedup_factor=1.25): + waveform, sample_rate = torchaudio.load(audio_path) + + if waveform.shape[0] > 1: + waveform = waveform.mean(dim=0, keepdim=True) + + if sample_rate != target_sample_rate: + resampler = Resample(orig_freq=sample_rate, new_freq=target_sample_rate) + waveform = resampler(waveform) + sample_rate = target_sample_rate + + if speedup_factor > 1.0: + indices = torch.arange(0, waveform.shape[1], step=speedup_factor).long() + if indices[-1] >= waveform.shape[1]: + indices = indices[:-1] + waveform = waveform[:, indices] + + max_length = int(target_sample_rate * max_duration_sec) + if waveform.shape[1] > max_length: + waveform = waveform[:, :max_length] + + torchaudio.save(audio_path, waveform, sample_rate) + +for file_name in os.listdir("audios"): + if file_name.lower().endswith(".wav"): + audio_path = os.path.join("audios", file_name) + preprocess_audio(audio_path) + +dataset = dataset.train_test_split(test_size=0.10, seed=42) + +"""### Load the model + +Make sure you have your Hugging Face token in your Colab secrets. +""" + +model = Gemma3nForConditionalGeneration.from_pretrained( + "google/gemma-3n-E2B-it", torch_dtype=torch.bfloat16, +) +processor = AutoProcessor.from_pretrained( + "google/gemma-3n-E2B-it", +) +processor.tokenizer.padding_side = "right" + +processor.tokenizer.all_special_ids + +"""Write our dataset collator. We will train model to predict category of a video (which can be done easily). You can do much better things, for instance FineVideo has QnA section, you can train this model to do open-ended QnA if you have a big VRAM and a lot of patience. Open-ended tasks are harder to work with, and this notebook carries educational purposes on feeding different modalities. + +In collator we also downsample videos to 6 frames, we have written the helper above. For better results you need more frames. +""" + +def collate_fn(examples): + video_path = examples[0]["video"] + audio_path = examples[0]["audio"] + sample_idx = filename.split("_")[1].split(".")[0] + frames = downsample_video(f"videos/{video_path}") + + text = "Based on the video, predict the category of it." + message = [ + { + "role": "user", + "content": [ + {"type": "text", "text": text} + ], + }, + ] + # this is how video inference should be formatted in Gemma3n + for frame in frames: + image, timestamp = frame + message[0]["content"].append({"type": "text", "text": f"Frame {timestamp}:"}) + timestamp = str(timestamp).replace(".", "_") + image.save(f"image_idx_{sample_idx}_{timestamp}.png") + message[0]["content"].append({"type": "image", "url": f"image_idx_{sample_idx}_{timestamp}.png"}) + + message[0]["content"].append({"type": "audio", "audio": f"audios/{audio_path}"}) + message.append({"role": "assistant", "content": [{"type": "text", "text": examples[0]["content_parent_category"]}]}) + inputs = processor.apply_chat_template( + message, + add_generation_prompt=False, + tokenize=True, + return_dict=True, + return_tensors="pt", + padding=True, + ).to(model.device) + + labels = inputs["input_ids"].clone() + special_token_ids = processor.tokenizer.all_special_ids + + special_token_ids_tensor = torch.tensor(special_token_ids, device=labels.device) + mask = torch.isin(labels, special_token_ids_tensor) + labels[mask] = -100 + + inputs["labels"] = labels + if torch.all(inputs["pixel_values"] == 0): + print("Frames are dark") + + return inputs + +"""## Training + +We do LoRA fine-tuning again to save up on space. +""" + +from peft import LoraConfig +peft_config = LoraConfig( + task_type="CAUSAL_LM", + r=16, + target_modules="all-linear", + lora_alpha=32, + lora_dropout=0.05, + bias="none", + use_rslora=False, + use_dora=False, + modules_to_save=None +) + +model.gradient_checkpointing_disable() + +model.config.use_cache = False + +training_args = SFTConfig( + output_dir="/content/gemma-3n-finevideo", + eval_strategy='epoch', + per_device_train_batch_size=1, + per_device_eval_batch_size=1, + gradient_accumulation_steps=4, + gradient_checkpointing=False, + learning_rate=1e-05, + num_train_epochs=3.0, + logging_steps=10, + save_steps=100, + bf16=True, + report_to=["tensorboard"], + dataset_kwargs={'skip_prepare_dataset': True}, + remove_unused_columns=False, + max_seq_length=None, + push_to_hub=True, + dataloader_pin_memory=False, +) + +trainer = SFTTrainer( + model=model, + args=training_args, + data_collator=collate_fn, + train_dataset=dataset["train"], + eval_dataset=dataset["test"] if training_args.eval_strategy != "no" else None, + processing_class=processor.tokenizer, + peft_config=peft_config, +) + +trainer.train() + +"""Test the model with a video of snowboarding.""" + +!wget https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/IMG_8137.mp4 + +model = trainer.model # trainer has the adapter + +"""Strip audio and downsample video.""" + +audio_path = "/content/test_audio.wav" +subprocess.run([ + "ffmpeg", "-i", "/content/IMG_8137.mp4", + "-q:a", "0", "-map", "a", + f"{audio_path}", + "-y" + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + +frames = downsample_video("/content/IMG_8137.mp4") + +# repeat the chat template +text = "Based on the video, predict the category of it." +message = [ + { + "role": "user", + "content": [ + {"type": "text", "text": text} + ], + }, +] +for frame in frames: + image, timestamp = frame + message[0]["content"].append({"type": "text", "text": f"Frame {timestamp}:"}) + timestamp = str(timestamp).replace(".", "_") + image.save(f"test_frame_{timestamp}.png") + message[0]["content"].append({"type": "image", "url": f"test_frame_{timestamp}.png"}) + +message[0]["content"].append({"type": "audio", "audio": f"{audio_path}"}) + +message + +inputs = processor.apply_chat_template( + message, + add_generation_prompt=True, + tokenize=True, + return_dict=True, + return_tensors="pt", + padding=True, +).to(model.device).to(model.dtype) + +input_len = inputs["input_ids"].shape[-1] + +with torch.inference_mode(): + generation = model.generate(**inputs, max_new_tokens=100, do_sample=False) + generation = generation[0][input_len:] + +decoded = processor.decode(generation, skip_special_tokens=True) +print(decoded) + +"""Thanks a lot for reading! Keep training the model further with more data or unfreeze the layers for better performance 💗""" + diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-README.md b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-README.md new file mode 100644 index 0000000..177aac3 --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-README.md @@ -0,0 +1,13 @@ +--- +title: Gemma 4 31B It +emoji: 🚀 +colorFrom: blue +colorTo: green +sdk: gradio +sdk_version: 6.12.0 +python_version: "3.12.12" +app_file: app.py +pinned: false +--- + +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-app.py b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-app.py new file mode 100644 index 0000000..f08f04e --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-app.py @@ -0,0 +1,303 @@ +import os +from collections.abc import Iterator +from threading import Thread + +import gradio as gr +import spaces +import torch +from transformers import AutoModelForMultimodalLM, AutoProcessor, BatchFeature +from transformers.generation.streamers import TextIteratorStreamer + +MODEL_ID = "google/gemma-4-31b-it" + +processor = AutoProcessor.from_pretrained(MODEL_ID, use_fast=False) +model = AutoModelForMultimodalLM.from_pretrained(MODEL_ID, device_map="auto", dtype=torch.bfloat16) + +IMAGE_FILE_TYPES = (".jpg", ".jpeg", ".png", ".webp") +VIDEO_FILE_TYPES = (".mp4", ".mov", ".avi", ".webm") +MAX_INPUT_TOKENS = int(os.getenv("MAX_INPUT_TOKENS", "10_000")) + +THINKING_START = "<|channel>" +THINKING_END = "" + +# Special tokens to strip from decoded output (keeping thinking delimiters +# so that Gradio's reasoning_tags can find them on the frontend). +_KEEP_TOKENS = {THINKING_START, THINKING_END} +_STRIP_TOKENS = sorted( + (t for t in processor.tokenizer.all_special_tokens if t not in _KEEP_TOKENS), + key=len, + reverse=True, # longest first to avoid partial matches +) + + +def _strip_special_tokens(text: str) -> str: + for tok in _STRIP_TOKENS: + text = text.replace(tok, "") + return text + + +def _classify_file(path: str) -> str | None: + """Return media type string for a file path, or None if unsupported.""" + lower = path.lower() + if lower.endswith(IMAGE_FILE_TYPES): + return "image" + if lower.endswith(VIDEO_FILE_TYPES): + return "video" + return None + + +def process_new_user_message(message: dict) -> list[dict]: + """Build content list from the new user message with URL-based media references.""" + content: list[dict] = [] + for path in message.get("files", []): + kind = _classify_file(path) + if kind: + content.append({"type": kind, "url": path}) + content.append({"type": "text", "text": message.get("text", "")}) + return content + + +def process_history(history: list[dict]) -> list[dict]: + """Walk Gradio 6 history and build message list with URL-based media references.""" + messages: list[dict] = [] + + for item in history: + if item["role"] == "assistant": + text_parts = [p["text"] for p in item["content"] if p.get("type") == "text"] + messages.append( + { + "role": "assistant", + "content": [{"type": "text", "text": " ".join(text_parts)}], + } + ) + else: + user_content: list[dict] = [] + for part in item["content"]: + if part.get("type") == "text": + user_content.append({"type": "text", "text": part["text"]}) + elif part.get("type") == "file": + filepath = part["file"]["path"] + kind = _classify_file(filepath) + if kind: + user_content.append({"type": kind, "url": filepath}) + if user_content: + messages.append({"role": "user", "content": user_content}) + + return messages + + +@spaces.GPU(duration=180) +@torch.inference_mode() +def _generate_on_gpu(inputs: BatchFeature, max_new_tokens: int, thinking: bool) -> Iterator[str]: + inputs = inputs.to(device=model.device, dtype=torch.bfloat16) + + streamer = TextIteratorStreamer( + processor, + timeout=30.0, + skip_prompt=True, + skip_special_tokens=not thinking, + ) + generate_kwargs = { + **inputs, + "streamer": streamer, + "max_new_tokens": max_new_tokens, + "disable_compile": True, + } + + exception_holder: list[Exception] = [] + + def _generate() -> None: + try: + model.generate(**generate_kwargs) + except Exception as e: # noqa: BLE001 + exception_holder.append(e) + + thread = Thread(target=_generate) + thread.start() + + chunks: list[str] = [] + for text in streamer: + chunks.append(text) + accumulated = "".join(chunks) + if thinking: + yield _strip_special_tokens(accumulated) + else: + yield accumulated + + thread.join() + if exception_holder: + msg = f"Generation failed: {exception_holder[0]}" + raise gr.Error(msg) + + +def validate_input(message: dict) -> dict: + has_text = bool(message.get("text", "").strip()) + has_files = bool(message.get("files")) + if not (has_text or has_files): + return gr.validate(has_text, "Please enter a message or upload a file.") + + files = message.get("files", []) + kinds = [_classify_file(f) for f in files] + kinds = [k for k in kinds if k is not None] + unique_kinds = set(kinds) + + if len(unique_kinds) > 1: + return gr.validate(False, "Please upload only one type of media (images or video) at a time.") + if kinds.count("video") > 1: + return gr.validate(False, "Only one video file can be uploaded at a time.") + + return gr.validate(True, "") + + +def _has_media_type(messages: list[dict], media_type: str) -> bool: + """Check if any message contains a content entry of the given media type.""" + return any( + c.get("type") == media_type for m in messages for c in (m["content"] if isinstance(m["content"], list) else []) + ) + + +def generate( + message: dict, + history: list[dict], + thinking: bool = False, + max_new_tokens: int = 1024, + max_soft_tokens: int = 280, + system_prompt: str = "", +) -> Iterator[str]: + + messages: list[dict] = [] + if system_prompt: + messages.append({"role": "system", "content": [{"type": "text", "text": system_prompt}]}) + + messages.extend(process_history(history)) + messages.append({"role": "user", "content": process_new_user_message(message)}) + + template_kwargs: dict = { + "tokenize": True, + "return_dict": True, + "return_tensors": "pt", + "add_generation_prompt": True, + "processor_kwargs": {"images_kwargs": {"max_soft_tokens": max_soft_tokens}}, + } + if _has_media_type(messages, "video"): + template_kwargs["load_audio_from_video"] = False + if thinking: + template_kwargs["enable_thinking"] = True + + inputs = processor.apply_chat_template(messages, **template_kwargs) + + n_tokens = inputs["input_ids"].shape[1] + if n_tokens > MAX_INPUT_TOKENS: + msg = f"Input too long ({n_tokens} tokens). Maximum is {MAX_INPUT_TOKENS} tokens." + raise gr.Error(msg) + + yield from _generate_on_gpu(inputs=inputs, max_new_tokens=max_new_tokens, thinking=thinking) + + +examples = [ + # --- Text-only examples --- + [ + { + "text": "What is the capital of France?", + "files": [], + } + ], + [ + { + "text": "What is the water formula?", + "files": [], + } + ], + [ + { + "text": "Explain quantum entanglement in simple terms.", + "files": [], + } + ], + [ + { + "text": "I want to do a car wash that is 50 meters away, should I walk or drive?", + "files": [], + } + ], + [ + { + "text": "Write a poem about beer with 4 stanzas. Format the title as an H2 markdown heading and bold the first line of each stanza.", + "files": [], + } + ], + # --- Single-image examples --- + [ + { + "text": "Describe this image.", + "files": ["https://news.bbc.co.uk/media/images/38107000/jpg/_38107299_ronaldogoal_ap_300.jpg"], + } + ], + [ + { + "text": "What is the city in this image? Describe what you see.", + "files": ["https://imgmd.net/images/v1/guia/1698673/rio-de-janeiro-4-c.jpg"], + } + ], + # --- Multi-image examples --- + [ + { + "text": "What are the key similarities between these three images?", + "files": [ + "https://news.bbc.co.uk/media/images/38107000/jpg/_38107299_ronaldogoal_ap_300.jpg", + "https://ogimg.infoglobo.com.br/in/12547538-502-0e0/FT1086A/94-8705-14.jpg", + "https://amazonasatual.com.br/wp-content/uploads/2021/01/Pele.jpg", + ], + } + ], + # --- Video examples --- + [ + { + "text": "What is happening in this video?", + "files": ["https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"], + } + ], +] + +demo = gr.ChatInterface( + fn=generate, + validator=validate_input, + chatbot=gr.Chatbot( + scale=1, + latex_delimiters=[ + {"left": "$$", "right": "$$", "display": True}, + {"left": "$", "right": "$", "display": False}, + {"left": "\\(", "right": "\\)", "display": False}, + {"left": "\\[", "right": "\\]", "display": True}, + ], + reasoning_tags=[(THINKING_START, THINKING_END)], + ), + textbox=gr.MultimodalTextbox( + sources=["upload"], + file_types=[*IMAGE_FILE_TYPES, *VIDEO_FILE_TYPES], + file_count="multiple", + autofocus=True, + ), + multimodal=True, + additional_inputs=[ + gr.Checkbox(label="Thinking", value=False), + gr.Slider(label="Max New Tokens", minimum=100, maximum=4000, step=10, value=2000), + gr.Dropdown( + label="Image Token Budget", + info="Higher values preserve more visual detail (useful for OCR/documents). Lower values are faster.", + choices=[70, 140, 280, 560, 1120], + value=280, + ), + gr.Textbox(label="System Prompt", value=""), + ], + additional_inputs_accordion=gr.Accordion("Settings", open=True), + stop_btn=False, + title="Gemma 4 31B It", + examples=examples, + run_examples_on_click=False, + cache_examples=False, + delete_cache=(1800, 1800), +) + +if __name__ == "__main__": + demo.launch(css_paths="style.css", max_file_size="20mb") diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-requirements.txt b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-requirements.txt new file mode 100644 index 0000000..fbbfd8c --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-31b-it-requirements.txt @@ -0,0 +1,362 @@ +# This file was autogenerated by uv via the following command: +# uv export --no-hashes --no-dev --group hf-spaces --no-emit-package typer-slim --no-emit-package spaces -o requirements.txt +accelerate==1.13.0 + # via gemma-4-31b-it +aiohappyeyeballs==2.6.1 + # via aiohttp +aiohttp==3.13.5 + # via fsspec +aiosignal==1.4.0 + # via aiohttp +annotated-doc==0.0.4 + # via + # fastapi + # typer +annotated-types==0.7.0 + # via pydantic +anyio==4.13.0 + # via + # gradio + # httpx + # mcp + # sse-starlette + # starlette +attrs==26.1.0 + # via + # aiohttp + # jsonschema + # referencing +audioop-lts==0.2.2 ; python_full_version >= '3.13' + # via gradio +brotli==1.2.0 + # via gradio +certifi==2026.2.25 + # via + # httpcore + # httpx + # requests +cffi==2.0.0 ; platform_python_implementation != 'PyPy' + # via cryptography +charset-normalizer==3.4.7 + # via requests +click==8.3.2 + # via + # typer + # uvicorn +colorama==0.4.6 ; sys_platform == 'win32' + # via + # click + # tqdm +cryptography==46.0.7 + # via pyjwt +datasets==4.8.4 +dill==0.4.1 + # via + # datasets + # multiprocess +fastapi==0.136.0 + # via gradio +filelock==3.28.0 + # via + # datasets + # huggingface-hub + # torch +frozenlist==1.8.0 + # via + # aiohttp + # aiosignal +fsspec==2026.2.0 + # via + # datasets + # gradio-client + # huggingface-hub + # torch +gradio==6.12.0 + # via + # gemma-4-31b-it + # spaces +gradio-client==2.4.1 + # via + # gradio + # hf-gradio +groovy==0.1.2 + # via gradio +h11==0.16.0 + # via + # httpcore + # uvicorn +hf-gradio==0.4.0 + # via gradio +hf-xet==1.4.3 ; platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' + # via huggingface-hub +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via + # datasets + # gradio + # gradio-client + # huggingface-hub + # mcp + # safehttpx + # spaces +httpx-sse==0.4.3 + # via mcp +huggingface-hub==1.11.0 + # via + # accelerate + # datasets + # gradio + # gradio-client + # tokenizers + # transformers +idna==3.11 + # via + # anyio + # httpx + # requests + # yarl +jinja2==3.1.6 + # via + # gradio + # torch +jsonschema==4.26.0 + # via mcp +jsonschema-specifications==2025.9.1 + # via jsonschema +markdown-it-py==4.0.0 + # via rich +markupsafe==3.0.3 + # via + # gradio + # jinja2 +mcp==1.27.0 + # via gradio +mdurl==0.1.2 + # via markdown-it-py +mpmath==1.3.0 + # via sympy +multidict==6.7.1 + # via + # aiohttp + # yarl +multiprocess==0.70.19 + # via datasets +networkx==3.6.1 + # via torch +numpy==2.4.4 + # via + # accelerate + # datasets + # gradio + # pandas + # torchvision + # transformers +nvidia-cublas-cu12==12.8.4.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cudnn-cu12 + # nvidia-cusolver-cu12 + # torch +nvidia-cuda-cupti-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cuda-nvrtc-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cuda-runtime-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cudnn-cu12==9.10.2.21 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cufft-cu12==11.3.3.83 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cufile-cu12==1.13.1.3 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-curand-cu12==10.3.9.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cusolver-cu12==11.7.3.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cusparse-cu12==12.5.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cusolver-cu12 + # torch +nvidia-cusparselt-cu12==0.7.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nccl-cu12==2.27.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nvjitlink-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cufft-cu12 + # nvidia-cusolver-cu12 + # nvidia-cusparse-cu12 + # torch +nvidia-nvshmem-cu12==3.3.20 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nvtx-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +orjson==3.11.8 + # via gradio +packaging==26.1 + # via + # accelerate + # datasets + # gradio + # gradio-client + # huggingface-hub + # spaces + # transformers +pandas==3.0.2 + # via + # datasets + # gradio +pillow==12.2.0 + # via + # gradio + # torchvision +propcache==0.4.1 + # via + # aiohttp + # yarl +psutil==5.9.8 + # via + # accelerate + # spaces +pyarrow==23.0.1 + # via datasets +pycparser==3.0 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy' + # via cffi +pydantic==2.12.5 + # via + # fastapi + # gradio + # mcp + # pydantic-settings + # spaces +pydantic-core==2.41.5 + # via pydantic +pydantic-settings==2.13.1 + # via mcp +pydub==0.25.1 + # via gradio +pygments==2.20.0 + # via rich +pyjwt==2.12.1 + # via mcp +python-dateutil==2.9.0.post0 + # via pandas +python-dotenv==1.2.2 + # via pydantic-settings +python-multipart==0.0.26 + # via + # gradio + # mcp +pytz==2026.1.post1 + # via gradio +pywin32==311 ; sys_platform == 'win32' + # via mcp +pyyaml==6.0.3 + # via + # accelerate + # datasets + # gradio + # huggingface-hub + # transformers +referencing==0.37.0 + # via + # jsonschema + # jsonschema-specifications +regex==2026.4.4 + # via transformers +requests==2.33.1 + # via + # datasets + # spaces +rich==15.0.0 + # via typer +rpds-py==0.30.0 + # via + # jsonschema + # referencing +safehttpx==0.1.7 + # via gradio +safetensors==0.7.0 + # via + # accelerate + # transformers +semantic-version==2.10.0 + # via gradio +setuptools==82.0.1 + # via torch +shellingham==1.5.4 + # via typer +six==1.17.0 + # via python-dateutil +sse-starlette==3.3.4 + # via mcp +starlette==1.0.0 + # via + # fastapi + # gradio + # mcp + # sse-starlette +sympy==1.14.0 + # via torch +tokenizers==0.22.2 + # via transformers +tomlkit==0.14.0 + # via gradio +torch==2.9.1 + # via + # accelerate + # gemma-4-31b-it + # torchvision +torchcodec==0.9.1 + # via gemma-4-31b-it +torchvision==0.24.1 + # via gemma-4-31b-it +tqdm==4.67.3 + # via + # datasets + # huggingface-hub + # transformers +transformers==5.5.4 + # via gemma-4-31b-it +triton==3.5.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +typer==0.24.1 + # via + # gradio + # hf-gradio + # huggingface-hub + # transformers +typing-extensions==4.15.0 + # via + # aiosignal + # anyio + # fastapi + # gradio + # gradio-client + # huggingface-hub + # mcp + # pydantic + # pydantic-core + # referencing + # spaces + # starlette + # torch + # typing-inspection +typing-inspection==0.4.2 + # via + # fastapi + # mcp + # pydantic + # pydantic-settings +tzdata==2026.1 ; sys_platform == 'emscripten' or sys_platform == 'win32' + # via pandas +urllib3==2.6.3 + # via requests +uvicorn==0.44.0 + # via + # gradio + # mcp +xxhash==3.6.0 + # via datasets +yarl==1.23.0 + # via aiohttp diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-README.md b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-README.md new file mode 100644 index 0000000..603b039 --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-README.md @@ -0,0 +1,13 @@ +--- +title: Gemma 4 E4B It +emoji: 🚀 +colorFrom: blue +colorTo: green +sdk: gradio +sdk_version: 6.12.0 +python_version: "3.12.12" +app_file: app.py +pinned: false +--- + +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-app.py b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-app.py new file mode 100644 index 0000000..4faa110 --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-app.py @@ -0,0 +1,322 @@ +import os +from collections.abc import Iterator +from threading import Thread + +import gradio as gr +import spaces +import torch +from transformers import AutoModelForMultimodalLM, AutoProcessor, BatchFeature +from transformers.generation.streamers import TextIteratorStreamer + +MODEL_ID = "google/gemma-4-e4b-it" + +processor = AutoProcessor.from_pretrained(MODEL_ID, use_fast=False) +model = AutoModelForMultimodalLM.from_pretrained(MODEL_ID, device_map="auto", dtype=torch.bfloat16) + +IMAGE_FILE_TYPES = (".jpg", ".jpeg", ".png", ".webp") +AUDIO_FILE_TYPES = (".wav", ".mp3", ".flac", ".ogg") +VIDEO_FILE_TYPES = (".mp4", ".mov", ".avi", ".webm") +MAX_INPUT_TOKENS = int(os.getenv("MAX_INPUT_TOKENS", "10_000")) + +THINKING_START = "<|channel>" +THINKING_END = "" + +# Special tokens to strip from decoded output (keeping thinking delimiters +# so that Gradio's reasoning_tags can find them on the frontend). +_KEEP_TOKENS = {THINKING_START, THINKING_END} +_STRIP_TOKENS = sorted( + (t for t in processor.tokenizer.all_special_tokens if t not in _KEEP_TOKENS), + key=len, + reverse=True, # longest first to avoid partial matches +) + + +def _strip_special_tokens(text: str) -> str: + for tok in _STRIP_TOKENS: + text = text.replace(tok, "") + return text + + +def _classify_file(path: str) -> str | None: + """Return media type string for a file path, or None if unsupported.""" + lower = path.lower() + if lower.endswith(IMAGE_FILE_TYPES): + return "image" + if lower.endswith(AUDIO_FILE_TYPES): + return "audio" + if lower.endswith(VIDEO_FILE_TYPES): + return "video" + return None + + +def process_new_user_message(message: dict) -> list[dict]: + """Build content list from the new user message with URL-based media references.""" + content: list[dict] = [] + for path in message.get("files", []): + kind = _classify_file(path) + if kind: + content.append({"type": kind, "url": path}) + content.append({"type": "text", "text": message.get("text", "")}) + return content + + +def process_history(history: list[dict]) -> list[dict]: + """Walk Gradio 6 history and build message list with URL-based media references.""" + messages: list[dict] = [] + + for item in history: + if item["role"] == "assistant": + text_parts = [p["text"] for p in item["content"] if p.get("type") == "text"] + messages.append( + { + "role": "assistant", + "content": [{"type": "text", "text": " ".join(text_parts)}], + } + ) + else: + user_content: list[dict] = [] + for part in item["content"]: + if part.get("type") == "text": + user_content.append({"type": "text", "text": part["text"]}) + elif part.get("type") == "file": + filepath = part["file"]["path"] + kind = _classify_file(filepath) + if kind: + user_content.append({"type": kind, "url": filepath}) + if user_content: + messages.append({"role": "user", "content": user_content}) + + return messages + + +@spaces.GPU(duration=120) +@torch.inference_mode() +def _generate_on_gpu(inputs: BatchFeature, max_new_tokens: int, thinking: bool) -> Iterator[str]: + inputs = inputs.to(device=model.device, dtype=torch.bfloat16) + + streamer = TextIteratorStreamer( + processor, + timeout=30.0, + skip_prompt=True, + skip_special_tokens=not thinking, + ) + generate_kwargs = { + **inputs, + "streamer": streamer, + "max_new_tokens": max_new_tokens, + "disable_compile": True, + } + + exception_holder: list[Exception] = [] + + def _generate() -> None: + try: + model.generate(**generate_kwargs) + except Exception as e: # noqa: BLE001 + exception_holder.append(e) + + thread = Thread(target=_generate) + thread.start() + + chunks: list[str] = [] + for text in streamer: + chunks.append(text) + accumulated = "".join(chunks) + if thinking: + yield _strip_special_tokens(accumulated) + else: + yield accumulated + + thread.join() + if exception_holder: + msg = f"Generation failed: {exception_holder[0]}" + raise gr.Error(msg) + + +# FBT003 is suppressed below: gr.validate API takes bool as first positional arg. +def validate_input(message: dict) -> dict: + has_text = bool(message.get("text", "").strip()) + has_files = bool(message.get("files")) + if not (has_text or has_files): + return gr.validate(False, "Please enter a message or upload a file.") # noqa: FBT003 + + files = message.get("files", []) + kinds = [_classify_file(f) for f in files] + kinds = [k for k in kinds if k is not None] + unique_kinds = set(kinds) + + if len(unique_kinds) > 1: + return gr.validate(False, "Please upload only one type of media (images, audio, or video) at a time.") # noqa: FBT003 + if kinds.count("audio") > 1: + return gr.validate(False, "Only one audio file can be uploaded at a time.") # noqa: FBT003 + if kinds.count("video") > 1: + return gr.validate(False, "Only one video file can be uploaded at a time.") # noqa: FBT003 + + return gr.validate(True, "") # noqa: FBT003 + + +def _has_media_type(messages: list[dict], media_type: str) -> bool: + """Check if any message contains a content entry of the given media type.""" + return any(c.get("type") == media_type for m in messages for c in m["content"]) + + +def generate( + message: dict, + history: list[dict], + thinking: bool = False, + max_new_tokens: int = 1024, + max_soft_tokens: int = 280, + system_prompt: str = "", +) -> Iterator[str]: + messages: list[dict] = [] + if system_prompt: + messages.append({"role": "system", "content": [{"type": "text", "text": system_prompt}]}) + + messages.extend(process_history(history)) + messages.append({"role": "user", "content": process_new_user_message(message)}) + + template_kwargs: dict = { + "tokenize": True, + "return_dict": True, + "return_tensors": "pt", + "add_generation_prompt": True, + "load_audio_from_video": _has_media_type(messages, "video"), + "processor_kwargs": {"images_kwargs": {"max_soft_tokens": max_soft_tokens}}, + } + if thinking: + template_kwargs["enable_thinking"] = True + + inputs = processor.apply_chat_template(messages, **template_kwargs) + + n_tokens = inputs["input_ids"].shape[1] + if n_tokens > MAX_INPUT_TOKENS: + msg = f"Input too long ({n_tokens} tokens). Maximum is {MAX_INPUT_TOKENS} tokens." + raise gr.Error(msg) + + yield from _generate_on_gpu(inputs=inputs, max_new_tokens=max_new_tokens, thinking=thinking) + + +examples = [ + # --- Text-only examples --- + [ + { + "text": "What is the capital of France?", + "files": [], + } + ], + [ + { + "text": "What is the water formula?", + "files": [], + } + ], + [ + { + "text": "Explain quantum entanglement in simple terms.", + "files": [], + } + ], + [ + { + "text": "I want to do a car wash that is 50 meters away, should I walk or drive?", + "files": [], + } + ], + [ + { + "text": "Write a poem about beer with 4 stanzas. Format the title as an H2 markdown heading and bold the first line of each stanza.", + "files": [], + } + ], + # --- Single-image examples --- + [ + { + "text": "Describe this image.", + "files": ["https://news.bbc.co.uk/media/images/38107000/jpg/_38107299_ronaldogoal_ap_300.jpg"], + } + ], + [ + { + "text": "What is the city in this image? Describe what you see.", + "files": ["https://imgmd.net/images/v1/guia/1698673/rio-de-janeiro-4-c.jpg"], + } + ], + # --- Multi-image examples --- + [ + { + "text": "What are the key similarities between these three images?", + "files": [ + "https://news.bbc.co.uk/media/images/38107000/jpg/_38107299_ronaldogoal_ap_300.jpg", + "https://ogimg.infoglobo.com.br/in/12547538-502-0e0/FT1086A/94-8705-14.jpg", + "https://amazonasatual.com.br/wp-content/uploads/2021/01/Pele.jpg", + ], + } + ], + # --- Audio examples --- + [ + { + "text": "Transcribe the audio.", + "files": [ + "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/bcn_weather.mp3" + ], + } + ], + [ + { + "text": "Translate to Dutch.", + "files": [ + "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/bcn_weather.mp3" + ], + } + ], + # --- Video examples --- + [ + { + "text": "What is happening in this video?", + "files": ["https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"], + } + ], +] + +demo = gr.ChatInterface( + fn=generate, + validator=validate_input, + chatbot=gr.Chatbot( + scale=1, + latex_delimiters=[ + {"left": "$$", "right": "$$", "display": True}, + {"left": "$", "right": "$", "display": False}, + {"left": "\\(", "right": "\\)", "display": False}, + {"left": "\\[", "right": "\\]", "display": True}, + ], + reasoning_tags=[(THINKING_START, THINKING_END)], + ), + textbox=gr.MultimodalTextbox( + sources=["upload", "microphone"], + file_types=[*IMAGE_FILE_TYPES, *AUDIO_FILE_TYPES, *VIDEO_FILE_TYPES], + file_count="multiple", + autofocus=True, + ), + multimodal=True, + additional_inputs=[ + gr.Checkbox(label="Thinking", value=False), + gr.Slider(label="Max New Tokens", minimum=100, maximum=4000, step=10, value=2000), + gr.Dropdown( + label="Image Token Budget", + info="Higher values preserve more visual detail (useful for OCR/documents). Lower values are faster.", + choices=[70, 140, 280, 560, 1120], + value=280, + ), + gr.Textbox(label="System Prompt", value=""), + ], + additional_inputs_accordion=gr.Accordion("Settings", open=True), + stop_btn=False, + title="Gemma 4 E4B It", + examples=examples, + run_examples_on_click=False, + cache_examples=False, + delete_cache=(1800, 1800), +) + +if __name__ == "__main__": + demo.launch(css_paths="style.css", max_file_size="20MB") diff --git a/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-requirements.txt b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-requirements.txt new file mode 100644 index 0000000..d734b3c --- /dev/null +++ b/tooling/huggingface/spaces/huggingface-projects_gemma-4-e4b-it-requirements.txt @@ -0,0 +1,362 @@ +# This file was autogenerated by uv via the following command: +# uv export --no-hashes --no-dev --group hf-spaces --no-emit-package typer-slim --no-emit-package spaces -o requirements.txt +accelerate==1.13.0 + # via gemma-4-e4b-it +aiohappyeyeballs==2.6.1 + # via aiohttp +aiohttp==3.13.5 + # via fsspec +aiosignal==1.4.0 + # via aiohttp +annotated-doc==0.0.4 + # via + # fastapi + # typer +annotated-types==0.7.0 + # via pydantic +anyio==4.13.0 + # via + # gradio + # httpx + # mcp + # sse-starlette + # starlette +attrs==26.1.0 + # via + # aiohttp + # jsonschema + # referencing +audioop-lts==0.2.2 ; python_full_version >= '3.13' + # via gradio +brotli==1.2.0 + # via gradio +certifi==2026.2.25 + # via + # httpcore + # httpx + # requests +cffi==2.0.0 ; platform_python_implementation != 'PyPy' + # via cryptography +charset-normalizer==3.4.7 + # via requests +click==8.3.2 + # via + # typer + # uvicorn +colorama==0.4.6 ; sys_platform == 'win32' + # via + # click + # tqdm +cryptography==46.0.7 + # via pyjwt +datasets==4.8.4 +dill==0.4.1 + # via + # datasets + # multiprocess +fastapi==0.136.0 + # via gradio +filelock==3.28.0 + # via + # datasets + # huggingface-hub + # torch +frozenlist==1.8.0 + # via + # aiohttp + # aiosignal +fsspec==2026.2.0 + # via + # datasets + # gradio-client + # huggingface-hub + # torch +gradio==6.12.0 + # via + # gemma-4-e4b-it + # spaces +gradio-client==2.4.1 + # via + # gradio + # hf-gradio +groovy==0.1.2 + # via gradio +h11==0.16.0 + # via + # httpcore + # uvicorn +hf-gradio==0.4.0 + # via gradio +hf-xet==1.4.3 ; platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64' + # via huggingface-hub +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via + # datasets + # gradio + # gradio-client + # huggingface-hub + # mcp + # safehttpx + # spaces +httpx-sse==0.4.3 + # via mcp +huggingface-hub==1.11.0 + # via + # accelerate + # datasets + # gradio + # gradio-client + # tokenizers + # transformers +idna==3.11 + # via + # anyio + # httpx + # requests + # yarl +jinja2==3.1.6 + # via + # gradio + # torch +jsonschema==4.26.0 + # via mcp +jsonschema-specifications==2025.9.1 + # via jsonschema +markdown-it-py==4.0.0 + # via rich +markupsafe==3.0.3 + # via + # gradio + # jinja2 +mcp==1.27.0 + # via gradio +mdurl==0.1.2 + # via markdown-it-py +mpmath==1.3.0 + # via sympy +multidict==6.7.1 + # via + # aiohttp + # yarl +multiprocess==0.70.19 + # via datasets +networkx==3.6.1 + # via torch +numpy==2.4.4 + # via + # accelerate + # datasets + # gradio + # pandas + # torchvision + # transformers +nvidia-cublas-cu12==12.8.4.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cudnn-cu12 + # nvidia-cusolver-cu12 + # torch +nvidia-cuda-cupti-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cuda-nvrtc-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cuda-runtime-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cudnn-cu12==9.10.2.21 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cufft-cu12==11.3.3.83 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cufile-cu12==1.13.1.3 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-curand-cu12==10.3.9.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cusolver-cu12==11.7.3.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-cusparse-cu12==12.5.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cusolver-cu12 + # torch +nvidia-cusparselt-cu12==0.7.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nccl-cu12==2.27.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nvjitlink-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via + # nvidia-cufft-cu12 + # nvidia-cusolver-cu12 + # nvidia-cusparse-cu12 + # torch +nvidia-nvshmem-cu12==3.3.20 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +nvidia-nvtx-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +orjson==3.11.8 + # via gradio +packaging==26.1 + # via + # accelerate + # datasets + # gradio + # gradio-client + # huggingface-hub + # spaces + # transformers +pandas==3.0.2 + # via + # datasets + # gradio +pillow==12.2.0 + # via + # gradio + # torchvision +propcache==0.4.1 + # via + # aiohttp + # yarl +psutil==5.9.8 + # via + # accelerate + # spaces +pyarrow==23.0.1 + # via datasets +pycparser==3.0 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy' + # via cffi +pydantic==2.12.5 + # via + # fastapi + # gradio + # mcp + # pydantic-settings + # spaces +pydantic-core==2.41.5 + # via pydantic +pydantic-settings==2.13.1 + # via mcp +pydub==0.25.1 + # via gradio +pygments==2.20.0 + # via rich +pyjwt==2.12.1 + # via mcp +python-dateutil==2.9.0.post0 + # via pandas +python-dotenv==1.2.2 + # via pydantic-settings +python-multipart==0.0.26 + # via + # gradio + # mcp +pytz==2026.1.post1 + # via gradio +pywin32==311 ; sys_platform == 'win32' + # via mcp +pyyaml==6.0.3 + # via + # accelerate + # datasets + # gradio + # huggingface-hub + # transformers +referencing==0.37.0 + # via + # jsonschema + # jsonschema-specifications +regex==2026.4.4 + # via transformers +requests==2.33.1 + # via + # datasets + # spaces +rich==15.0.0 + # via typer +rpds-py==0.30.0 + # via + # jsonschema + # referencing +safehttpx==0.1.7 + # via gradio +safetensors==0.7.0 + # via + # accelerate + # transformers +semantic-version==2.10.0 + # via gradio +setuptools==82.0.1 + # via torch +shellingham==1.5.4 + # via typer +six==1.17.0 + # via python-dateutil +sse-starlette==3.3.4 + # via mcp +starlette==1.0.0 + # via + # fastapi + # gradio + # mcp + # sse-starlette +sympy==1.14.0 + # via torch +tokenizers==0.22.2 + # via transformers +tomlkit==0.14.0 + # via gradio +torch==2.9.1 + # via + # accelerate + # gemma-4-e4b-it + # torchvision +torchcodec==0.9.1 + # via gemma-4-e4b-it +torchvision==0.24.1 + # via gemma-4-e4b-it +tqdm==4.67.3 + # via + # datasets + # huggingface-hub + # transformers +transformers==5.5.4 + # via gemma-4-e4b-it +triton==3.5.1 ; platform_machine == 'x86_64' and sys_platform == 'linux' + # via torch +typer==0.24.1 + # via + # gradio + # hf-gradio + # huggingface-hub + # transformers +typing-extensions==4.15.0 + # via + # aiosignal + # anyio + # fastapi + # gradio + # gradio-client + # huggingface-hub + # mcp + # pydantic + # pydantic-core + # referencing + # spaces + # starlette + # torch + # typing-inspection +typing-inspection==0.4.2 + # via + # fastapi + # mcp + # pydantic + # pydantic-settings +tzdata==2026.1 ; sys_platform == 'emscripten' or sys_platform == 'win32' + # via pandas +urllib3==2.6.3 + # via requests +uvicorn==0.44.0 + # via + # gradio + # mcp +xxhash==3.6.0 + # via datasets +yarl==1.23.0 + # via aiohttp diff --git a/tooling/huggingface/transformers/__init__.py b/tooling/huggingface/transformers/__init__.py new file mode 100644 index 0000000..d108443 --- /dev/null +++ b/tooling/huggingface/transformers/__init__.py @@ -0,0 +1,33 @@ +# Copyright 2026 the HuggingFace Team. 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. + +from typing import TYPE_CHECKING + +from ...utils import _LazyModule +from ...utils.import_utils import define_import_structure + + +if TYPE_CHECKING: + from .configuration_gemma4 import * + from .feature_extraction_gemma4 import * + from .image_processing_gemma4 import * + from .image_processing_pil_gemma4 import * + from .modeling_gemma4 import * + from .processing_gemma4 import * + from .video_processing_gemma4 import * +else: + import sys + + _file = globals()["__file__"] + sys.modules[__name__] = _LazyModule(__name__, _file, define_import_structure(_file), module_spec=__spec__) diff --git a/tooling/huggingface/transformers/configuration_gemma4.py b/tooling/huggingface/transformers/configuration_gemma4.py new file mode 100644 index 0000000..7ae940d --- /dev/null +++ b/tooling/huggingface/transformers/configuration_gemma4.py @@ -0,0 +1,352 @@ +# Copyright 2026 the HuggingFace Team. 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. + +from typing import Any, Literal + +from huggingface_hub.dataclasses import strict + +from ...configuration_utils import PreTrainedConfig +from ...utils import auto_docstring, logging +from ...utils.type_validators import interval + + +logger = logging.get_logger(__name__) + + +@auto_docstring(checkpoint="google/gemma-4-e2b-it") +@strict +class Gemma4AudioConfig(PreTrainedConfig): + r""" + subsampling_conv_channels (`list[int]`, defaults to `[128, 32]`): + Channel sizes for the convolutional layers in the Sub-sample Convolution Projection. + residual_weight (`float`, defaults to `0.5`): + Scaling applied to hidden_states prior to combining with the residual in the feedforward. + attention_chunk_size (`int`, defaults to `12`): + The sub-sequence size for attention processing. + attention_context_left (`int`, defaults to `13`): + The leftward context size for the attention chunk. + attention_context_right (`int`, defaults to `0`): + The rightward context size for the attention chunk. + attention_logit_cap (`float`, defaults to `50.0`): + Cap applied to attention weights. + attention_invalid_logits_value (`float`, defaults to `1e-9`): + Value to use for invalid logits in attention. + use_clipped_linears (`bool`, defaults to `True`): + If true, apply clipping to the Linear layers, drawing bounds from the model checkpoint. + gradient_clipping (`float`, defaults to `1e10`): + Clipping value used to stabilize extremely large gradient values. + output_proj_dims (`int`, defaults to `1536`): + Dimension of the final linear projection from `hidden_size` to the model's output. + """ + + model_type = "gemma4_audio" + + hidden_size: int = 1024 + num_hidden_layers: int = 12 + num_attention_heads: int = 8 + hidden_act: str = "silu" + + # subsampling parameters + subsampling_conv_channels: list[int] | tuple[int, int] = (128, 32) + + # conformer parameters + conv_kernel_size: int = 5 + residual_weight: float = 0.5 + attention_chunk_size: int = 12 + attention_context_left: int = 13 + attention_context_right: int = 0 + attention_logit_cap: float = 50.0 + attention_invalid_logits_value: float = -1.0e9 + + use_clipped_linears: bool = True + rms_norm_eps: float = 1e-6 + gradient_clipping: float = 1e10 + output_proj_dims: int = 1536 + initializer_range: float = interval(min=0.0, max=1.0)(default=0.02) + + def __post_init__(self, **kwargs): + # JSON serialization converts tuples to lists, convert back + if isinstance(self.subsampling_conv_channels, tuple): + self.subsampling_conv_channels = list(self.subsampling_conv_channels) + super().__post_init__(**kwargs) + + +@auto_docstring(checkpoint="google/gemma-4-e2b-it") +@strict +class Gemma4TextConfig(PreTrainedConfig): + r""" + use_bidirectional_attention (`str`, *optional*): + Controls bidirectional attention behavior. When set to `"vision"`, vision tokens + attend bidirectionally while text tokens use causal attention. When set to `"all"`, + all tokens use bidirectional attention. + vocab_size_per_layer_input (`int`, defaults to 262144): + Vocabulary size for the per-layer input embeddings (PLE). Used by models with + per-layer residual streams where a smaller embedding is added at each decoder layer. + hidden_size_per_layer_input (`int`, defaults to 256): + Per-layer hidden dimension for the PLE system. The actual embedding weight has shape + `[vocab_size_per_layer_input, num_hidden_layers * hidden_size_per_layer_input]` + because all layers are packed into a single table. See the [Gemma4](https://huggingface.co/docs/transformers/main/en/model_doc/gemma4#per-layer-embeddings-ple) docs + for a description of the full PLE pipeline. + num_global_key_value_heads (`int`, *optional*): + Number of key-value heads for global (full) attention layers. If `None`, defaults + to `num_key_value_heads`. + global_head_dim (`int`, defaults to 512): + Dimension of each attention head in global (full) attention layers. + attention_k_eq_v (`bool`, defaults to `False`): + Whether keys and values share the same projection weights. When `True`, the key + projection output is reused as the value projection. + num_kv_shared_layers (`int`, defaults to 0): + Number of consecutive decoder layers that share the same key-value projections. + A value of 0 means no sharing (each layer has independent KV projections). + enable_moe_block (`bool`, defaults to `False`): + Whether to enable Mixture-of-Experts (MoE) blocks in the decoder layers. When + `True`, eligible layers will use a sparse MoE feed-forward network. + use_double_wide_mlp (`bool`, defaults to `False`): + Whether to use a double-width MLP with fused gate and up projections. + top_k_experts (`int`, *optional*): + Number of experts activated per token in MoE layers. Only used when + `enable_moe_block=True`. + moe_intermediate_size (`int`, *optional*): + Intermediate (hidden) size of each expert's feed-forward network in MoE layers. + Only used when `enable_moe_block=True`. + """ + + model_type = "gemma4_text" + keys_to_ignore_at_inference = ["past_key_values"] + base_model_tp_plan = { + "layers.*.self_attn.q_proj": "colwise", + "layers.*.self_attn.k_proj": "colwise", + "layers.*.self_attn.v_proj": "colwise", + "layers.*.self_attn.q_norm": "replicated_with_grad_allreduce", + "layers.*.self_attn.k_norm": "replicated_with_grad_allreduce", + "layers.*.self_attn.o_proj": "rowwise", + "layers.*.mlp.gate_proj": "colwise", + "layers.*.mlp.up_proj": "colwise", + "layers.*.mlp.down_proj": "rowwise", + "layers.*.experts.gate_up_proj": "packed_colwise", + "layers.*.experts.down_proj": "rowwise", + "layers.*.experts": "moe_tp_experts", + } + base_model_pp_plan = { + "embed_tokens": (["input_ids"], ["inputs_embeds"]), + "layers": (["hidden_states", "attention_mask"], ["hidden_states"]), + "norm": (["hidden_states"], ["hidden_states"]), + } + + vocab_size: int = 262_144 + hidden_size: int = 2304 + intermediate_size: int = 9216 + num_hidden_layers: int = 30 + num_attention_heads: int = 8 + num_key_value_heads: int = 4 + head_dim: int = 256 + hidden_activation: str = "gelu_pytorch_tanh" + max_position_embeddings: int = 131_072 + initializer_range: float = 0.02 + rms_norm_eps: float = 1e-6 + use_cache: bool = True + pad_token_id: int | None = 0 + eos_token_id: int | list[int] | None = 1 + bos_token_id: int | None = 2 + tie_word_embeddings: bool = True + rope_parameters: dict | None = None + attention_bias: bool = False + attention_dropout: int | float | None = 0.0 + sliding_window: int = 512 + layer_types: list[str] | None = None + final_logit_softcapping: float | None = None + use_bidirectional_attention: Literal["all", "vision"] | None = None + vocab_size_per_layer_input: int = 262_144 + hidden_size_per_layer_input: int = 256 + num_global_key_value_heads: int | None = None + global_head_dim: int = 512 + attention_k_eq_v: bool = False + num_kv_shared_layers: int = 0 + enable_moe_block: bool = False + use_double_wide_mlp: bool = False + num_experts: int | None = None + top_k_experts: int | None = None + moe_intermediate_size: int | None = None + + def __post_init__(self, **kwargs): + if self.use_bidirectional_attention == "all": + self.sliding_window = (self.sliding_window // 2) + 1 # due to fa we set exclusive bounds + + if self.layer_types is None: + sliding_window_pattern = 6 # by default 5:1 + self.layer_types = [ + "sliding_attention" if bool((i + 1) % sliding_window_pattern) else "full_attention" + for i in range(self.num_hidden_layers) + ] + + if self.layer_types and (last_layer_type := self.layer_types[-1]) != "full_attention": + logger.warning( + f"Last layer must use `full_attention`, but got `{last_layer_type}`. Forcing last layer to `full_attention`." + ) + self.layer_types[-1] = "full_attention" + + default_rope_params: dict[Literal["full_attention", "sliding_attention"] : dict[str, Any]] = { + "sliding_attention": {"rope_type": "default", "rope_theta": 10_000.0}, + "full_attention": {"rope_type": "proportional", "partial_rotary_factor": 0.25, "rope_theta": 1_000_000.0}, + } + if self.rope_parameters is None: + self.rope_parameters = default_rope_params + + super().__post_init__(**kwargs) + + def convert_rope_params_to_dict(self, **kwargs): + # No need to handle BC for new models, because they have no old-format `rope_scaling` + return kwargs + + +@auto_docstring(checkpoint="google/gemma-4-e2b-it") +@strict +class Gemma4VisionConfig(PreTrainedConfig): + r""" + pooling_kernel_size (`int`, *optional*): + Spatial pooling kernel size applied after patchification. + position_embedding_size (`int`, defaults to 10240): + Maximum number of position embeddings for the vision encoder. Controls the size of + the learned 2D position embedding table used by the patch embedder. + use_clipped_linears (`bool`, defaults to `False`): + Whether to use weight-clipped linear layers. When enabled, linear layer weights are + clamped to a fixed range during the forward pass to improve numerical stability. + standardize (`bool`, defaults to `False`): + If true, applies a bias and scale to the soft tokens returned from the pooler. + """ + + model_type = "gemma4_vision" + base_model_tp_plan = { + "encoder.layers.*.self_attn.q_proj": "colwise", + "encoder.layers.*.self_attn.k_proj": "colwise", + "encoder.layers.*.self_attn.v_proj": "colwise", + "encoder.layers.*.self_attn.q_norm": "replicated_with_grad_allreduce", + "encoder.layers.*.self_attn.k_norm": "replicated_with_grad_allreduce", + "encoder.layers.*.self_attn.o_proj": "rowwise", + "encoder.layers.*.mlp.gate_proj": "colwise", + "encoder.layers.*.mlp.up_proj": "colwise", + "encoder.layers.*.mlp.down_proj": "rowwise", + } + default_theta = 100.0 + + hidden_size: int = 768 + intermediate_size: int = 3072 + num_hidden_layers: int = 16 + num_attention_heads: int = 12 + num_key_value_heads: int = 12 + head_dim: int = 64 + hidden_activation: str = "gelu_pytorch_tanh" + rms_norm_eps: float = 1e-6 + max_position_embeddings: int = 131_072 + attention_bias: bool | None = False + attention_dropout: float | None = 0.0 + rope_parameters: dict | None = None + pooling_kernel_size: int = 3 + patch_size: int = 16 + position_embedding_size: int = 10 * 1024 + use_clipped_linears: bool = False + standardize: bool = False + initializer_range: float = 0.02 + + def __post_init__(self, **kwargs): + if self.rope_parameters is None: + self.rope_parameters = {"rope_type": "default", "rope_theta": 100.0} + + super().__post_init__(**kwargs) + + +@auto_docstring(checkpoint="google/gemma-4-e2b-it") +@strict +class Gemma4Config(PreTrainedConfig): + r""" + boi_token_id (`int`, *optional*, defaults to 255999): + The begin-of-image token index to wrap the image prompt. + eoi_token_id (`int`, *optional*, defaults to 258882): + The end-of-image token index to wrap the image prompt. + boa_token_id (`int`, *optional*, defaults to 256000): + The begin-of-audio token index to wrap the audio prompt. + eoa_token_index (`int`, *optional*, defaults to 258883): + The end-of-audio token index to wrap the audio prompt. + + Example: + + ```python + >>> from transformers import ( + >>> Gemma4AudioConfig, + >>> Gemma4Config, + >>> Gemma4ForConditionalGeneration, + >>> Gemma4TextConfig, + >>> Gemma4VisionConfig, + >>> ) + + >>> # Initializing a Gemma 4 Audio config. + >>> audio_config = Gemma4AudioConfig() + + >>> # Initializing a Gemma 4 Text config. + >>> text_config = Gemma4TextConfig() + + >>> # Initializing a Gemma 4 vision config. + >>> vision_config = Gemma4VisionConfig() + + >>> # Initializing a Gemma 4 config similar to google/gemma-4-e2b-it + >>> configuration = Gemma4Config(text_config, vision_config, audio_config) + + >>> # Initializing a model from the google/gemma-4-e2b-it configuration + >>> model = Gemma4ForConditionalGeneration(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "gemma4" + sub_configs = { + "text_config": Gemma4TextConfig, + "vision_config": Gemma4VisionConfig, + "audio_config": Gemma4AudioConfig, + } + + text_config: Gemma4TextConfig | dict[str, Any] | None = None + vision_config: Gemma4VisionConfig | dict[str, Any] | None = None + audio_config: Gemma4AudioConfig | dict[str, Any] | None = None + boi_token_id: int | None = 255_999 + eoi_token_id: int | None = 258_882 + image_token_id: int | None = 258_880 + video_token_id: int | None = 258_884 + boa_token_id: int | None = 256_000 + eoa_token_index: int | None = 258_883 + audio_token_id: int | None = 258_881 + initializer_range: float | None = 0.02 + tie_word_embeddings: bool = True + + def __post_init__(self, **kwargs): + if self.text_config is None: + self.text_config = Gemma4TextConfig() + logger.info("text_config is None. Using default Gemma4TextConfig.") + elif isinstance(self.text_config, dict): + self.text_config = Gemma4TextConfig(**self.text_config) + + if self.vision_config is None: + logger.info("vision_config is None. Gemma4Model.vision_tower will not be initialized.") + if isinstance(self.vision_config, dict): + self.vision_config = Gemma4VisionConfig(**self.vision_config) + + if self.audio_config is None: + logger.info("audio_config is None. Gemma4Model.audio_tower will not be initialized.") + if isinstance(self.audio_config, dict): + self.audio_config = Gemma4AudioConfig(**self.audio_config) + + super().__post_init__(**kwargs) + + +__all__ = ["Gemma4AudioConfig", "Gemma4Config", "Gemma4TextConfig", "Gemma4VisionConfig"] diff --git a/tooling/huggingface/transformers/feature_extraction_gemma4.py b/tooling/huggingface/transformers/feature_extraction_gemma4.py new file mode 100644 index 0000000..38382e8 --- /dev/null +++ b/tooling/huggingface/transformers/feature_extraction_gemma4.py @@ -0,0 +1,298 @@ +# Copyright 2026 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. + +import math +import warnings +from collections.abc import Sequence + +import numpy as np + +from ...audio_utils import mel_filter_bank, window_function +from ...feature_extraction_sequence_utils import SequenceFeatureExtractor +from ...feature_extraction_utils import BatchFeature +from ...utils import PaddingStrategy, TensorType, logging + + +logger = logging.get_logger(__name__) + + +def _unfold(array: np.ndarray, dimension: int, size: int, step: int) -> np.ndarray: + """A basic NumPy equivalent of PyTorch's unfold for 2D arrays along the last dim.""" + if array.ndim != 2: + raise ValueError("This unfold implementation currently supports 2D arrays (batch, time).") + if dimension != -1 and dimension != array.ndim - 1: + raise ValueError("This unfold implementation only supports unfolding the last dimension.") + + batch_size, original_length = array.shape + num_frames = (original_length - size) // step + 1 + + if num_frames <= 0: + return np.zeros((batch_size, 0, size), dtype=array.dtype) + + output_shape = (batch_size, num_frames, size) + output_strides = (array.strides[0], array.strides[1] * step, array.strides[1]) + + return np.lib.stride_tricks.as_strided(array, shape=output_shape, strides=output_strides) + + +class Gemma4AudioFeatureExtractor(SequenceFeatureExtractor): + """An audio feature extractor Universal Speech Models https://huggingface.co/papers/2303.01037. + + Args: + feature_size (`int`, *optional*, defaults to 128): + The feature dimension of the extracted features. + sampling_rate (`int`, *optional*, defaults to 16000): + The sampling rate at which the audio files should be digitalized expressed in hertz (Hz). + padding_value (`float`, *optional*, defaults to 0.0): + Padding value used to pad the audio. Should correspond to silences. + return_attention_mask (`bool`, *optional*, defaults to `True`): + Whether to return the attention mask for the generated MEL spectrograms. + frame_length_ms (`float`, *optional*, defaults to 20.0): + The length of a frame in milliseconds. + hop_length_ms (`float`, *optional*, defaults to 10.0): + Length of the overlapping windows for the STFT used to obtain the Mel Frequency coefficients. + min_frequency (`float`, *optional*, defaults to 0.0): + The minimum frequency (in Hz) for the Mel filterbank. + max_frequency (`float`, *optional*, defaults to 8000.0): + The maximum frequency (in Hz) for the Mel filterbank. + preemphasis (`float`, *optional*, defaults to 0.0): + The preemphasis coefficient. + preemphasis_htk_flavor (`bool`, *optional*, defaults to `True`): + Whether to use HTK-style preemphasis. + fft_overdrive (`bool`, *optional*, defaults to `False`): + Whether to use FFT overdrive. + dither (`float`, *optional*, defaults to 0.0): + Adds dithering. In other words, adds a small Gaussian noise to each frame. + E.g. use 0.0001 to add dithering with a normal distribution centered + around 0.0 with standard deviation 0.0001 (assuming [-1,+1] range of raw_speech). + The value 0.0 means no dithering. + Dithering has similar effect as `spectrogram(mel_floor=...)`. It reduces + the high log_mel_fbank values for signals with hard-zero sections, + when VAD cutoff is present in the signal. + input_scale_factor (`float`, *optional*, defaults to 1.0): + Scaling factor applied to the input waveform. + mel_floor (`float`, *optional*, defaults to 0.001): + Minimum value for Mel spectrograms to avoid log(0). + per_bin_mean (`Optional[Sequence[float]]`, *optional*): + Mean values for per-bin normalization. + per_bin_stddev (`Optional[Sequence[float]]`, *optional*): + Standard deviation values for per-bin normalization. + """ + + model_input_names = ["input_features", "input_features_mask"] + + def __init__( + self, + feature_size: int = 128, + sampling_rate: int = 16_000, + padding_value: float = 0.0, + return_attention_mask: bool = True, + frame_length_ms: float = 20.0, + hop_length_ms: float = 10.0, + min_frequency: float = 0.0, + max_frequency: float = 8000.0, + preemphasis: float = 0.0, + preemphasis_htk_flavor: bool = True, + fft_overdrive: bool = False, + dither: float = 0.0, + input_scale_factor: float = 1.0, + mel_floor: float = 1e-3, + per_bin_mean: Sequence[float] | None = None, + per_bin_stddev: Sequence[float] | None = None, + **kwargs, + ): + super().__init__( + feature_size=feature_size, + sampling_rate=sampling_rate, + padding_value=padding_value, + return_attention_mask=return_attention_mask, + **kwargs, + ) + + self.min_frequency = min_frequency + self.max_frequency = max_frequency + self.preemphasis = preemphasis + self.preemphasis_htk_flavor = preemphasis_htk_flavor + self.fft_overdrive = fft_overdrive + self.dither = dither + self.input_scale_factor = input_scale_factor + self.frame_length = int(round(sampling_rate * frame_length_ms / 1000.0)) + self.hop_length = int(round(sampling_rate * hop_length_ms / 1000.0)) + self.mel_floor = np.array(mel_floor, dtype=np.float64) + + fft_length = 2 ** math.ceil(math.log2(self.frame_length)) + if self.fft_overdrive: + fft_length *= 2 + self.fft_length = fft_length + + # Use periodic Hann window, matching sl.STFT default (signal.hann_window) + # For even frame_length: window[n] = 0.5 - 0.5 * cos(2*pi*n / frame_length) + self.window = window_function(self.frame_length).astype(np.float32) + + # Use HuggingFace's mel_filter_bank for compatibility. + # Suppress the expected warning about all-zero upper mel filters; + # with fft_length=512 (257 bins) and 128 mel filters the uppermost + # triangular filter falls between frequency bins, which is harmless. + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + self.mel_filters = mel_filter_bank( + num_frequency_bins=self.fft_length // 2 + 1, + num_mel_filters=feature_size, + min_frequency=min_frequency, + max_frequency=max_frequency, + sampling_rate=self.sampling_rate, + norm=None, + mel_scale="htk", + ) + + if per_bin_mean is not None: + self.per_bin_mean = np.array(per_bin_mean).reshape(1, 1, feature_size) + else: + self.per_bin_mean = None + + if per_bin_stddev is not None: + self.per_bin_stddev = np.array(per_bin_stddev).reshape(1, 1, feature_size) + else: + self.per_bin_stddev = None + + def _extract_spectrogram(self, waveform: np.ndarray, attention_mask: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """""" + if waveform.ndim == 1: # If single waveform, add batch dimension + waveform = np.expand_dims(waveform, axis=0) + + if self.dither > 0.0: + waveform = waveform + self.dither * np.random.randn(*waveform.shape).astype(waveform.dtype) + + if self.input_scale_factor != 1.0: + waveform = waveform * self.input_scale_factor + + # Semicausal time padding: prepend frame_length // 2 zeros so that the + # first STFT frame is centered at t=0, matching sl.STFT(time_padding='semicausal'). + pad_left = self.frame_length // 2 + waveform = np.pad(waveform, ((0, 0), (pad_left, 0)), mode="constant") + attention_mask = np.pad(attention_mask, (pad_left, 0), mode="constant", constant_values=0) + + frame_size_for_unfold = self.frame_length + 1 + + # NumPy equivalent of unfold for [B, NumFrames, frame_size_for_unfold] + frames_to_process = _unfold(waveform, dimension=-1, size=frame_size_for_unfold, step=self.hop_length) + + if self.preemphasis > 0.0: + if self.preemphasis_htk_flavor: + first_in_frame = frames_to_process[..., :1] * (1.0 - self.preemphasis) + rest_in_frame = frames_to_process[..., 1:-1] - self.preemphasis * frames_to_process[..., :-2] + frames = np.concatenate([first_in_frame, rest_in_frame], axis=-1) + else: + frames = frames_to_process[..., 1:] - self.preemphasis * frames_to_process[..., :-1] + else: + frames = frames_to_process[..., :-1] + + # Apply window, then RFFT. np.fft.rfft with n=fft_length implicitly + # right-pads frames to fft_length. + frames = frames * self.window # Broadcasting window + stft = np.fft.rfft(frames, n=self.fft_length, axis=-1) + + magnitude_spec = np.abs(stft) + + mel_spec = np.matmul(magnitude_spec, self.mel_filters) + log_mel_spec = np.log(mel_spec + self.mel_floor) + + if self.per_bin_mean is not None: + log_mel_spec = log_mel_spec - self.per_bin_mean # Broadcasting + + if self.per_bin_stddev is not None: + log_mel_spec = log_mel_spec / self.per_bin_stddev # Broadcasting + + mel_spectrogram = log_mel_spec.squeeze(0) + num_mel_frames = mel_spectrogram.shape[0] + + # Build a frame-aware mask: a mel frame is valid only when every sample + # in its analysis window [i*hop, i*hop + frame_size - 1] is real audio. + # We check this by looking at the last sample of each frame's window. + frame_end_indices = np.arange(num_mel_frames) * self.hop_length + frame_size_for_unfold - 1 + mask = attention_mask[frame_end_indices].astype(bool) + return mel_spectrogram, mask + + def __call__( + self, + raw_speech: np.ndarray | list[float] | list[np.ndarray] | list[list[float]], + padding: bool | str | PaddingStrategy = "longest", + max_length: int | None = 480_000, + truncation: bool = True, + pad_to_multiple_of: int | None = 128, + return_tensors: str | TensorType | None = None, + return_attention_mask: bool | None = True, + **kwargs, + ) -> BatchFeature: + """Creates a batch of MEL spectrograms from the provided raw speech. + + This implementation uses a different algorithm for windowing and preemphasis compared to the built-in + `transformers.audio_utils.spectrogram()` function that _will_ result in different outputs. Consider this + carefully when selecting an audio feature extractor, especially with pre-trained models. + + Args: + raw_speech: + The audio for which MEL spectrograms are created. + padding (`Union[bool, str, PaddingStrategy]`, *optional*, defaults to `"longest"`): + The padding strategy to use for batches of audio with different lengths. + max_length (`int`, *optional*, defaults to 480000): + If provided, defines the maximum length of the audio to allow. Audio longer than this will be + truncated if `truncation=True`. + truncation (`bool`, *optional*, defaults to `True`): + Whether or not to truncate audio above `max_length`. + pad_to_multiple_of (`int`, *optional*, defaults to 128): + When padding, pad to a multiple of this value. The default value is defined for optimal TPU support. + return_tensors (`Union[str, TensorType]`, *optional*, defaults to `None`): + The type of tensors to return (e.g., NumPy, or Torch). + return_attention_mask (`bool`, *optional*, defaults to `True`): + Whether to return the attention mask for the generated MEL spectrograms. + """ + + is_batched_numpy = isinstance(raw_speech, np.ndarray) and len(raw_speech.shape) > 1 + is_batched_sequence = isinstance(raw_speech, Sequence) and isinstance(raw_speech[0], (np.ndarray, Sequence)) + is_batched = is_batched_numpy or is_batched_sequence + + if is_batched: + raw_speech = [np.asarray([rs]).T for rs in raw_speech] + elif not is_batched and not isinstance(raw_speech, np.ndarray): + raw_speech = np.asarray(raw_speech) + + if not is_batched: # always return a batch + raw_speech = [np.asarray([raw_speech])] + + batched_speech = self.pad( + BatchFeature({"input_features": raw_speech}), + padding=padding, + max_length=max_length, + truncation=truncation, + pad_to_multiple_of=pad_to_multiple_of, + return_attention_mask=return_attention_mask, + ) + + prepared_speech = [] + prepared_speech_mask = [] + for speech, mask in zip(batched_speech.input_features, batched_speech.attention_mask): + speech, mask = self._extract_spectrogram(speech.T, mask) + prepared_speech.append(speech.astype(np.float32)) + prepared_speech_mask.append(mask) + + prepared_speech = [speech * mask[..., None] for speech, mask in zip(prepared_speech, prepared_speech_mask)] + + return BatchFeature( + {"input_features": prepared_speech, "input_features_mask": prepared_speech_mask}, + tensor_type=return_tensors, + ) + + +__all__ = ["Gemma4AudioFeatureExtractor"] diff --git a/tooling/huggingface/transformers/image_processing_gemma4.py b/tooling/huggingface/transformers/image_processing_gemma4.py new file mode 100644 index 0000000..88510d0 --- /dev/null +++ b/tooling/huggingface/transformers/image_processing_gemma4.py @@ -0,0 +1,220 @@ +# Copyright 2026 the HuggingFace Team. 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 torch +from torchvision.transforms.v2 import functional as F + +from ...image_processing_backends import TorchvisionBackend +from ...image_processing_utils import BatchFeature +from ...image_utils import ImageInput, PILImageResampling +from ...processing_utils import ImagesKwargs, Unpack +from ...utils import TensorType, auto_docstring, logging +from .image_processing_pil_gemma4 import _SUPPORTED_SOFT_TOKENS, get_aspect_ratio_preserving_size + + +logger = logging.get_logger(__name__) + + +# Copied from transformers.models.siglip2.image_processing_siglip2.convert_image_to_patches +def convert_image_to_patches(image: "torch.Tensor", patch_size: int) -> "torch.Tensor": + """ + Convert 3D tensor image of shape (num_channels, image_height, image_width) into 2D tensor of patches of shape + (num_patches_height * num_patches_width, patch_size * patch_size * num_channels). + """ + num_channels, image_height, image_width = image.shape + num_patches_height = image_height // patch_size + num_patches_width = image_width // patch_size + patched_image = image.reshape(num_channels, num_patches_height, patch_size, num_patches_width, patch_size) + patched_image = patched_image.permute(1, 3, 2, 4, 0) + patched_image = patched_image.reshape(num_patches_height * num_patches_width, -1) + return patched_image + + +# Adopted from Siglip2 (mask -> position ids) +def pad_along_first_dim( + image: "torch.Tensor", positions: "torch.Tensor", target_length: int +) -> tuple["torch.Tensor", "torch.Tensor"]: + """ + Pad the tensor along the first dimension. + """ + current_length = image.shape[0] + padding_length = target_length - current_length + if padding_length > 0: + padding = [0, 0] * (image.ndim - 1) + [0, padding_length] + pos_padding = (0, 0, 0, padding_length) + image = torch.nn.functional.pad(image, padding, mode="constant", value=0) + positions = torch.nn.functional.pad(positions, pos_padding, mode="constant", value=-1) + return image, positions + + +class Gemma4ImageProcessorKwargs(ImagesKwargs, total=False): + """ + patch_size (`int`, *optional*): + Size of each image patch in pixels. + max_soft_tokens (`int`, *optional*): + Maximum number of soft (vision) tokens per image. + Must be one of {70, 140, 280, 560, 1120}. + pooling_kernel_size (`int`, *optional*): + Spatial pooling kernel size applied after patchification. + """ + + patch_size: int + max_soft_tokens: int + pooling_kernel_size: int + + +@auto_docstring(custom_intro="Constructs a Gemma4 image processor.") +class Gemma4ImageProcessor(TorchvisionBackend): + resample = PILImageResampling.BICUBIC + image_mean = [0.0, 0.0, 0.0] + image_std = [1.0, 1.0, 1.0] + size = None + default_to_square = True + do_convert_rgb = True + do_resize = True + do_rescale = True + do_normalize = False + patch_size = 16 + max_soft_tokens = 280 + pooling_kernel_size = 3 + valid_kwargs = Gemma4ImageProcessorKwargs + model_input_names = ["pixel_values", "image_position_ids", "num_soft_tokens_per_image"] + + def __init__(self, **kwargs: Unpack[Gemma4ImageProcessorKwargs]): + super().__init__(**kwargs) + + if self.max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {self.max_soft_tokens}.") + + def _validate_preprocess_kwargs(self, **kwargs): + # Gemma4 uses aspect_ratio_preserving_resize driven by patch_size, + # max_soft_tokens, and pooling_kernel_size — not the standard `size` + # parameter. Temporarily disable do_resize so the base validation + # doesn't require `size` to be set. + kwargs["do_resize"] = False + super()._validate_preprocess_kwargs(**kwargs) + + def aspect_ratio_preserving_resize( + self, + image: torch.Tensor, + patch_size: int, + max_patches: int, + pooling_kernel_size: int, + resample: F.InterpolationMode, + ) -> torch.Tensor: + height, width = image.shape[-2], image.shape[-1] + target_height, target_width = get_aspect_ratio_preserving_size( + height=height, + width=width, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + ) + + if target_height == height and target_width == width: + return image + + return F.resize( + image, + size=[target_height, target_width], + interpolation=resample, + antialias=True, + ) + + def preprocess( + self, + images: ImageInput, + **kwargs: Unpack[Gemma4ImageProcessorKwargs], + ) -> BatchFeature: + return super().preprocess(images, **kwargs) + + def _preprocess( + self, + images: list["torch.Tensor"], + do_resize: bool, + resample: "PILImageResampling | F.InterpolationMode | int | None", + do_rescale: bool, + rescale_factor: float, + do_normalize: bool, + image_mean: float | list[float] | None, + image_std: float | list[float] | None, + return_tensors: str | TensorType | None, + patch_size: int | None = None, + max_soft_tokens: int | None = None, + pooling_kernel_size: int | None = None, + **kwargs, + ) -> BatchFeature: + if max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {max_soft_tokens}.") + + # Compute max_patches from max_soft_tokens and pooling_kernel_size + max_patches = max_soft_tokens * pooling_kernel_size**2 + + # Process each image individually: resize, rescale/normalize, patchify, pad. + # Images have different aspect ratios and thus different resized dimensions, + # so patchification and padding must happen per-image before stacking. + pixel_values = [] + position_ids = [] + num_soft_tokens_per_image = [] + + for image in images: + # Step 1: Aspect-ratio-preserving resize + if do_resize: + image = self.aspect_ratio_preserving_resize( + image=image, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + resample=resample, + ) + + # Step 2: Rescale pixel values (typically to [0, 1]) and optionally identity normalize + image = self.rescale_and_normalize(image, do_rescale, rescale_factor, do_normalize, image_mean, image_std) + + # Step 3: Patchify the image + # (num_channels, height, width) -> (num_patches, patch_size * patch_size * num_channels) + patch_height = image.shape[-2] // patch_size + patch_width = image.shape[-1] // patch_size + patches = convert_image_to_patches(image, patch_size) + num_soft_tokens_per_image.append(patches.shape[0] // pooling_kernel_size**2) + + # Step 5: Compute position IDs + device = image.device + patch_grid = torch.meshgrid( + torch.arange(patch_width, device=device), + torch.arange(patch_height, device=device), + indexing="xy", + ) + stacked_grid = torch.stack(patch_grid, dim=-1) + real_positions = stacked_grid.reshape(patches.shape[0], 2) + + # Step 6. Pad pacthes and positions to `max_patches` + patches, positions = pad_along_first_dim(patches, real_positions, max_patches) + pixel_values.append(patches) + position_ids.append(positions) + + # Stack into batch tensors + pixel_values = torch.stack(pixel_values, dim=0) # (batch, max_patches, patch_pixels) + position_ids = torch.stack(position_ids, dim=0) # (batch, max_patches, 2) + + data = { + "pixel_values": pixel_values, + "image_position_ids": position_ids, + "num_soft_tokens_per_image": num_soft_tokens_per_image, + } + return BatchFeature(data=data, tensor_type=return_tensors) + + +__all__ = ["Gemma4ImageProcessor"] diff --git a/tooling/huggingface/transformers/image_processing_pil_gemma4.py b/tooling/huggingface/transformers/image_processing_pil_gemma4.py new file mode 100644 index 0000000..d58f6a4 --- /dev/null +++ b/tooling/huggingface/transformers/image_processing_pil_gemma4.py @@ -0,0 +1,278 @@ +# Copyright 2026 the HuggingFace Team. 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 math + +import numpy as np + +from ...image_processing_backends import PilBackend +from ...image_processing_utils import BatchFeature +from ...image_transforms import resize +from ...image_utils import ImageInput +from ...processing_utils import ImagesKwargs, Unpack +from ...utils import TensorType, auto_docstring, is_vision_available, logging + + +if is_vision_available(): + from ...image_utils import PILImageResampling + + +logger = logging.get_logger(__name__) + +_SUPPORTED_SOFT_TOKENS = (70, 140, 280, 560, 1120) + + +def get_aspect_ratio_preserving_size( + height: int, + width: int, + patch_size: int, + max_patches: int, + pooling_kernel_size: int, +) -> tuple[int, int]: + """ + Image is resized to preserve aspect ratio so it fits within the patch budget. + Target dimensions are the largest that: + 1) Produce at most `max_patches` patches when patchified with `patch_size` + 2) Have height and width divisible by `pooling_kernel_size * patch_size` + """ + total_px = height * width + target_px = max_patches * (patch_size**2) + factor = math.sqrt(target_px / total_px) + ideal_height = factor * height + ideal_width = factor * width + side_mult = pooling_kernel_size * patch_size + + # Round down to nearest multiple of side_mult + target_height = int(math.floor(ideal_height / side_mult)) * side_mult + target_width = int(math.floor(ideal_width / side_mult)) * side_mult + + # Handle edge cases where one or both dimensions round to 0 + if target_height == 0 and target_width == 0: + raise ValueError( + "Attempting to resize to a 0 x 0 image. Resized height should be divisble by " + f"`pooling_kernel_size * patch_size`={pooling_kernel_size * patch_size}." + ) + + max_side_length = (max_patches // pooling_kernel_size**2) * side_mult + if target_height == 0: + target_height = side_mult + target_width = min( + int(math.floor(width / height)) * side_mult, + max_side_length, + ) + elif target_width == 0: + target_width = side_mult + target_height = min( + int(math.floor(height / width)) * side_mult, + max_side_length, + ) + + if target_height * target_width > target_px: + raise ValueError( + f"Resizing [{height}x{width}] to [{target_height}x{target_width}] " + f"but this exceeds {max_patches} patches with patch_size {patch_size}" + ) + + return target_height, target_width + + +# Copied from transformers.models.siglip2.image_processing_pil_siglip2.convert_image_to_patches +def convert_image_to_patches(image: np.ndarray, patch_size: int) -> np.ndarray: + """ + Convert 3D array image of shape (num_channels, image_height, image_width) into 2D array of patches of shape + (num_patches_height * num_patches_width, patch_size * patch_size * num_channels). + """ + num_channels, image_height, image_width = image.shape + num_patches_height = image_height // patch_size + num_patches_width = image_width // patch_size + patched_image = image.reshape(num_channels, num_patches_height, patch_size, num_patches_width, patch_size) + patched_image = patched_image.transpose(1, 3, 2, 4, 0) + patched_image = patched_image.reshape(num_patches_height * num_patches_width, -1) + return patched_image + + +# Adopted from Siglip2 (mask -> position ids) +def pad_along_first_dim(image: np.ndarray, positions: np.ndarray, target_length: int) -> tuple[np.ndarray, np.ndarray]: + """ + Pad the image along the first dimension. + """ + current_length = image.shape[0] + padding_length = target_length - current_length + if padding_length > 0: + paddings = [(0, padding_length)] + [(0, 0)] * (image.ndim - 1) + pos_paddings = [(0, padding_length), (0, 0)] + image = np.pad(image, paddings, mode="constant", constant_values=0) + positions = np.pad(positions, pos_paddings, mode="constant", constant_values=-1) + return image, positions + + +class Gemma4ImageProcessorKwargs(ImagesKwargs, total=False): + """ + patch_size (`int`, *optional*): + Size of each image patch in pixels. + max_soft_tokens (`int`, *optional*): + Maximum number of soft (vision) tokens per image. + Must be one of {70, 140, 280, 560, 1120}. + pooling_kernel_size (`int`, *optional*): + Spatial pooling kernel size applied after patchification. + """ + + patch_size: int + max_soft_tokens: int + pooling_kernel_size: int + + +@auto_docstring(custom_intro="Constructs a Gemma4 image processor.") +class Gemma4ImageProcessorPil(PilBackend): + valid_kwargs = Gemma4ImageProcessorKwargs + model_input_names = ["pixel_values", "image_position_ids", "num_soft_tokens_per_image"] + + do_resize = True + resample = PILImageResampling.BICUBIC + do_rescale = True + rescale_factor = 1 / 255 + do_normalize = False + image_mean = [0.0, 0.0, 0.0] + image_std = [1.0, 1.0, 1.0] + do_convert_rgb = True + patch_size = 16 + max_soft_tokens = 280 + pooling_kernel_size = 3 + + def __init__(self, **kwargs: Unpack[Gemma4ImageProcessorKwargs]) -> None: + super().__init__(**kwargs) + + if self.max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {self.max_soft_tokens}.") + + def _validate_preprocess_kwargs(self, **kwargs): + # Gemma4 uses aspect_ratio_preserving_resize driven by patch_size, + # max_soft_tokens, and pooling_kernel_size — not the standard `size` + # parameter. Temporarily disable do_resize so the base validation + # doesn't require `size` to be set. + kwargs["do_resize"] = False + super()._validate_preprocess_kwargs(**kwargs) + + @auto_docstring + def preprocess( + self, + images: ImageInput, + **kwargs: Unpack[Gemma4ImageProcessorKwargs], + ) -> BatchFeature: + return super().preprocess(images, **kwargs) + + def aspect_ratio_preserving_resize( + self, + image: np.ndarray, + patch_size: int, + max_patches: int, + pooling_kernel_size: int, + resample: PILImageResampling, + ) -> np.ndarray: + height, width = image.shape[-2], image.shape[-1] + target_height, target_width = get_aspect_ratio_preserving_size( + height=height, + width=width, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + ) + + if target_height == height and target_width == width: + return image + + return resize( + image, + size=(target_height, target_width), + resample=resample, + ) + + def _preprocess( + self, + images: list[np.ndarray], + do_resize: bool, + resample: "PILImageResampling | int | None", + do_rescale: bool, + rescale_factor: float, + do_normalize: bool, + image_mean: float | list[float] | None, + image_std: float | list[float] | None, + return_tensors: str | TensorType | None, + max_soft_tokens: int | None = None, + patch_size: int | None = None, + pooling_kernel_size: int | None = None, + **kwargs, + ) -> BatchFeature: + if max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {max_soft_tokens}.") + + # Compute max_patches from max_soft_tokens and pooling_kernel_size + max_patches = max_soft_tokens * pooling_kernel_size**2 + + # Process each image individually: resize, rescale/normalize, patchify, pad. + # Images have different aspect ratios and thus different resized dimensions, + # so patchification and padding must happen per-image before stacking. + pixel_values = [] + position_ids = [] + num_soft_tokens_per_image = [] + + for image in images: + # Step 1: Aspect-ratio-preserving resize + if do_resize: + image = self.aspect_ratio_preserving_resize( + image=image, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + resample=resample, + ) + + # Step 2: Rescale pixel values from [0, 255] to [0, 1] + if do_rescale: + image = self.rescale(image=image, scale=rescale_factor) + + # Step 3: Identity normalization because Gemma4 was trained with pixels in [0, 1] + if do_normalize: + image = self.normalize(image=image, mean=image_mean, std=image_std) + + # Step 4: Patchify the image + # image is (C, H, W) numpy array; add batch dimension for reshape + # (num_channels, height, width) -> (num_patches, patch_size * patch_size * num_channels) + patches = convert_image_to_patches(image, patch_size) + num_soft_tokens_per_image.append(patches.shape[0] // pooling_kernel_size**2) + + # Step 5: Compute position IDs + patch_height = image.shape[-2] // patch_size + patch_width = image.shape[-1] // patch_size + grid_x, grid_y = np.meshgrid(np.arange(patch_width), np.arange(patch_height), indexing="xy") + real_positions = np.stack([grid_x, grid_y], axis=-1).reshape(patches.shape[0], 2) + + patches, positions = pad_along_first_dim(patches, real_positions, max_patches) + + pixel_values.append(patches) + position_ids.append(positions) + + # Stack into batch arrays and convert to tensors + pixel_values = np.stack(pixel_values, axis=0) # (batch, max_patches, patch_pixels) + position_ids = np.stack(position_ids, axis=0) # (batch, max_patches, 2) + + data = { + "pixel_values": pixel_values, + "image_position_ids": position_ids, + "num_soft_tokens_per_image": num_soft_tokens_per_image, + } + return BatchFeature(data=data, tensor_type=return_tensors) + + +__all__ = ["Gemma4ImageProcessorPil"] diff --git a/tooling/huggingface/transformers/modeling_gemma4-OUTLINE.py b/tooling/huggingface/transformers/modeling_gemma4-OUTLINE.py new file mode 100644 index 0000000..c1d7eb9 --- /dev/null +++ b/tooling/huggingface/transformers/modeling_gemma4-OUTLINE.py @@ -0,0 +1,723 @@ +# === HEADER (license + imports) === +# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 +# This file was automatically generated from src/transformers/models/gemma4/modular_gemma4.py. +# Do NOT edit this file manually as any edits will be overwritten by the generation of +# the file from the modular. If any change should be done, please apply the change to the +# modular_gemma4.py file directly. One of our CI enforces this. +# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 +# Copyright 2026 the HuggingFace Team. 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 math +from collections.abc import Callable +from dataclasses import dataclass +from functools import cached_property +from typing import Optional + +import torch +from torch import nn +from torch.nn import functional as F + +from ... import initialization as init +from ...activations import ACT2FN +from ...cache_utils import Cache, DynamicCache +from ...configuration_utils import PreTrainedConfig +from ...generation import GenerationMixin +from ...integrations import use_experts_implementation, use_kernelized_func +from ...masking_utils import ( + create_bidirectional_mask, + create_causal_mask, + create_masks_for_generate, + create_sliding_window_causal_mask, +) +from ...modeling_flash_attention_utils import FlashAttentionKwargs +from ...modeling_layers import GradientCheckpointingLayer +from ...modeling_outputs import BaseModelOutputWithPast, BaseModelOutputWithPooling, CausalLMOutputWithPast +from ...modeling_rope_utils import ROPE_INIT_FUNCTIONS, dynamic_rope_update +from ...modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel +from ...processing_utils import Unpack +from ...utils import ( + ModelOutput, + TransformersKwargs, + auto_docstring, + can_return_tuple, + is_accelerate_available, + torch_compilable_check, +) +from ...utils.generic import maybe_autocast, merge_with_config_defaults +from ...utils.output_capturing import OutputRecorder, capture_outputs +from ..auto.modeling_auto import AutoModel +from .configuration_gemma4 import Gemma4AudioConfig, Gemma4Config, Gemma4TextConfig, Gemma4VisionConfig + + +if is_accelerate_available(): + from accelerate.hooks import add_hook_to_module + + +@dataclass +@auto_docstring( + custom_intro=""" + Base class for Gemma4 outputs, with hidden states and attentions. + """ +) +class Gemma4ModelOutputWithPast(BaseModelOutputWithPast): + r""" + past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache). + + Contains pre-computed hidden-states (key and values in the self-attention blocks) that can be used (see + `past_key_values` input) to speed up sequential decoding. + image_hidden_states (`torch.FloatTensor`, *optional*): + +# === CLASS/FUNCTION OUTLINE (signatures + short body) === +@dataclass +@auto_docstring( + custom_intro=""" + Base class for Gemma4 outputs, with hidden states and attentions. + """ +) +class Gemma4ModelOutputWithPast(BaseModelOutputWithPast): + r""" + past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache). + + Contains pre-computed hidden-states (key and values in the self-attention blocks) that can be used (see + `past_key_values` input) to speed up sequential decoding. + image_hidden_states (`torch.FloatTensor`, *optional*): + ... + +@dataclass +@auto_docstring( + custom_intro=""" + Base class for Gemma4 causal language model (or autoregressive) outputs. + """ +) +class Gemma4CausalLMOutputWithPast(ModelOutput): + r""" + loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided): + Language modeling loss (for next-token prediction). + logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.text_config.vocab_size)`): + Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax). + past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache). + ... + +@dataclass +@auto_docstring +class Gemma4AudioModelOutput(BaseModelOutputWithPooling): + r""" + attention_mask (`torch.BoolTensor`, *optional*): + A torch.BoolTensor of shape `(batch_size, num_frames)`. True for valid positions, False for padding. + """ + + attention_mask: torch.BoolTensor | None = None + + +class Gemma4ClippableLinear(nn.Module): + def __init__( + self, + ... + +class Gemma4RMSNorm(nn.Module): + def __init__(self, dim: int, eps: float = 1e-6, with_scale: bool = True): + super().__init__() + self.eps = eps + self.with_scale = with_scale + + if self.with_scale: + self.weight = nn.Parameter(torch.ones(dim), requires_grad=True) + + def _norm(self, hidden_states: torch.Tensor): + mean_squared = hidden_states.pow(2).mean(-1, keepdim=True) + self.eps + # Use torch.pow() (over torch.sqrt() or torch.rsqrt()) to addess compiler differences between Torch and JAX + return hidden_states * torch.pow(mean_squared, -0.5) + + ... + +class Gemma4AudioRelPositionalEncoding(nn.Module): + """Sinusoidal relative positional encoding for the audio encoder. + + Produces position embeddings of shape [1, 2*context_size - 1, hidden_size] with + concatenated [sin..., cos...] layout matching the original Gemma4 convention. + """ + + inv_timescales: torch.Tensor + + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.context_size = ( + config.attention_chunk_size + config.attention_context_left - 1 + config.attention_context_right + ... + +class Gemma4AudioAttention(nn.Module): + """Chunked local attention with relative position bias""" + + def __init__(self, config: Gemma4AudioConfig, layer_idx: int): + super().__init__() + self.config = config + self.layer_idx = layer_idx + self.attention_logits_soft_cap = config.attention_logit_cap + self.head_dim = config.hidden_size // config.num_attention_heads + self.num_heads = config.num_attention_heads + + self.q_scale = (self.head_dim**-0.5) / math.log(2) + self.k_scale = math.log(1 + math.e) / math.log(2) + + ... + +class Gemma4AudioSubSampleConvProjectionLayer(nn.Module): + def __init__(self, in_channels, out_channels, norm_eps): + super().__init__() + self.conv = nn.Conv2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(3, 3), + stride=(2, 2), + padding=1, + bias=False, + ) + self.norm = nn.LayerNorm(out_channels, eps=norm_eps, elementwise_affine=True, bias=False) + self.act = nn.ReLU() + + ... + +class Gemma4AudioSubSampleConvProjection(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.layer0 = Gemma4AudioSubSampleConvProjectionLayer( + in_channels=1, + out_channels=config.subsampling_conv_channels[0], + norm_eps=config.rms_norm_eps, + ) + self.layer1 = Gemma4AudioSubSampleConvProjectionLayer( + in_channels=config.subsampling_conv_channels[0], + out_channels=config.subsampling_conv_channels[1], + norm_eps=config.rms_norm_eps, + ) + proj_input_dim = (config.subsampling_conv_channels[0] // 4) * config.subsampling_conv_channels[1] + ... + +class Gemma4AudioFeedForward(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.config = config + + self.ffw_layer_1 = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size * 4) + self.ffw_layer_2 = Gemma4ClippableLinear(config, config.hidden_size * 4, config.hidden_size) + + self.pre_layer_norm = Gemma4RMSNorm(config.hidden_size) + self.post_layer_norm = Gemma4RMSNorm(config.hidden_size) + self.act_fn = ACT2FN[config.hidden_act] + + self.gradient_clipping = config.gradient_clipping + self.post_layer_scale = config.residual_weight + ... + +class Gemma4AudioCausalConv1d(nn.Conv1d): + # def __init__( + # self, + # in_channels: int, + # out_channels: int, + # kernel_size: int, + # # cache_key: str, + # stride: int = 1, + # dilation: int = 1, + # bias: bool = True, + # ): + # super().__init__(in_channels, out_channels, kernel_size, stride=stride, dilation=dilation, bias=bias) + # self.cache_key = cache_key + + ... + +class Gemma4AudioLightConv1d(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.config = config + + self.linear_start = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size * 2) + self.linear_end = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size) + self.depthwise_conv1d = Gemma4AudioCausalConv1d( + in_channels=config.hidden_size, + out_channels=config.hidden_size, + kernel_size=config.conv_kernel_size, + groups=config.hidden_size, + bias=False, + ) + ... + +class Gemma4AudioLayer(nn.Module): + def __init__(self, config: Gemma4AudioConfig, layer_idx: int): + super().__init__() + self.config = config + + self.feed_forward1 = Gemma4AudioFeedForward(config) + self.feed_forward2 = Gemma4AudioFeedForward(config) + self.self_attn = Gemma4AudioAttention(config, layer_idx) + self.lconv1d = Gemma4AudioLightConv1d(config) + + self.norm_pre_attn = Gemma4RMSNorm(config.hidden_size) + self.norm_post_attn = Gemma4RMSNorm(config.hidden_size) + self.norm_out = Gemma4RMSNorm(config.hidden_size) + + ... + +class Gemma4VisionPatchEmbedder(nn.Module): + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.patch_size = config.patch_size + self.position_embedding_size = config.position_embedding_size + + self.input_proj = nn.Linear(3 * self.patch_size**2, self.hidden_size, bias=False) + self.position_embedding_table = nn.Parameter(torch.ones(2, self.position_embedding_size, self.hidden_size)) + + def _position_embeddings(self, pixel_position_ids: torch.Tensor, padding_positions: torch.Tensor) -> torch.Tensor: + """Prepare patch positions map for matmul with positon embedding table.""" + # Expanding and permute patch positions to (batch_size, num_patches, 2, position_embedding_size) for matmul. + ... + +class Gemma4VisionPooler(nn.Module): + """Scaling and optional spatial pooling for vision encodings""" + + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.root_hidden_size = self.hidden_size**0.5 + + def _avg_pool_by_positions( + self, hidden_states: torch.Tensor, pixel_position_ids: torch.Tensor, length: int + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + 2D spatial pooling according to patch positions. + Pools the input tokens by averaging patches within a `k^2` grid, where `k` is determined by the ratio between + ... + +class Gemma4VisionMLP(nn.Module): + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = Gemma4ClippableLinear(config, self.hidden_size, self.intermediate_size) + self.up_proj = Gemma4ClippableLinear(config, self.hidden_size, self.intermediate_size) + self.down_proj = Gemma4ClippableLinear(config, self.intermediate_size, self.hidden_size) + self.act_fn = ACT2FN[config.hidden_activation] + + def forward(self, x): + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + return down_proj + ... + +class Gemma4VisionRotaryEmbedding(nn.Module): + inv_freq: torch.Tensor # fix linting for `register_buffer` + + def __init__(self, config: Gemma4VisionConfig, device=None): + super().__init__() + self.max_seq_len_cached = config.max_position_embeddings + self.original_max_seq_len = config.max_position_embeddings + + self.config = config + + self.rope_type = self.config.rope_parameters["rope_type"] + rope_init_fn: Callable = self.compute_default_rope_parameters + if self.rope_type != "default": + rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type] + ... + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor, unsqueeze_dim: int = 1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + x (`torch.Tensor`): The tensor to embed. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + ... + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +def eager_attention_forward( + module: nn.Module, + ... + +def apply_multidimensional_rope( + x: torch.Tensor, + cos: torch.Tensor, + sin: torch.Tensor, + position_ids: torch.Tensor, + unsqueeze_dim: int = 2, +) -> torch.Tensor: + """Applies multidimensional RoPE to inputs. + + Args: + x (`torch.Tensor`): The tensor to embed. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`, *optional*): + ... + +@use_kernelized_func(apply_rotary_pos_emb) +class Gemma4VisionAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: Gemma4VisionConfig, layer_idx: int): + super().__init__() + self.layer_type = config.layer_types[layer_idx] if hasattr(config, "layer_types") else None + self.config = config + self.layer_idx = layer_idx + self.head_dim = getattr(config, "head_dim", config.hidden_size // config.num_attention_heads) + self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads + self.scaling = 1.0 + self.attention_dropout = self.config.attention_dropout + self.is_causal = False + ... + +class Gemma4VisionEncoderLayer(GradientCheckpointingLayer): + def __init__(self, config: Gemma4VisionConfig, layer_idx: int): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.layer_idx = layer_idx + self.self_attn = Gemma4VisionAttention(config=config, layer_idx=layer_idx) + self.mlp = Gemma4VisionMLP(config) + self.input_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.pre_feedforward_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.post_feedforward_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + + def forward( + ... + +class Gemma4VisionEncoder(nn.Module): + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.config = config + self.num_layers = config.num_hidden_layers + self.rotary_emb = Gemma4VisionRotaryEmbedding(config) + self.layers = nn.ModuleList( + [Gemma4VisionEncoderLayer(config=config, layer_idx=i) for i in range(self.num_layers)] + ) + + def forward( + self, + inputs_embeds: torch.Tensor, + attention_mask: torch.Tensor, + ... + +class Gemma4TextMLP(nn.Module): + def __init__(self, config: Gemma4TextConfig, layer_idx: int): + super().__init__() + first_kv_shared_layer_idx = config.num_hidden_layers - config.num_kv_shared_layers + is_kv_shared_layer = layer_idx >= first_kv_shared_layer_idx > 0 + use_double_wide_mlp = config.use_double_wide_mlp and is_kv_shared_layer + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size * (2 if use_double_wide_mlp else 1) + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_activation] + + ... + +class Gemma4TextRotaryEmbedding(nn.Module): + inv_freq: torch.Tensor # fix linting for `register_buffer` + + def __init__(self, config: Gemma4TextConfig, device=None, layer_type=None): + super().__init__() + self.max_seq_len_cached = config.max_position_embeddings + self.original_max_seq_len = config.max_position_embeddings + + self.config = config + self.layer_types = set(config.layer_types) + self.rope_init_fns: dict[str, Callable[..., tuple[torch.Tensor, float]]] = {} + self.rope_type: dict[str, str] = {} + + for layer_type in self.layer_types: + ... + +@use_kernelized_func(apply_rotary_pos_emb) +class Gemma4TextAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: Gemma4TextConfig, layer_idx: int): + super().__init__() + self.layer_type = config.layer_types[layer_idx] if hasattr(config, "layer_types") else None + self.config = config + self.layer_idx = layer_idx + self.is_sliding = self.layer_type == "sliding_attention" + self.sliding_window = config.sliding_window if self.is_sliding else None + + self.head_dim = config.global_head_dim if not self.is_sliding and config.global_head_dim else config.head_dim + self.use_alternative_attention = config.attention_k_eq_v and not self.is_sliding + ... + +@use_experts_implementation +class Gemma4TextExperts(nn.Module): + """Collection of expert weights stored as 3D tensors.""" + + def __init__(self, config: Gemma4TextConfig): + super().__init__() + self.num_experts = config.num_experts + self.hidden_dim = config.hidden_size + self.intermediate_dim = config.moe_intermediate_size + self.gate_up_proj = nn.Parameter(torch.empty(self.num_experts, 2 * self.intermediate_dim, self.hidden_dim)) + self.down_proj = nn.Parameter(torch.empty(self.num_experts, self.hidden_dim, self.intermediate_dim)) + self.act_fn = ACT2FN[config.hidden_activation] + + def forward( + ... + +class Gemma4TextRouter(nn.Module): + def __init__(self, config: Gemma4TextConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.scalar_root_size = self.hidden_size**-0.5 + self.eps = config.rms_norm_eps + + self.norm = Gemma4RMSNorm(self.hidden_size, eps=self.eps, with_scale=False) + self.proj = nn.Linear(config.hidden_size, config.num_experts, bias=False) + self.scale = nn.Parameter(torch.ones(self.hidden_size)) + self.per_expert_scale = nn.Parameter(torch.ones(config.num_experts)) + + def forward(self, hidden_states: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: + ... + +class Gemma4TextDecoderLayer(GradientCheckpointingLayer): + def __init__(self, config: Gemma4TextConfig | Gemma4VisionConfig, layer_idx: int): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.layer_idx = layer_idx + self.self_attn = Gemma4TextAttention(config=config, layer_idx=layer_idx) + self.mlp = Gemma4TextMLP(config, layer_idx) + self.input_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.pre_feedforward_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.post_feedforward_layernorm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + self.register_buffer("layer_scalar", torch.ones(1)) + + ... + +class Gemma4TextScaledWordEmbedding(nn.Embedding): + """ + This module overrides nn.Embeddings' forward by multiplying with embeddings scale. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int, embed_scale: float = 1.0): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.scalar_embed_scale = embed_scale + self.register_buffer("embed_scale", torch.tensor(embed_scale), persistent=False) + + def forward(self, input_ids: torch.Tensor): + return super().forward(input_ids) * self.embed_scale.to(self.weight.dtype) + + + ... + +@auto_docstring +class Gemma4PreTrainedModel(PreTrainedModel): + config: Gemma4Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Gemma4TextDecoderLayer", "Gemma4VisionEncoderLayer", "Gemma4AudioLayer"] + _skip_keys_device_placement = ["past_key_values", "shared_kv_states"] + _supports_flash_attn = True + _supports_sdpa = True + _supports_flex_attn = True + + _can_compile_fullgraph = True + _supports_attention_backend = True + _can_record_outputs = None # override + ... + +@auto_docstring(custom_intro="The base Gemma 4 language model without a language modeling head.") +class Gemma4TextModel(Gemma4PreTrainedModel): + config: Gemma4TextConfig + input_modalities = ("text",) + _can_record_outputs = { + "router_logits": OutputRecorder(Gemma4TextRouter, index=0), + "hidden_states": Gemma4TextDecoderLayer, + "attentions": Gemma4TextAttention, + } + + def __init__(self, config: Gemma4TextConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + ... + +@auto_docstring(custom_intro="The base Gemma 4 language model with a language modeling head.") +class Gemma4ForCausalLM(Gemma4PreTrainedModel, GenerationMixin): + _tied_weights_keys = {"lm_head.weight": "model.embed_tokens.weight"} + _tp_plan = {"lm_head": "colwise_gather_output"} + _pp_plan = {"lm_head": (["hidden_states"], ["logits"])} + config: Gemma4TextConfig + base_model_prefix = "model" + + def __init__(self, config: Gemma4TextConfig): + super().__init__(config) + self.model = Gemma4TextModel(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + # Grab the ones from the child + ... + +def sliding_window_mask_function(sliding_window: tuple[int, int]) -> Callable: + """ + This creates uni/bidirectional attention mask with sliding window. + """ + + def inner_mask(batch_idx: int, head_idx: int, q_idx: int, kv_idx: int) -> bool: + left_window_size, right_window_size = sliding_window + + dist = q_idx - kv_idx + left_mask = (dist >= 0) & (dist < left_window_size) + right_mask = (dist < 0) & (-dist < right_window_size) + return left_mask | right_mask + + return inner_mask + ... + +class Gemma4AudioModel(Gemma4PreTrainedModel): + """An audio encoder based on the [Universal Speech Model](https://huggingface.co/papers/2303.01037) architecture.""" + + config: Gemma4AudioConfig + main_input_name = "input_features" + base_model_prefix = "model.audio_tower" # prefix for Gemma4ForConditionalGeneration saved checkpoints, required for Gemma4AudioModel.from_pretrained() + _can_record_outputs = { + "hidden_states": Gemma4AudioLayer, + "attentions": Gemma4AudioAttention, + } + + def __init__(self, config: Gemma4AudioConfig): + super().__init__(config) + self.config = config + ... + +class Gemma4VisionModel(Gemma4PreTrainedModel): + """The Gemma 4 Vision Encoder.""" + + config = Gemma4VisionConfig + _can_record_outputs = { + "hidden_states": Gemma4VisionEncoderLayer, + "attentions": Gemma4VisionAttention, + } + + def __init__(self, config: Gemma4VisionConfig): + super().__init__(config) + self.patch_embedder = Gemma4VisionPatchEmbedder(config) + self.encoder = Gemma4VisionEncoder(config) + self.pooler = Gemma4VisionPooler(config) + ... + +class Gemma4MultimodalEmbedder(nn.Module): + """Embeds token ids or soft tokens for multimodal content into language model space.""" + + def __init__( + self, + multimodal_config: Gemma4AudioConfig | Gemma4VisionConfig, + text_config: Gemma4TextConfig, + ): + super().__init__() + + self.multimodal_hidden_size = getattr(multimodal_config, "output_proj_dims", multimodal_config.hidden_size) + self.eps = multimodal_config.rms_norm_eps + self.text_hidden_size = text_config.hidden_size + self.embedding_projection = nn.Linear(self.multimodal_hidden_size, self.text_hidden_size, bias=False) + ... + +def token_type_ids_mask_function( + token_type_ids: torch.Tensor | None, + image_group_ids: torch.Tensor | None, +) -> Callable | None: + """ + This function adds the correct offsets to the `q_idx` and `kv_idx` as the torch API can only accept lengths, + not start and end indices. + """ + # Do not return an additional mask in this case + if token_type_ids is None: + return None + + def inner_mask(batch_idx: int, head_idx: int, q_idx: int, kv_idx: int) -> bool: + seq_length = image_group_ids.shape[-1] + ... + +def create_causal_mask_mapping( + config: PreTrainedConfig, + inputs_embeds: torch.Tensor, + attention_mask: torch.Tensor | None, + past_key_values: Cache | None, + position_ids: torch.Tensor | None, + mm_token_type_ids: torch.Tensor | None = None, + pixel_values: torch.FloatTensor | None = None, + is_training: bool = False, + is_first_iteration: bool | None = None, + **kwargs, +) -> dict: + """ + Overwrites the base `create_masks_for_generate` with `token_type_ids` masking to create the causal mask mapping + ... + +@auto_docstring( + custom_intro=""" + The base Gemma 4 model comprising a vision backbone, an audio backbone, and a language model without a + language modeling head. + """ +) +class Gemma4Model(Gemma4PreTrainedModel): + # we are filtering the logits/labels so we shouldn't divide the loss based on num_items_in_batch + accepts_loss_kwargs = False + + def __init__(self, config: Gemma4Config): + super().__init__(config) + self.vocab_size = config.text_config.vocab_size + + ... + +@auto_docstring( + custom_intro=""" + The base Gemma 4 model comprising a vision backbone, an audio backbone, a language model, and a language modeling + head. + """ +) +class Gemma4ForConditionalGeneration(Gemma4PreTrainedModel, GenerationMixin): + _tied_weights_keys = {"lm_head.weight": "model.language_model.embed_tokens.weight"} + accepts_loss_kwargs = False + base_model_prefix = "model" + + def __init__(self, config: Gemma4Config): + super().__init__(config) + self.model = Gemma4Model(config) + ... + diff --git a/tooling/huggingface/transformers/modular_gemma4-OUTLINE.py b/tooling/huggingface/transformers/modular_gemma4-OUTLINE.py new file mode 100644 index 0000000..4ea92d6 --- /dev/null +++ b/tooling/huggingface/transformers/modular_gemma4-OUTLINE.py @@ -0,0 +1,563 @@ +# === HEADER (license + imports) === +# Copyright 2026 the HuggingFace Team. 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 math +from collections.abc import Callable +from dataclasses import dataclass +from functools import cached_property + +import torch +from torch import nn +from torch.nn import functional as F + +from ... import initialization as init +from ...activations import ACT2FN +from ...cache_utils import Cache, DynamicCache +from ...configuration_utils import PreTrainedConfig +from ...integrations import use_kernelized_func +from ...masking_utils import ( + create_bidirectional_mask, + create_causal_mask, + create_masks_for_generate, + create_sliding_window_causal_mask, +) +from ...modeling_flash_attention_utils import FlashAttentionKwargs +from ...modeling_outputs import BaseModelOutputWithPast, BaseModelOutputWithPooling +from ...modeling_rope_utils import ROPE_INIT_FUNCTIONS, dynamic_rope_update +from ...modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel +from ...processing_utils import Unpack +from ...utils import ( + TransformersKwargs, + auto_docstring, + can_return_tuple, + is_accelerate_available, + logging, + torch_compilable_check, +) +from ...utils.generic import maybe_autocast, merge_with_config_defaults +from ...utils.output_capturing import OutputRecorder, capture_outputs +from ..auto.modeling_auto import AutoModel +from ..gemma3.modeling_gemma3 import ( + Gemma3Attention, + Gemma3DecoderLayer, + Gemma3ForCausalLM, + Gemma3MLP, + Gemma3RotaryEmbedding, + Gemma3TextModel, + Gemma3TextScaledWordEmbedding, +) +from ..gemma3n.modeling_gemma3n import ( + Gemma3nCausalLMOutputWithPast, + Gemma3nForConditionalGeneration, + Gemma3nModel, + Gemma3nModelOutputWithPast, + Gemma3nMultimodalEmbedder, + Gemma3nPreTrainedModel, + Gemma3nRMSNorm, + apply_rotary_pos_emb, + eager_attention_forward, +) +from ..llama.modeling_llama import LlamaRotaryEmbedding +from ..mixtral.modeling_mixtral import MixtralExperts +from ..moonshine_streaming.modeling_moonshine_streaming import sliding_window_mask_function +from .configuration_gemma4 import Gemma4AudioConfig, Gemma4Config, Gemma4TextConfig, Gemma4VisionConfig + + +if is_accelerate_available(): + pass + + + +# === CLASS/FUNCTION OUTLINE (signatures + short body) === +class Gemma4ModelOutputWithPast(Gemma3nModelOutputWithPast): + pass + + +class Gemma4CausalLMOutputWithPast(Gemma3nCausalLMOutputWithPast): + pass + + +@dataclass +@auto_docstring +class Gemma4AudioModelOutput(BaseModelOutputWithPooling): + r""" + attention_mask (`torch.BoolTensor`, *optional*): + A torch.BoolTensor of shape `(batch_size, num_frames)`. True for valid positions, False for padding. + ... + +class Gemma4ClippableLinear(nn.Module): + def __init__( + self, + config: Gemma4VisionConfig | Gemma4AudioConfig, + in_features: int, + out_features: int, + ) -> None: + super().__init__() + self.use_clipped_linears = config.use_clipped_linears + self.linear = nn.Linear(in_features, out_features, bias=False) + + if self.use_clipped_linears: + self.register_buffer("input_min", torch.tensor(-float("inf"))) + self.register_buffer("input_max", torch.tensor(float("inf"))) + ... + +class Gemma4RMSNorm(Gemma3nRMSNorm): + pass + + +class Gemma4AudioRelPositionalEncoding(nn.Module): + """Sinusoidal relative positional encoding for the audio encoder. + + Produces position embeddings of shape [1, 2*context_size - 1, hidden_size] with + concatenated [sin..., cos...] layout matching the original Gemma4 convention. + """ + + inv_timescales: torch.Tensor + + def __init__(self, config: Gemma4AudioConfig): + ... + +class Gemma4AudioAttention(nn.Module): + """Chunked local attention with relative position bias""" + + def __init__(self, config: Gemma4AudioConfig, layer_idx: int): + super().__init__() + self.config = config + self.layer_idx = layer_idx + self.attention_logits_soft_cap = config.attention_logit_cap + self.head_dim = config.hidden_size // config.num_attention_heads + self.num_heads = config.num_attention_heads + + self.q_scale = (self.head_dim**-0.5) / math.log(2) + self.k_scale = math.log(1 + math.e) / math.log(2) + + ... + +class Gemma4AudioSubSampleConvProjectionLayer(nn.Module): + def __init__(self, in_channels, out_channels, norm_eps): + super().__init__() + self.conv = nn.Conv2d( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=(3, 3), + stride=(2, 2), + padding=1, + bias=False, + ) + self.norm = nn.LayerNorm(out_channels, eps=norm_eps, elementwise_affine=True, bias=False) + self.act = nn.ReLU() + + ... + +class Gemma4AudioSubSampleConvProjection(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.layer0 = Gemma4AudioSubSampleConvProjectionLayer( + in_channels=1, + out_channels=config.subsampling_conv_channels[0], + norm_eps=config.rms_norm_eps, + ) + self.layer1 = Gemma4AudioSubSampleConvProjectionLayer( + in_channels=config.subsampling_conv_channels[0], + out_channels=config.subsampling_conv_channels[1], + norm_eps=config.rms_norm_eps, + ) + proj_input_dim = (config.subsampling_conv_channels[0] // 4) * config.subsampling_conv_channels[1] + ... + +class Gemma4AudioFeedForward(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.config = config + + self.ffw_layer_1 = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size * 4) + self.ffw_layer_2 = Gemma4ClippableLinear(config, config.hidden_size * 4, config.hidden_size) + + self.pre_layer_norm = Gemma4RMSNorm(config.hidden_size) + self.post_layer_norm = Gemma4RMSNorm(config.hidden_size) + self.act_fn = ACT2FN[config.hidden_act] + + self.gradient_clipping = config.gradient_clipping + self.post_layer_scale = config.residual_weight + ... + +class Gemma4AudioCausalConv1d(nn.Conv1d): + # def __init__( + # self, + # in_channels: int, + # out_channels: int, + # kernel_size: int, + # # cache_key: str, + # stride: int = 1, + # dilation: int = 1, + # bias: bool = True, + # ): + # super().__init__(in_channels, out_channels, kernel_size, stride=stride, dilation=dilation, bias=bias) + # self.cache_key = cache_key + + ... + +class Gemma4AudioLightConv1d(nn.Module): + def __init__(self, config: Gemma4AudioConfig): + super().__init__() + self.config = config + + self.linear_start = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size * 2) + self.linear_end = Gemma4ClippableLinear(config, config.hidden_size, config.hidden_size) + self.depthwise_conv1d = Gemma4AudioCausalConv1d( + in_channels=config.hidden_size, + out_channels=config.hidden_size, + kernel_size=config.conv_kernel_size, + groups=config.hidden_size, + bias=False, + ) + ... + +class Gemma4AudioLayer(nn.Module): + def __init__(self, config: Gemma4AudioConfig, layer_idx: int): + super().__init__() + self.config = config + + self.feed_forward1 = Gemma4AudioFeedForward(config) + self.feed_forward2 = Gemma4AudioFeedForward(config) + self.self_attn = Gemma4AudioAttention(config, layer_idx) + self.lconv1d = Gemma4AudioLightConv1d(config) + + self.norm_pre_attn = Gemma4RMSNorm(config.hidden_size) + self.norm_post_attn = Gemma4RMSNorm(config.hidden_size) + self.norm_out = Gemma4RMSNorm(config.hidden_size) + + ... + +class Gemma4VisionPatchEmbedder(nn.Module): + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.patch_size = config.patch_size + self.position_embedding_size = config.position_embedding_size + + self.input_proj = nn.Linear(3 * self.patch_size**2, self.hidden_size, bias=False) + self.position_embedding_table = nn.Parameter(torch.ones(2, self.position_embedding_size, self.hidden_size)) + + def _position_embeddings(self, pixel_position_ids: torch.Tensor, padding_positions: torch.Tensor) -> torch.Tensor: + """Prepare patch positions map for matmul with positon embedding table.""" + # Expanding and permute patch positions to (batch_size, num_patches, 2, position_embedding_size) for matmul. + ... + +class Gemma4VisionPooler(nn.Module): + """Scaling and optional spatial pooling for vision encodings""" + + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.root_hidden_size = self.hidden_size**0.5 + + def _avg_pool_by_positions( + self, hidden_states: torch.Tensor, pixel_position_ids: torch.Tensor, length: int + ) -> tuple[torch.Tensor, torch.Tensor]: + """ + 2D spatial pooling according to patch positions. + Pools the input tokens by averaging patches within a `k^2` grid, where `k` is determined by the ratio between + ... + +class Gemma4VisionMLP(Gemma3MLP): + def __init__(self, config: Gemma4VisionConfig): + super().__init__(self, config) + self.gate_proj = Gemma4ClippableLinear(config, self.hidden_size, self.intermediate_size) + self.up_proj = Gemma4ClippableLinear(config, self.hidden_size, self.intermediate_size) + self.down_proj = Gemma4ClippableLinear(config, self.intermediate_size, self.hidden_size) + + +def apply_multidimensional_rope( + x: torch.Tensor, + cos: torch.Tensor, + sin: torch.Tensor, + position_ids: torch.Tensor, + unsqueeze_dim: int = 2, + ... + +class Gemma4VisionRotaryEmbedding(LlamaRotaryEmbedding): + @staticmethod + def compute_default_rope_parameters( + config: Gemma4VisionConfig | None = None, + device: torch.device | None = None, + seq_len: int | None = None, + ) -> tuple["torch.Tensor", float]: + """ + Computes the inverse frequencies according to the original RoPE implementation + Args: + config ([`~transformers.PreTrainedConfig`]): + The model configuration. + device (`torch.device`): + The device to use for initialization of the inverse frequencies. + ... + +class Gemma4VisionAttention(Gemma3Attention): + def __init__(self, config: Gemma4VisionConfig, layer_idx: int): + super().__init__(self, config, layer_idx) + del self.attn_logit_softcapping + del self.sliding_window + del self.is_sliding + self.scaling = 1.0 + self.is_causal = False + self.k_proj = Gemma4ClippableLinear(config, config.hidden_size, config.num_key_value_heads * self.head_dim) + self.q_proj = Gemma4ClippableLinear(config, config.hidden_size, config.num_attention_heads * self.head_dim) + self.v_proj = Gemma4ClippableLinear(config, config.hidden_size, config.num_key_value_heads * self.head_dim) + self.o_proj = Gemma4ClippableLinear(config, config.num_attention_heads * self.head_dim, config.hidden_size) + self.v_norm = Gemma4RMSNorm(self.head_dim, eps=config.rms_norm_eps, with_scale=False) + + ... + +class Gemma4VisionEncoderLayer(Gemma3DecoderLayer): + def __init__(self, config: Gemma4VisionConfig, layer_idx: int): + super().__init__(self, config, layer_idx) + self.self_attn = Gemma4VisionAttention(config=config, layer_idx=layer_idx) + self.mlp = Gemma4VisionMLP(config) + + def forward( + self, + hidden_states: torch.Tensor, + position_embeddings: torch.Tensor = None, + attention_mask: torch.Tensor | None = None, + position_ids: torch.LongTensor | None = None, + **kwargs: Unpack[TransformersKwargs], + ) -> tuple[torch.FloatTensor, tuple[torch.FloatTensor, torch.FloatTensor] | None]: + ... + +class Gemma4VisionEncoder(nn.Module): + def __init__(self, config: Gemma4VisionConfig): + super().__init__() + self.config = config + self.num_layers = config.num_hidden_layers + self.rotary_emb = Gemma4VisionRotaryEmbedding(config) + self.layers = nn.ModuleList( + [Gemma4VisionEncoderLayer(config=config, layer_idx=i) for i in range(self.num_layers)] + ) + + def forward( + self, + inputs_embeds: torch.Tensor, + attention_mask: torch.Tensor, + ... + +class Gemma4TextMLP(Gemma3MLP): + def __init__(self, config: Gemma4TextConfig, layer_idx: int): + first_kv_shared_layer_idx = config.num_hidden_layers - config.num_kv_shared_layers + is_kv_shared_layer = layer_idx >= first_kv_shared_layer_idx > 0 + use_double_wide_mlp = config.use_double_wide_mlp and is_kv_shared_layer + super().__init__() + self.intermediate_size = config.intermediate_size * (2 if use_double_wide_mlp else 1) + + +class Gemma4TextRotaryEmbedding(Gemma3RotaryEmbedding): + def __init__(self, config: Gemma4TextConfig, device=None, layer_type=None): + nn.Module.__init__(self) + self.max_seq_len_cached = config.max_position_embeddings + self.original_max_seq_len = config.max_position_embeddings + ... + +@use_kernelized_func(apply_rotary_pos_emb) +class Gemma4TextAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: Gemma4TextConfig, layer_idx: int): + super().__init__() + self.layer_type = config.layer_types[layer_idx] if hasattr(config, "layer_types") else None + self.config = config + self.layer_idx = layer_idx + self.is_sliding = self.layer_type == "sliding_attention" + self.sliding_window = config.sliding_window if self.is_sliding else None + + self.head_dim = config.global_head_dim if not self.is_sliding and config.global_head_dim else config.head_dim + self.use_alternative_attention = config.attention_k_eq_v and not self.is_sliding + ... + +class Gemma4TextExperts(MixtralExperts): + def __init__(self, config: Gemma4TextConfig): + super().__init__() + self.num_experts = config.num_experts + self.intermediate_dim = config.moe_intermediate_size + self.act_fn = ACT2FN[config.hidden_activation] + + +class Gemma4TextRouter(nn.Module): + def __init__(self, config: Gemma4TextConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.scalar_root_size = self.hidden_size**-0.5 + ... + +class Gemma4TextDecoderLayer(Gemma3DecoderLayer): + def __init__(self, config: Gemma4TextConfig | Gemma4VisionConfig, layer_idx: int): + super().__init__(config, layer_idx) + self.self_attn = Gemma4TextAttention(config=config, layer_idx=layer_idx) + self.mlp = Gemma4TextMLP(config, layer_idx) + self.register_buffer("layer_scalar", torch.ones(1)) + + self.hidden_size_per_layer_input = config.hidden_size_per_layer_input + if self.hidden_size_per_layer_input: + self.act_fn = ACT2FN[config.hidden_activation] + self.per_layer_input_gate = nn.Linear(self.hidden_size, self.hidden_size_per_layer_input, bias=False) + self.per_layer_projection = nn.Linear(self.hidden_size_per_layer_input, self.hidden_size, bias=False) + self.post_per_layer_input_norm = Gemma4RMSNorm(self.hidden_size, eps=config.rms_norm_eps) + + ... + +class Gemma4TextScaledWordEmbedding(Gemma3TextScaledWordEmbedding): + pass + + +# ---- Model Classes ---- + + +class Gemma4PreTrainedModel(Gemma3nPreTrainedModel): + _no_split_modules = ["Gemma4TextDecoderLayer", "Gemma4VisionEncoderLayer", "Gemma4AudioLayer"] + input_modalities = ("image", "text", "video", "audio") + _can_record_outputs = None # override + _skip_keys_device_placement = ["past_key_values", "shared_kv_states"] + + @torch.no_grad() + ... + +@auto_docstring(custom_intro="The base Gemma 4 language model without a language modeling head.") +class Gemma4TextModel(Gemma3TextModel): + config: Gemma4TextConfig + _can_record_outputs = { + "router_logits": OutputRecorder(Gemma4TextRouter, index=0), + "hidden_states": Gemma4TextDecoderLayer, + "attentions": Gemma4TextAttention, + } + + def __init__(self, config: Gemma4TextConfig): + super().__init__(config) + self.layers = nn.ModuleList( + [Gemma4TextDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + ... + +@auto_docstring(custom_intro="The base Gemma 4 language model with a language modeling head.") +class Gemma4ForCausalLM(Gemma3ForCausalLM): + base_model_prefix = "model" + + def __init__(self, config: Gemma4TextConfig): + super().__init__(config) + # Grab the ones from the child + self._keys_to_ignore_on_load_unexpected = [ + f"model.{name}" for name in self.model._keys_to_ignore_on_load_unexpected + ] + + +class Gemma4AudioModel(Gemma4PreTrainedModel): + """An audio encoder based on the [Universal Speech Model](https://huggingface.co/papers/2303.01037) architecture.""" + ... + +class Gemma4VisionModel(Gemma4PreTrainedModel): + """The Gemma 4 Vision Encoder.""" + + config = Gemma4VisionConfig + _can_record_outputs = { + "hidden_states": Gemma4VisionEncoderLayer, + "attentions": Gemma4VisionAttention, + } + + def __init__(self, config: Gemma4VisionConfig): + super().__init__(config) + self.patch_embedder = Gemma4VisionPatchEmbedder(config) + self.encoder = Gemma4VisionEncoder(config) + self.pooler = Gemma4VisionPooler(config) + ... + +class Gemma4MultimodalEmbedder(Gemma3nMultimodalEmbedder): + def __init__( + self, + multimodal_config: Gemma4AudioConfig | Gemma4VisionConfig, + text_config: Gemma4TextConfig, + ): + # Audio tower may use a different output dimension (output_proj_dims) than the + # internal hidden_size. Use the tower-specific dimension if specified. + super().__init__(multimodal_config, text_config) + del self.embedding + del self.hard_embedding_norm + del self.soft_embedding_norm + del self.vocab_offset + del self.vocab_size + ... + +def token_type_ids_mask_function( + token_type_ids: torch.Tensor | None, + image_group_ids: torch.Tensor | None, +) -> Callable | None: + """ + This function adds the correct offsets to the `q_idx` and `kv_idx` as the torch API can only accept lengths, + not start and end indices. + """ + # Do not return an additional mask in this case + if token_type_ids is None: + return None + + def inner_mask(batch_idx: int, head_idx: int, q_idx: int, kv_idx: int) -> bool: + seq_length = image_group_ids.shape[-1] + ... + +def create_causal_mask_mapping( + config: PreTrainedConfig, + inputs_embeds: torch.Tensor, + attention_mask: torch.Tensor | None, + past_key_values: Cache | None, + position_ids: torch.Tensor | None, + mm_token_type_ids: torch.Tensor | None = None, + pixel_values: torch.FloatTensor | None = None, + is_training: bool = False, + is_first_iteration: bool | None = None, + **kwargs, +) -> dict: + """ + Overwrites the base `create_masks_for_generate` with `token_type_ids` masking to create the causal mask mapping + ... + +@auto_docstring( + custom_intro=""" + The base Gemma 4 model comprising a vision backbone, an audio backbone, and a language model without a + language modeling head. + """ +) +class Gemma4Model(Gemma3nModel): + def __init__(self, config: Gemma4Config): + super().__init__(config) + del self.vision_tower + del self.embed_vision + self.vision_tower = AutoModel.from_config(config.vision_config) if config.vision_config is not None else None + self.embed_vision = ( + Gemma4MultimodalEmbedder(config.vision_config, config.text_config) + ... + +@auto_docstring( + custom_intro=""" + The base Gemma 4 model comprising a vision backbone, an audio backbone, a language model, and a language modeling + head. + """ +) +class Gemma4ForConditionalGeneration(Gemma3nForConditionalGeneration): + base_model_prefix = "model" + + def __init__(self, config: Gemma4Config): + super().__init__(config) + # Grab the ones from the child + self._keys_to_ignore_on_load_unexpected = [ + f"model.{name}" for name in self.model._keys_to_ignore_on_load_unexpected + ... + diff --git a/tooling/huggingface/transformers/processing_gemma4.py b/tooling/huggingface/transformers/processing_gemma4.py new file mode 100644 index 0000000..d688250 --- /dev/null +++ b/tooling/huggingface/transformers/processing_gemma4.py @@ -0,0 +1,366 @@ +# Copyright 2026 the HuggingFace Team. 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 re + +import numpy as np + +from ...audio_utils import AudioInput +from ...image_processing_utils import BatchFeature +from ...image_utils import ImageInput, make_nested_list_of_images +from ...processing_utils import MultiModalData, ProcessingKwargs, ProcessorMixin, Unpack +from ...tokenization_utils_base import PreTokenizedInput, TextInput +from ...utils import auto_docstring, is_vision_available, logging +from ...utils.import_utils import requires +from ...video_utils import VideoInput + + +if is_vision_available(): + from .image_processing_pil_gemma4 import Gemma4ImageProcessorKwargs, get_aspect_ratio_preserving_size + + +logger = logging.get_logger(__name__) + + +class Gemma4ProcessorKwargs(ProcessingKwargs, total=False): + images_kwargs: Gemma4ImageProcessorKwargs + _defaults = { + "text_kwargs": { + "padding": True, + "return_mm_token_type_ids": True, + }, + "images_kwargs": { + "do_convert_rgb": True, + }, + "audio_kwargs": {}, + "videos_kwargs": {"return_metadata": True}, + } + + +@auto_docstring +@requires(backends=("vision",)) +class Gemma4Processor(ProcessorMixin): + def __init__( + self, + feature_extractor, + image_processor, + tokenizer, + video_processor, + chat_template=None, + image_seq_length: int = 280, + audio_seq_length: int = 750, + audio_ms_per_token: int = 40, + **kwargs, + ): + r""" + image_seq_length (`int`, *optional*, defaults to 280): + The number of soft tokens per image used for placeholder expansion. + audio_seq_length (`int`, *optional*, defaults to 750): + The maximum number of audio soft tokens per audio segment. Serves as an + upper-bound cap when dynamic audio token counts are computed. + audio_ms_per_token (`int`, *optional*, defaults to 40): + Milliseconds of audio per output soft token. Used to dynamically compute + the number of audio placeholder tokens as ``ceil(duration_ms / audio_ms_per_token)``. + The default of 40 comes from the SSCP convolution's 4× time reduction on 10ms frames. + """ + self.image_seq_length = image_seq_length + self.image_token_id = tokenizer.image_token_id + self.boi_token = tokenizer.boi_token + self.eoi_token = tokenizer.eoi_token + self.image_token = tokenizer.image_token + + # FIXME: add the token to config and ask Ryan to re-upload + tokenizer.add_special_tokens({"additional_special_tokens": ["<|video|>"]}) + self.video_token = "<|video|>" + self.video_token_id = tokenizer.convert_tokens_to_ids(self.video_token) + + # Audio token handling, mirroring the vision pattern. + # audio_seq_length serves as the maximum cap on the number of audio soft tokens + # any single audio segment can produce. With dynamic audio tokens, the actual + # number of placeholders inserted per audio is computed from the audio duration. + self.audio_seq_length = audio_seq_length + # Milliseconds of audio per output soft token. The default of 40 comes from the + # SSCP convolution's 4× time reduction applied to 10ms mel spectrogram frames. + self.audio_ms_per_token = audio_ms_per_token + self.audio_token_id = getattr(tokenizer, "audio_token_id", None) + self.audio_token = getattr(tokenizer, "audio_token", None) + self.boa_token = getattr(tokenizer, "boa_token", None) + self.eoa_token = getattr(tokenizer, "eoa_token", None) + + super().__init__( + feature_extractor=feature_extractor, + image_processor=image_processor, + tokenizer=tokenizer, + video_processor=video_processor, + chat_template=chat_template, + **kwargs, + ) + + @auto_docstring + def __call__( + self, + images: ImageInput | None = None, + text: TextInput | PreTokenizedInput | list[TextInput] | list[PreTokenizedInput] = None, + audio: AudioInput | None = None, + videos: VideoInput | None = None, + **kwargs: Unpack[Gemma4ProcessorKwargs], + ) -> BatchFeature: + if text is None and images is None and audio is None and videos is None: + raise ValueError("Provide at least one of `text`, `images`, `audio`, or `videos`.") + + output_kwargs = self._merge_kwargs( + Gemma4ProcessorKwargs, + tokenizer_init_kwargs=self.tokenizer.init_kwargs, + **kwargs, + ) + + if isinstance(text, str): + text = [text] + elif not isinstance(text, list) and not isinstance(text[0], str): + raise TypeError("Invalid input text. Please provide a string, or a list of strings") + + image_inputs = {} + if images is not None: + images = self.image_processor.fetch_images(images) + batched_images = make_nested_list_of_images(images) + image_inputs = self.image_processor(images, **output_kwargs["images_kwargs"]) + + num_soft_tokens = image_inputs.pop("num_soft_tokens_per_image") + + # Create empty text to be replaced with placeholders + if not text: + text = [" ".join([self.image_token] * len(images)) for images in batched_images] + + if len(batched_images) != len(text): + raise ValueError( + f"Received inconsistently sized batches of images ({len(batched_images)}) and text ({len(text)})." + ) + + replacements = [f"{self.boi_token}{self.image_token * n}{self.eoi_token}" for n in num_soft_tokens] + replacements_iter = iter(replacements) + + # Expand image_token placeholders to per-image soft token sequences. + # re.sub never re-scans replaced text, so it is safe + pattern = re.escape(self.image_token) + text = [re.sub(pattern, lambda _: next(replacements_iter), prompt) for prompt in text] + + # Process video inputs in same way + video_inputs = {} + if videos is not None: + video_inputs = self.video_processor(videos=videos, **output_kwargs["videos_kwargs"]) + num_video_tokens = video_inputs.pop("num_soft_tokens_per_video") + + # If user has not requested video metadata, pop it so it isn't returned + if not kwargs.get("return_metadata"): + video_metadata = video_inputs.pop("video_metadata") + else: + video_metadata = video_inputs["video_metadata"] + + video_replacements = [] + for metadata, n_tokens in zip(video_metadata, num_video_tokens): + if metadata.fps is None: + logger.warning_once( + "Gemma 4 requires frame timestamps to construct prompts, but the `fps` of the input video " + "could not be inferred. Probably `video_metadata` was missing from inputs and you passed " + "pre-sampled frames. Defaulting to `fps=24`. Please provide `video_metadata` for more " + "accurate results." + ) + metadata.fps = 24 if metadata.fps is None else metadata.fps + # mm:ss format for timestamps + timestamp_str = [ + f"{int(seconds // 60):02d}:{int(seconds % 60):02d}" for seconds in metadata.timestamps + ] + video_replacements.append( + " ".join( + [f"{t} {self.boi_token}{self.video_token * n_tokens}{self.eoi_token}" for t in timestamp_str] + ) + ) + + video_replacements = iter(video_replacements) + pattern = re.escape(self.video_token) + text = [re.sub(pattern, lambda _: next(video_replacements), prompt) for prompt in text] + + # Process audio inputs + audio_inputs = {} + if audio is not None: + if self.audio_token is None or self.boa_token is None or self.eoa_token is None: + raise ValueError( + "Audio inputs were provided, but the tokenizer does not have an `audio_token` defined." + ) + + # Normalize audio input to list of waveforms + if isinstance(audio, np.ndarray) and audio.ndim == 1: + audio = [audio] + + # TODO: Add tests for audio-only processor inputs. + if not text: + text = [self.audio_token] * len(audio) + + # Dynamic audio token expansion wihtout padding: + # * Extract audio features with feature extractor; + # * Compute precise per-audio token counts from the waveform duration; + # * Generate full audio token sequence for each computed audio length; + # * Expand text prompts with full audio token sequences. + audio_kwargs = output_kwargs.get("audio_kwargs", {}) + audio_inputs = self.feature_extractor(audio, **audio_kwargs) + sampling_rate = self.feature_extractor.sampling_rate + num_audio_tokens = [self._compute_audio_num_tokens(a, sampling_rate) for a in audio] + replacements = [f"{self.boa_token}{self.audio_token * n}{self.eoa_token}" for n in num_audio_tokens] + replacements_iter = iter(replacements) + audio_pattern = re.escape(self.audio_token) + text = [re.sub(audio_pattern, lambda _: next(replacements_iter), prompt) for prompt in text] + + return_tensors = output_kwargs["text_kwargs"].pop("return_tensors", None) + return_mm_token_type_ids = output_kwargs["text_kwargs"].pop("return_mm_token_type_ids", False) + text_inputs = self.tokenizer(text=text, **output_kwargs["text_kwargs"]) + + # Check special tokens for all active modalities + active_modalities = [] + if images is not None: + active_modalities.append("image") + if videos is not None: + active_modalities.append("video") + if audio is not None: + active_modalities.append("audio") + if active_modalities: + self._check_special_mm_tokens(text, text_inputs, modalities=active_modalities) + + if return_mm_token_type_ids: + text_inputs["mm_token_type_ids"] = self.create_mm_token_type_ids(text_inputs["input_ids"]) + + return BatchFeature( + data={**text_inputs, **image_inputs, **audio_inputs, **video_inputs}, + tensor_type=return_tensors, + ) + + def _compute_audio_num_tokens(self, audio_waveform, sampling_rate: int) -> int: + """Compute the number of audio soft tokens for a single waveform. + + Replicates the exact sequence-length arithmetic of the audio encoder + so that the processor inserts the correct number of placeholder tokens. + The computation mirrors: + + 1. Mel framing via ``_unfold`` in ``Gemma4AudioFeatureExtractor`` + 2. Two ``Conv2d`` subsampling layers in ``Gemma4AudioSubSampleConvProjection`` + (each: kernel=3, stride=2, semicausal padding top=1, bottom=1) + + The result is capped at ``self.audio_seq_length`` (the configured maximum). + + Args: + audio_waveform: A 1-D numpy array or list containing the raw audio samples. + sampling_rate: The sampling rate of the audio waveform in Hz. + + Returns: + The number of audio soft tokens to insert as placeholders. + """ + num_samples = len(audio_waveform) + + # Step 1: Mel frames (matches feature_extraction_gemma4.py _unfold) + frame_length = int(round(sampling_rate * 20.0 / 1000.0)) # 320 @ 16kHz + hop_length = int(round(sampling_rate * 10.0 / 1000.0)) # 160 @ 16kHz + frame_size_for_unfold = frame_length + 1 # 321 + + # The feature extractor prepends (frame_length // 2) zero samples as + # semicausal time-padding before the unfold. We must include this to + # match the actual number of mel frames it produces. + pad_left = frame_length // 2 # 160 @ 16kHz + padded_samples = num_samples + pad_left + num_mel_frames = (padded_samples - frame_size_for_unfold) // hop_length + 1 + + if num_mel_frames <= 0: + return 0 + + # Step 2: Two SSCP conv layers (kernel=3, stride=2, semicausal pad top=1, bottom=1) + # Each layer: T_out = (T_in + pad_top + pad_bottom - kernel) // stride + 1 + t = num_mel_frames + for _ in range(2): + t_padded = t + 2 # pad_top=1, pad_bottom=1 + t = (t_padded - 3) // 2 + 1 + + # Cap at the configured maximum + return min(t, self.audio_seq_length) + + def _get_num_multimodal_tokens(self, image_sizes=None, audio_lengths=None, **kwargs): + """ + Computes the number of placeholder tokens needed for multimodal inputs with the given sizes. + + Args: + image_sizes (`list[list[int]]`, *optional*): + The input sizes formatted as (height, width) per each image. + audio_lengths (`list[int]`, *optional*): + The lengths of audio inputs in number of samples. Used to dynamically + compute per-audio token counts. + + Returns: + `MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided + input modalities, along with other useful data. + """ + + images_kwargs = Gemma4ProcessorKwargs._defaults.get("images_kwargs", {}) + images_kwargs.update(kwargs) + patch_size = images_kwargs.get("patch_size", None) or self.image_processor.patch_size + pooling_kernel_size = ( + images_kwargs.get("pooling_kernel_size", None) or self.image_processor.pooling_kernel_size + ) + max_soft_tokens = images_kwargs.get("max_soft_tokens", None) or self.image_processor.max_soft_tokens + + max_patches = max_soft_tokens * pooling_kernel_size**2 + + vision_data = {} + if image_sizes is not None: + num_image_tokens = [] + for image_size in image_sizes: + target_h, target_w = get_aspect_ratio_preserving_size( + height=image_size[0], + width=image_size[1], + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + ) + patch_height = target_h // patch_size + patch_width = target_w // patch_size + num_image_tokens.append(patch_height * patch_width // pooling_kernel_size**2) + + num_image_patches = [1] * len(image_sizes) + vision_data.update({"num_image_tokens": num_image_tokens, "num_image_patches": num_image_patches}) + + if audio_lengths is not None: + # Dynamically compute per-audio token counts from sample lengths. + # audio_lengths are in number of samples; assume default sampling rate. + sampling_rate = getattr(self.feature_extractor, "sampling_rate", 16_000) + num_audio_tokens = [ + self._compute_audio_num_tokens(np.zeros(length), sampling_rate) for length in audio_lengths + ] + vision_data.update({"num_audio_tokens": num_audio_tokens}) + + return MultiModalData(**vision_data) + + @property + def model_input_names(self): + model_input_names = super().model_input_names + model_input_names = [ + name + for name in model_input_names + if name not in ["num_soft_tokens_per_image", "num_soft_tokens_per_video"] + ] + + # Include audio feature extractor input names if available + if self.feature_extractor is not None: + feature_extractor_input_names = self.feature_extractor.model_input_names + model_input_names.extend([name for name in feature_extractor_input_names if name not in model_input_names]) + + return model_input_names + ["mm_token_type_ids"] + + +__all__ = ["Gemma4Processor"] diff --git a/tooling/huggingface/transformers/video_processing_gemma4.py b/tooling/huggingface/transformers/video_processing_gemma4.py new file mode 100644 index 0000000..d867d31 --- /dev/null +++ b/tooling/huggingface/transformers/video_processing_gemma4.py @@ -0,0 +1,237 @@ +# Copyright 2026 the HuggingFace Team. 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 torch + +from ...image_processing_utils import BatchFeature +from ...processing_utils import Unpack, VideosKwargs +from ...utils import ( + TensorType, + add_start_docstrings, + is_torch_available, + is_torchvision_available, + is_torchvision_v2_available, + is_vision_available, + logging, +) +from ...video_processing_utils import BASE_VIDEO_PROCESSOR_DOCSTRING, BaseVideoProcessor +from ...video_utils import VideoInput +from .image_processing_gemma4 import _SUPPORTED_SOFT_TOKENS, get_aspect_ratio_preserving_size + + +if is_vision_available(): + from ...image_utils import PILImageResampling + +if is_torch_available(): + import torch + +if is_torchvision_v2_available(): + from torchvision.transforms.v2 import functional as F +elif is_torchvision_available(): + from torchvision.transforms import functional as F + + +logger = logging.get_logger(__name__) + + +class Gemma4VideoProcessorKwargs(VideosKwargs, total=False): + """ + patch_size (`int`, *optional*): + Size of each image patch in pixels. + max_soft_tokens (`int`, *optional*): + Maximum number of soft (vision) tokens per video frame. + Must be one of {70, 140, 280, 560, 1120}. + pooling_kernel_size (`int`, *optional*): + Spatial pooling kernel size applied after patchification. + """ + + patch_size: int + max_soft_tokens: int + pooling_kernel_size: int + + +def convert_video_to_patches(video: "torch.Tensor", patch_size: int) -> "torch.Tensor": + """ + Convert 4D tensor video of shape (num_frames, num_channels, height, width) into 3D tensor of patches of shape + (num_frames, num_patches_height * num_patches_width, patch_size * patch_size * num_channels). + """ + num_frames, num_channels, height, width = video.shape + num_patches_height = height // patch_size + num_patches_width = width // patch_size + patched_video = video.reshape( + num_frames, num_channels, num_patches_height, patch_size, num_patches_width, patch_size + ) + patched_video = patched_video.permute(0, 2, 4, 3, 5, 1) + patched_video = patched_video.reshape(num_frames, num_patches_height * num_patches_width, -1) + return patched_video + + +def pad_to_max_patches( + video: "torch.Tensor", positions: "torch.Tensor", target_length: int +) -> tuple["torch.Tensor", "torch.Tensor"]: + """ + Pad the video along to max number of patches + """ + current_length = video.shape[1] + padding_length = target_length - current_length + if padding_length > 0: + padding = [0, 0, 0, padding_length, 0, 0] + pos_padding = (0, 0, 0, padding_length, 0, 0) + video = torch.nn.functional.pad(video, padding, mode="constant", value=0) + positions = torch.nn.functional.pad(positions, pos_padding, mode="constant", value=-1) + return video, positions + + +@add_start_docstrings( + "Constructs a Gemma4 video processor that samples frames from videos for use with the Gemma4 model.", + BASE_VIDEO_PROCESSOR_DOCSTRING, +) +class Gemma4VideoProcessor(BaseVideoProcessor): + resample = PILImageResampling.BICUBIC + image_mean = [0.0, 0.0, 0.0] + image_std = [1.0, 1.0, 1.0] + size = None + default_to_square = True + do_convert_rgb = True + do_resize = True + do_rescale = True + do_normalize = True + num_frames = 32 + do_sample_frames = True + patch_size = 16 + max_soft_tokens = 70 + pooling_kernel_size = 3 + valid_kwargs = Gemma4VideoProcessorKwargs + model_input_names = ["pixel_values_videos", "video_position_ids"] + + def __init__(self, **kwargs: Unpack[Gemma4VideoProcessorKwargs]): + super().__init__(**kwargs) + + if self.max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {self.max_soft_tokens}.") + + def _validate_preprocess_kwargs(self, **kwargs): + # Gemma4 uses aspect_ratio_preserving_resize driven by patch_size, + # max_soft_tokens, and pooling_kernel_size — not the standard `size` + # parameter. Temporarily disable do_resize so the base validation + # doesn't require `size` to be set. + kwargs["do_resize"] = False + super()._validate_preprocess_kwargs(**kwargs) + + def aspect_ratio_preserving_resize( + self, + video: torch.Tensor, + patch_size: int, + max_patches: int, + pooling_kernel_size: int, + resample: F.InterpolationMode, + ) -> torch.Tensor: + height, width = video.shape[-2], video.shape[-1] + target_height, target_width = get_aspect_ratio_preserving_size( + height=height, + width=width, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + ) + + if target_height == height and target_width == width: + return video + + return F.resize( + video, + size=[target_height, target_width], + interpolation=resample, + antialias=True, + ) + + def preprocess( + self, + videos: VideoInput, + **kwargs: Unpack[Gemma4VideoProcessorKwargs], + ) -> BatchFeature: + return super().preprocess(videos, **kwargs) + + def _preprocess( + self, + videos: list["torch.Tensor"], + do_resize: bool, + resample: "F.InterpolationMode | int | None", + do_rescale: bool, + rescale_factor: float, + do_normalize: bool, + image_mean: float | list[float] | None, + image_std: float | list[float] | None, + return_tensors: str | TensorType | None, + patch_size: int | None = None, + max_soft_tokens: int | None = None, + pooling_kernel_size: int | None = None, + **kwargs, + ) -> BatchFeature: + if max_soft_tokens not in _SUPPORTED_SOFT_TOKENS: + raise ValueError(f"`max_soft_tokens` must be one of {_SUPPORTED_SOFT_TOKENS}, got {max_soft_tokens}.") + + max_patches = max_soft_tokens * pooling_kernel_size**2 + + pixel_values = [] + position_ids = [] + num_soft_tokens_per_video = [] + num_frames = 1 + + for video in videos: + if do_resize: + video = self.aspect_ratio_preserving_resize( + video=video, + patch_size=patch_size, + max_patches=max_patches, + pooling_kernel_size=pooling_kernel_size, + resample=resample, + ) + + video = self.rescale_and_normalize(video, do_rescale, rescale_factor, do_normalize, image_mean, image_std) + + num_frames = video.shape[0] + patch_height = video.shape[-2] // patch_size + patch_width = video.shape[-1] // patch_size + patches = convert_video_to_patches(video, patch_size) + num_soft_tokens_per_video.append(patches.shape[1] // pooling_kernel_size**2) + + device = video.device + patch_grid = torch.meshgrid( + torch.arange(patch_width, device=device), + torch.arange(patch_height, device=device), + indexing="xy", + ) + stacked_grid = torch.stack(patch_grid, dim=-1) + real_positions = stacked_grid.reshape(patches.shape[1], 2) + real_positions = real_positions[None, ...].repeat(num_frames, 1, 1) + + patches, positions = pad_to_max_patches(patches, real_positions, max_patches) + pixel_values.append(patches) + position_ids.append(positions) + + # Stack into batch tensors + pixel_values = torch.stack(pixel_values, dim=0) # (num_videos, num_frames, max_patches, patch_pixels) + position_ids = torch.stack(position_ids, dim=0) # (num_videos, num_frames, max_patches, 2) + + data = { + "pixel_values_videos": pixel_values, + "video_position_ids": position_ids, + "num_soft_tokens_per_video": num_soft_tokens_per_video, + } + return BatchFeature(data=data, tensor_type=return_tensors) + + +__all__ = ["Gemma4VideoProcessor"] diff --git a/tooling/inference-frameworks/README.md b/tooling/inference-frameworks/README.md new file mode 100644 index 0000000..c3f98f0 --- /dev/null +++ b/tooling/inference-frameworks/README.md @@ -0,0 +1,71 @@ +# Gemma 4 — Inference Framework Support Matrix + +> Non-Ollama frameworks. Ollama is covered separately in the parent research corpus. +> Verified against upstream repos, model cards, and docs on **2026-04-18**. + +## Summary table + +| # | Framework | Gemma 4 support | Vision | Audio | Tool calling | Quantization options | Canonical run command | +|---|---|---|---|---|---|---|---| +| 1 | **vLLM** | Native, upstream merged — `gemma4.py` (text) + `gemma4_mm.py` (multimodal). Registered in `registry.py` as `Gemma4ForCausalLM` and `Gemma4ForConditionalGeneration`. | Yes (all sizes) | Yes (E2B/E4B) | Yes — OpenAI-compatible `/v1/chat/completions` with `tools=[...]` | AWQ, GPTQ, FP8, NVFP4 (via `--quantization modelopt`), BF16 | `vllm serve google/gemma-4-31b-it --tensor-parallel-size 2` | +| 2 | **llama.cpp / GGUF** | Native — `Gemma4Model` + `Gemma4VisionAudioModel` registered in `convert_hf_to_gguf.py` (lines 7666 & 7791). Distinct `GEMMA4V` + `GEMMA4A` projector types. Official GGUFs published at `ggml-org/gemma-4-*-GGUF`. | Yes (all, via mmproj) | Yes (E-series, via mmproj) | Yes — `llama-server` exposes OpenAI-compatible tools API | Q4_K_M, Q8_0, BF16 published officially; full quant menu via self-convert | `llama-server -hf ggml-org/gemma-4-E4B-it-GGUF` | +| 3 | **Apple MLX** | Native in `mlx-lm` (text, `gemma4.py` + `gemma4_text.py`) and `mlx-vlm` (multimodal, `mlx_vlm/models/gemma4/` with `audio.py`, `vision.py`, `language.py`, `processing_gemma4.py`) | Yes (mlx-vlm) | Yes (mlx-vlm) | Community; no first-party tools wrapper | 4bit, 8bit, bf16 via MLX quantize | `mlx_vlm.generate --model mlx-community/gemma-4-E4B-it-8bit --image URL --prompt "..."` | +| 4 | **Keras / keras-hub** | Native, full modular impl: `keras_hub/src/models/gemma4/` with `attention`, `audio_encoder`, `vision_encoder`, `decoder_block`, `moe`, `causal_lm`, etc. 8 presets (base + instruct × 2B/4B/26B_a4b/31B). | Yes | Yes | No (it's a training library, not an inference server) | Via Keras mixed-precision; no canonical GGUF/AWQ path | `keras_hub.models.Gemma4CausalLM.from_preset("gemma4_instruct_4b")` | +| 5 | **HF Text Generation Inference (TGI)** | **No native support.** Supported-models page stops at Gemma 3 / Gemma 3 Text. No open or merged PRs for "gemma4" (verified). Will fall back to unoptimized `AutoModelForCausalLM` path. | Fallback only, no vision kernels | No | Fallback only | Whatever HF transformers exposes on the fallback path | `text-generation-launcher --model-id google/gemma-4-31b-it` (degraded) | +| 6 | **TensorRT-LLM / NVIDIA NIM** | **Not in the 2026-04 support matrix.** Matrix lists `Gemma3ForCausalLM`/`Gemma3ForConditionalGeneration` but no Gemma 4 entry. GitHub issue #12764 tracks broken runtime on DGX Spark/GB10. NVIDIA's own `nvidia/Gemma-4-31B-IT-NVFP4` card tells users to run it on **vLLM**, not TRT-LLM. | N/A | N/A | N/A | NVFP4 export exists but runtime is broken; use the NVFP4 weights in vLLM instead | Avoid — use `vllm serve nvidia/Gemma-4-31B-IT-NVFP4 --quantization modelopt` | +| 7 | **Gemini API (AI Studio)** | Hosted. Model IDs: `gemma-4-31b-it`, `gemma-4-26b-a4b-it`. E-series NOT exposed (on-device only). | Yes (via `inlineData` parts) | No (Gemini API strips the audio path) | Yes — same `tools=[...]` schema as Gemini models | N/A (Google-managed) | `curl .../v1beta/models/gemma-4-26b-a4b-it:generateContent -d @payload.json` | +| 8 | **Vertex AI Model Garden** | One-click deploy. Model card: `console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemma4`. Publisher ID format `google/gemma4@gemma-4-31b-it`. 26B-A4B is offered fully managed & serverless; 31B requires self-provisioned GPU endpoint. | Yes (via endpoint backend — vLLM under the hood) | Yes for E-series variants deployed that way | Yes (endpoint inherits from backing runtime) | Depends on backing image (vLLM/SAX) — BF16, FP8, AWQ selectable at deploy time | `model_garden.OpenModel("google/gemma4@gemma-4-31b-it").deploy()` | + +## Production-readiness ranking + +1. **vLLM** — most complete, most optimized, only runtime with first-party NVFP4 support and tested multimodal (image+audio+video). +2. **llama.cpp / GGUF** — best for local CPU + small GPU, only framework with audio mmproj shipping as a downloadable file for E-series, official Google-published quants via `ggml-org/*`. +3. **Gemini API / Vertex AI** — if you don't want to self-host; Vertex gives you the managed-endpoint exit path with vLLM under the hood. +4. **Apple MLX** — production-ready on Apple Silicon only; `mlx-vlm` is community-maintained but actively updated. +5. **Keras-hub** — reference/training, not inference-server. +6. **TGI** — usable as a *fallback* only; no optimized path yet. +7. **TensorRT-LLM** — **avoid for Gemma 4.** NVIDIA themselves point at vLLM. + +## Capabilities beyond Ollama + +- **Native audio input** — Ollama does **not** currently expose the E2B/E4B audio tower. Three frameworks do: + - **llama.cpp** with the `mmproj-...-E4B-it-*.gguf` projector (`VisionProjectorType.GEMMA4A`), + - **vLLM** via `gemma4_mm.py` (`input_features_padded`, `input_features_mask`), + - **MLX** via `mlx-vlm/models/gemma4/audio.py`. + If Seth ever wants the speech-transcription path, llama.cpp with the E4B mmproj is the shortest route from where he already is. +- **Video with interleaved audio** — vLLM's `gemma4_mm.py` decomposes videos into up to 32 timestamped frames; with E-series models it also loads the audio track (`load_audio_from_video=True`). Ollama has no video path at all. +- **NVFP4 on Blackwell** — vLLM only. `nvidia/Gemma-4-31B-IT-NVFP4` reports ~0.3 pp accuracy loss vs BF16 on GPQA Diamond / MMLU Pro. + +## Framework to avoid + +**TensorRT-LLM.** Not in the upstream support matrix as of 2026-04, known runtime bug on DGX Spark/GB10 (issue #12764), and NVIDIA's own NVFP4 checkpoint directs users to vLLM. Revisit only after a future TRT-LLM release lists `Gemma4ForCausalLM` in the support matrix. + +## Files in this directory + +``` +inference-frameworks/ +├── README.md — this file +├── run_commands.sh — canonical one-liners per framework +└── snippets/ + ├── llamacpp_convert_gemma4_excerpt.py — Gemma4Model + Gemma4VisionAudioModel from convert_hf_to_gguf.py (lines 7666-7840) + ├── vllm_gemma4_head_80.py — gemma4.py header (imports, config deref) + ├── vllm_gemma4_mm_head_80.py — gemma4_mm.py header (multimodal docstring lists image/audio/video) + ├── vllm_registry_excerpt.txt — registry.py Gemma4 registrations + ├── mlx_gemma4_head_100.py — mlx-lm gemma4.py (text) first 100 lines + ├── mlx_vlm_gemma4_head_60.py — mlx-vlm gemma4/gemma4.py (multimodal) first 60 lines + ├── keras_hub_gemma4.py — canonical keras-hub example + preset list + ├── gemini_api_gemma4.sh — canonical curl example + └── gemini_api_gemma4.py — canonical google-genai Python SDK example +``` + +## Notable upstream references + +- vLLM Gemma 4 model class: `vllm-project/vllm:vllm/model_executor/models/gemma4.py` and `gemma4_mm.py` +- llama.cpp HF → GGUF converter: `ggml-org/llama.cpp:convert_hf_to_gguf.py` lines 7666-7840 +- Official Google GGUF repos (verified live): `ggml-org/gemma-4-{E2B,E4B,31B,26b-a4b}-it-GGUF` — all ship mmproj projector files +- HF blog: huggingface.co/blog/gemma4 — shows `AutoModelForMultimodalLM` is the canonical transformers entry point +- NVIDIA NVFP4 checkpoint: `nvidia/Gemma-4-31B-IT-NVFP4` — runtime=vLLM, not TRT-LLM +- Gemini API doc: ai.google.dev/gemma/docs/core/gemma_on_gemini_api +- Vertex AI Model Garden: console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemma4 +- TGI supported-models list (confirming *absence* of Gemma 4): huggingface.co/docs/text-generation-inference/supported_models +- TRT-LLM support matrix (confirming *absence*): nvidia.github.io/TensorRT-LLM/reference/support-matrix.html diff --git a/tooling/inference-frameworks/run_commands.sh b/tooling/inference-frameworks/run_commands.sh new file mode 100644 index 0000000..f14bd21 --- /dev/null +++ b/tooling/inference-frameworks/run_commands.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Canonical one-liners to serve Gemma 4 across inference frameworks. +# Verified against upstream repos / model cards on 2026-04-18. +# Not meant to be executed as a script — each block is a standalone example. + +### 1. vLLM — full multimodal (text + vision + audio + video) ### +# Text-only 31B dense: +vllm serve google/gemma-4-31b-it --tensor-parallel-size 2 +# Multimodal E4B (vision + audio): +vllm serve google/gemma-4-E4B-it --limit-mm-per-prompt image=4,audio=1 +# NVFP4-quantized 31B on Blackwell/H100 (NVIDIA's official quant): +vllm serve nvidia/Gemma-4-31B-IT-NVFP4 --quantization modelopt --tensor-parallel-size 8 + +### 2. llama.cpp — official ggml-org GGUFs ### +# Text-only via -hf shortcut (auto-download, default = Q4_K_M if multiple present): +llama-server -hf ggml-org/gemma-4-E4B-it-GGUF +# Choose a specific quant: +llama-server -hf ggml-org/gemma-4-26b-a4b-it-GGUF:Q4_K_M +# Vision (+ audio for E-series) — add --mmproj pointing to the projector: +llama-server -hf ggml-org/gemma-4-E4B-it-GGUF \ + --mmproj ggml-org/gemma-4-E4B-it-GGUF/mmproj-gemma-4-E4B-it-Q8_0.gguf +# Convert a new HF checkpoint to GGUF yourself: +python convert_hf_to_gguf.py /path/to/google/gemma-4-31b-it --outfile gemma-4-31b.gguf + +### 3. Apple MLX — text via mlx-lm, multimodal via mlx-vlm (community) ### +# Text generation (mlx-lm, first-party Apple): +mlx_lm.generate --model mlx-community/gemma-4-E4B-it-4bit --prompt "Hello" +# Vision/audio (mlx-vlm, Prince Canuma / community): +mlx_vlm.generate --model mlx-community/gemma-4-E4B-it-8bit \ + --image https://example.com/cat.jpg --prompt "Describe this image." + +### 4. Keras / keras-hub — reference implementation, training-focused ### +# python: +# import keras_hub +# model = keras_hub.models.Gemma4CausalLM.from_preset("gemma4_instruct_4b") +# model.generate("Hello", max_length=128) +# Presets: gemma4_{2b,4b,26b_a4b,31b} and gemma4_instruct_{...} + +### 5. Text Generation Inference (TGI) — NO native Gemma 4 support as of 2026-04-18 ### +# Upstream supported_models list stops at Gemma 3 / Gemma 3 Text. +# Fallback: TGI will try AutoModelForCausalLM without optimized kernels — +# expect degraded throughput and no guarantee of vision/audio paths. +text-generation-launcher --model-id google/gemma-4-31b-it # unoptimized fallback + +### 6. TensorRT-LLM — NOT supported ### +# Support matrix (2026-04) lists Gemma2 and Gemma3{ForCausalLM,ForConditionalGeneration} +# but NOT Gemma4. NVIDIA's own nvidia/Gemma-4-31B-IT-NVFP4 card points users to vLLM. +# Issue #12764 tracks DGX Spark runtime skew. Avoid for production Gemma 4. + +### 7. Gemini API (Google AI Studio) — hosted Gemma 4 ### +curl "https://generativelanguage.googleapis.com/v1beta/models/gemma-4-26b-a4b-it:generateContent" \ + -H 'Content-Type: application/json' \ + -H "x-goog-api-key: $GEMINI_API_KEY" \ + -X POST \ + -d '{"contents":[{"parts":[{"text":"Your prompt here"}]}]}' +# Python SDK (google-genai): +# from google import genai +# client = genai.Client() +# resp = client.models.generate_content(model="gemma-4-26b-a4b-it", contents="Hi") +# print(resp.text) +# Hosted model IDs: gemma-4-31b-it, gemma-4-26b-a4b-it + +### 8. Vertex AI Model Garden — one-click deploy ### +# Console: https://console.cloud.google.com/vertex-ai/publishers/google/model-garden/gemma4 +# CLI (new model-garden command): +gcloud ai model-garden models list | grep gemma-4 +# Python SDK (vertex-ai-model-garden): +# from google.cloud.aiplatform import model_garden +# model = model_garden.OpenModel("google/gemma4@gemma-4-31b-it") +# endpoint = model.deploy() # spins up Vertex endpoint with backing GPUs diff --git a/tooling/inference-frameworks/snippets/gemini_api_gemma4.py b/tooling/inference-frameworks/snippets/gemini_api_gemma4.py new file mode 100644 index 0000000..5c173bb --- /dev/null +++ b/tooling/inference-frameworks/snippets/gemini_api_gemma4.py @@ -0,0 +1,26 @@ +"""Canonical Gemma 4 call via the google-genai Python SDK (Gemini API). + +Source: https://ai.google.dev/gemma/docs/core/gemma_on_gemini_api + +Install: pip install google-genai +Env: GEMINI_API_KEY=... (from https://aistudio.google.com/apikey) + +Hosted model IDs (2026-04): + - gemma-4-31b-it + - gemma-4-26b-a4b-it + +The E-series (E2B, E4B) is NOT exposed via the Gemini API — those are +on-device-only checkpoints. For them you must self-host (Ollama, +llama.cpp, vLLM, MLX). +""" + +from google import genai + +client = genai.Client() # picks up GEMINI_API_KEY from env + +response = client.models.generate_content( + model="gemma-4-26b-a4b-it", + contents="Write a haiku about inference framework fragmentation.", +) + +print(response.text) diff --git a/tooling/inference-frameworks/snippets/gemini_api_gemma4.sh b/tooling/inference-frameworks/snippets/gemini_api_gemma4.sh new file mode 100644 index 0000000..a9253a8 --- /dev/null +++ b/tooling/inference-frameworks/snippets/gemini_api_gemma4.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Canonical Gemma 4 call via the Gemini API (Google AI Studio). +# Source: https://ai.google.dev/gemma/docs/core/gemma_on_gemini_api +# Hosted model IDs (2026-04): gemma-4-31b-it, gemma-4-26b-a4b-it +# Note: hosted variants are the big ones only; on-device E2B/E4B are NOT served on the Gemini API. + +export GEMINI_API_KEY="..." # from https://aistudio.google.com/apikey + +curl "https://generativelanguage.googleapis.com/v1beta/models/gemma-4-26b-a4b-it:generateContent" \ + -H 'Content-Type: application/json' \ + -H "x-goog-api-key: ${GEMINI_API_KEY}" \ + -X POST \ + -d '{ + "contents": [{ + "parts": [{"text": "Write a haiku about inference framework fragmentation."}] + }] + }' diff --git a/tooling/inference-frameworks/snippets/keras_hub_gemma4.py b/tooling/inference-frameworks/snippets/keras_hub_gemma4.py new file mode 100644 index 0000000..1f7e9e3 --- /dev/null +++ b/tooling/inference-frameworks/snippets/keras_hub_gemma4.py @@ -0,0 +1,30 @@ +"""Canonical Keras / keras-hub example for Gemma 4. + +Source: keras-team/keras-hub — keras_hub/src/models/gemma4/ +Requires: pip install keras-hub keras[jax] (or keras[torch] / keras[tensorflow]) + +Presets (verified 2026-04-18 from gemma4_presets.py): + gemma4_2b gemma4_instruct_2b + gemma4_4b gemma4_instruct_4b + gemma4_26b_a4b gemma4_instruct_26b_a4b + gemma4_31b gemma4_instruct_31b + +Keras-hub is the reference implementation maintained by the Keras team +(Google). It ships all components modularly — see the directory listing: +gemma4_attention, gemma4_audio_encoder, gemma4_vision_encoder, +gemma4_moe, gemma4_decoder_block, gemma4_causal_lm, etc. This makes it +the most legible path to *read* the architecture, but it is a +training/fine-tuning tool — not a production inference server. +""" + +import keras_hub + +# Text causal LM +model = keras_hub.models.Gemma4CausalLM.from_preset("gemma4_instruct_4b") +print(model.generate("Write a haiku about JAX.", max_length=128)) + +# For multimodal (vision/audio) use the backbone + preprocessors directly: +# backbone = keras_hub.models.Gemma4Backbone.from_preset("gemma4_instruct_4b") +# preproc = keras_hub.models.Gemma4CausalLMPreprocessor.from_preset("gemma4_instruct_4b") +# Vision and audio encoders are in separate modules (gemma4_vision_encoder, +# gemma4_audio_encoder) and are wired by the backbone when preset includes them. diff --git a/tooling/inference-frameworks/snippets/llamacpp_convert_gemma4_excerpt.py b/tooling/inference-frameworks/snippets/llamacpp_convert_gemma4_excerpt.py new file mode 100644 index 0000000..e34d0e6 --- /dev/null +++ b/tooling/inference-frameworks/snippets/llamacpp_convert_gemma4_excerpt.py @@ -0,0 +1,175 @@ +@ModelBase.register("Gemma4ForConditionalGeneration") +class Gemma4Model(Gemma3Model): + model_arch = gguf.MODEL_ARCH.GEMMA4 + + def norm_shift(self, name: str) -> float: + del name # unused + return 0.0 + + def set_vocab(self): + vocab = gguf.LlamaHfVocab(self.dir_model) + tokens = [] + scores = [] + toktypes = [] + visible_tokens = {"<|channel>", "", "<|tool_call>", "", "<|tool_response>", "", "<|\"|>"} + + for text, score, toktype in vocab.all_tokens(): + tokens.append(text) + scores.append(score) + text_str = text.decode() + if text_str in visible_tokens: + # always render these tokens, so that the chat parser can read them + toktypes.append(gguf.TokenType.USER_DEFINED) + logger.info(f"Token '{text_str}' is set to USER_DEFINED") + else: + toktypes.append(toktype) + + assert len(tokens) == vocab.vocab_size + + self.gguf_writer.add_tokenizer_model("gemma4") + self.gguf_writer.add_token_list(tokens) + self.gguf_writer.add_token_scores(scores) + self.gguf_writer.add_token_types(toktypes) + + special_vocab = gguf.SpecialVocab(self.dir_model, load_merges=True) + special_vocab.add_to_gguf(self.gguf_writer) + self.gguf_writer.add_add_space_prefix(False) + self.gguf_writer.add_add_bos_token(True) + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + num_kv_shared_layers = self.hparams["num_kv_shared_layers"] + self.gguf_writer.add_shared_kv_layers(num_kv_shared_layers) + + # per-layer embedding is optional + n_pl_embd = self.hparams.get("hidden_size_per_layer_input") or 0 + self.gguf_writer.add_embedding_length_per_layer_input(n_pl_embd) + + swa_layers = [t == "sliding_attention" for t in self.hparams["layer_types"]] + self.gguf_writer.add_sliding_window_pattern(swa_layers) + + head_dim_full = self.hparams["global_head_dim"] + head_dim_swa = self.hparams["head_dim"] + # correct the head dim for global/swa layers + self.gguf_writer.add_key_length(head_dim_full) + self.gguf_writer.add_value_length(head_dim_full) + self.gguf_writer.add_key_length_swa(head_dim_swa) + self.gguf_writer.add_value_length_swa(head_dim_swa) + + expert_intermediate_size = self.find_hparam(["expert_intermediate_size", "moe_intermediate_size"]) + if expert_intermediate_size is not None: + self.gguf_writer.add_expert_feed_forward_length(expert_intermediate_size) + + # if use_double_wide_mlp is set, we need to adjust the value for kv shared layers + use_double_wide_mlp = self.hparams.get("use_double_wide_mlp", False) + first_kv_shared_layer_idx = self.block_count - num_kv_shared_layers + if use_double_wide_mlp: + n_ff = self.hparams["intermediate_size"] + n_ff_arr = [n_ff if il < first_kv_shared_layer_idx else n_ff * 2 for il in range(self.block_count)] + self.gguf_writer.add_feed_forward_length(n_ff_arr) + + # handle num_global_key_value_heads + num_key_value_heads_full = self.hparams.get("num_global_key_value_heads") + num_key_value_heads_swa = self.hparams.get("num_key_value_heads") + if num_key_value_heads_full is not None and num_key_value_heads_swa is not None: + value_arr = [num_key_value_heads_swa if is_swa else num_key_value_heads_full for is_swa in swa_layers] + self.gguf_writer.add_head_count_kv(value_arr) + + # handle n_rot differently for global vs swa layers + partial_rotary_factor_swa = self.hparams.get("partial_rotary_factor", 1.0) + n_rot_full = int(head_dim_full) # "proportional" is used, see generate_extra_tensors + n_rot_swa = int(head_dim_swa * partial_rotary_factor_swa) + self.gguf_writer.add_rope_dimension_count(n_rot_full) + self.gguf_writer.add_rope_dimension_count_swa(n_rot_swa) + + def generate_extra_tensors(self) -> Iterable[tuple[str, Tensor]]: + # full layer uses "proportional" rope with partial_rotary_factor=0.25 + # the expected ordering is cc000000ss000000 (c = cos, s = sin, 0 = unrotated), + # but ggml neox only supports ccss000000000000, and we cannot rearrange the head because that will break use_alternative_attention + # solution is to set specific freq_factors for the unrotated dims + + # IMPORTANT: this ROPE_FREQS tensor is ONLY used by the full_attention layers + rope_params_full = self.hparams["rope_parameters"]["full_attention"] + assert rope_params_full["rope_type"] == "proportional" + head_dim_full = (self.hparams["global_head_dim"]) + partial_rotary_factor_full = rope_params_full["partial_rotary_factor"] + n_rot_full = int(head_dim_full * partial_rotary_factor_full / 2) + n_unrot_full = int(head_dim_full / 2) - n_rot_full + values = [1.0] * n_rot_full + [1e30] * n_unrot_full + rope_freqs_full = torch.tensor(values, dtype=torch.float32) + yield (self.format_tensor_name(gguf.MODEL_TENSOR.ROPE_FREQS), rope_freqs_full) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + if name.endswith("per_dim_scale") or name.endswith("layer_scalar"): + name = name + ".weight" + + if "language_model." not in name and "rope_freqs" not in name: + return # skip non-language model tensors + + name = name.replace("language_model.", "") + if name.endswith("router.scale"): + name = self.format_tensor_name(gguf.MODEL_TENSOR.FFN_GATE_INP, bid, ".scale") + yield (name, data_torch) + return + if ".per_expert_scale" in name: + # convert per-expert scale to FFN down scale + name = self.format_tensor_name(gguf.MODEL_TENSOR.FFN_DOWN_EXP, bid, ".scale") + yield (name, data_torch) + return + if ".experts." in name and not name.endswith(".weight"): + name += ".weight" + + yield from super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Gemma4ForConditionalGeneration") +class Gemma4VisionAudioModel(MmprojModel): + has_audio_encoder = True + has_vision_encoder = True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.hparams_vision is not None + self.hparams_vision["image_size"] = 224 # unused, but set to avoid error + + # remap audio hparams + if self.hparams_audio: + self.hparams_audio["feat_in"] = self.hparams_audio.get("input_feat_size", 128) + self.hparams_audio["intermediate_size"] = self.hparams_audio["hidden_size"] * 4 + else: + self.has_audio_encoder = False + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + # vision params + self.gguf_writer.add_clip_vision_projector_type(gguf.VisionProjectorType.GEMMA4V) + self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-6)) + + # audio params + if self.hparams_audio: + self.gguf_writer.add_clip_audio_projector_type(gguf.VisionProjectorType.GEMMA4A) + self.gguf_writer.add_audio_num_mel_bins(self.hparams_audio["feat_in"]) + self.gguf_writer.add_audio_attention_layernorm_eps(1e-5) + + def is_audio_tensor(self, name: str) -> bool: + return "audio_tower" in name or "embed_audio" in name + + def tensor_force_quant(self, name, new_name, bid, n_dims): + if self.is_audio_tensor(name): + if ".conv" in name or "_conv" in name and ".weight" in name: + return gguf.GGMLQuantizationType.F32 + if "position_embedding_table" in name: + return gguf.GGMLQuantizationType.F32 + return super().tensor_force_quant(name, new_name, bid, n_dims) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if name.startswith("model.language_model."): + return # skip + + if len(data_torch.shape) == 0: + # convert scalar tensors (input/output_mix/max) to 1D tensors + data_torch = data_torch.unsqueeze(0) diff --git a/tooling/inference-frameworks/snippets/mlx_gemma4_head_100.py b/tooling/inference-frameworks/snippets/mlx_gemma4_head_100.py new file mode 100644 index 0000000..2489537 --- /dev/null +++ b/tooling/inference-frameworks/snippets/mlx_gemma4_head_100.py @@ -0,0 +1,92 @@ +# Copyright © 2025 Apple Inc. + +from dataclasses import dataclass +from typing import Optional + +import mlx.core as mx +import mlx.nn as nn +from mlx.utils import tree_flatten, tree_unflatten + +from . import gemma4_text +from .base import BaseModelArgs + + +@dataclass +class ModelArgs(BaseModelArgs): + model_type: str = "gemma4" + text_config: dict = None + vocab_size: int = 262144 + + def __post_init__(self): + if self.text_config is None: + self.text_config = {} + self.text_config["vocab_size"] = self.vocab_size + self.text_config["num_attention_heads"] = self.text_config.get( + "num_attention_heads", 8 + ) + self.text_config["num_key_value_heads"] = self.text_config.get( + "num_key_value_heads", 1 + ) + + +class Model(nn.Module): + def __init__(self, args: ModelArgs): + super().__init__() + self.args = args + self.model_type = args.model_type + self.language_model = gemma4_text.Model( + gemma4_text.ModelArgs.from_dict(args.text_config) + ) + + def __call__( + self, + inputs: mx.array, + cache=None, + input_embeddings: Optional[mx.array] = None, + per_layer_inputs: Optional[mx.array] = None, + ): + return self.language_model( + inputs, + cache=cache, + input_embeddings=input_embeddings, + per_layer_inputs=per_layer_inputs, + ) + + def sanitize(self, weights): + new_weights = {} + for k, v in weights.items(): + starts_w_model = k.startswith("model.") + + k = k.removeprefix("model.") + if k.startswith( + ( + "vision_tower", + "multi_modal_projector", + "audio_tower", + "embed_audio", + "embed_vision", + ) + ): + continue + + if not starts_w_model: + new_weights[k] = v + continue + + if k.startswith("language_model"): + k = k.replace("language_model.", "language_model.model.") + + new_weights[k] = v + + return self.language_model.sanitize(new_weights) + + @property + def layers(self): + return self.language_model.layers + + @property + def quant_predicate(self): + return self.language_model.quant_predicate + + def make_cache(self): + return self.language_model.make_cache() diff --git a/tooling/inference-frameworks/snippets/mlx_vlm_gemma4_head_60.py b/tooling/inference-frameworks/snippets/mlx_vlm_gemma4_head_60.py new file mode 100644 index 0000000..0ef80a0 --- /dev/null +++ b/tooling/inference-frameworks/snippets/mlx_vlm_gemma4_head_60.py @@ -0,0 +1,60 @@ +from typing import Optional + +import mlx.core as mx +import mlx.nn as nn + +from ..base import InputEmbeddingsFeatures +from .audio import AudioEncoder +from .config import ModelConfig +from .language import LanguageModel, RMSNormNoScale +from .vision import VisionModel + + +def masked_scatter(input_tensor, mask, source): + mask_flat = mask.flatten().astype(mx.int32) + indices = mx.cumsum(mask_flat) - 1 + aligned = source.flatten()[indices % source.size] + return mx.where(mask_flat, aligned, input_tensor.flatten()).reshape( + input_tensor.shape + ) + + +class MultimodalEmbedder(nn.Module): + """Projects soft tokens from vision/audio into language model space.""" + + def __init__(self, embedding_dim: int, text_hidden_size: int, eps: float = 1e-6): + super().__init__() + self.embedding_projection = nn.Linear( + embedding_dim, text_hidden_size, bias=False + ) + self.embedding_pre_projection_norm = RMSNormNoScale(embedding_dim, eps=eps) + + def __call__(self, inputs_embeds: mx.array) -> mx.array: + normed = self.embedding_pre_projection_norm(inputs_embeds) + return self.embedding_projection(normed) + + +class Model(nn.Module): + def __init__(self, config: ModelConfig): + super().__init__() + self.model_type = config.model_type + self.config = config + + # Text + self.language_model = LanguageModel(config.text_config) + self.vocab_size = config.text_config.vocab_size + + # Vision + self.vision_tower = VisionModel(config.vision_config) + self.embed_vision = MultimodalEmbedder( + embedding_dim=config.vision_config.hidden_size, + text_hidden_size=config.text_config.hidden_size, + eps=config.vision_config.rms_norm_eps, + ) + + # Audio + if config.audio_config is not None: + self.audio_tower = AudioEncoder(config.audio_config) + audio_output_dim = ( + config.audio_config.output_proj_dims or config.audio_config.hidden_size + ) diff --git a/tooling/inference-frameworks/snippets/vllm_gemma4_head_80.py b/tooling/inference-frameworks/snippets/vllm_gemma4_head_80.py new file mode 100644 index 0000000..f8ffa64 --- /dev/null +++ b/tooling/inference-frameworks/snippets/vllm_gemma4_head_80.py @@ -0,0 +1,90 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project +# Copyright 2025 The vLLM team. +# Copyright 2025 Google Inc. HuggingFace Inc. team. 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. +"""Gemma 4 model implementation for vLLM.""" + +from collections.abc import Iterable +from dataclasses import replace +from itertools import islice + +import regex as re +import torch +from torch import nn + +from vllm.compilation.decorators import support_torch_compile +from vllm.config import CacheConfig, VllmConfig +from vllm.distributed import ( + get_pp_group, + get_tensor_model_parallel_rank, + get_tensor_model_parallel_world_size, +) +from vllm.forward_context import get_forward_context +from vllm.logger import init_logger +from vllm.model_executor.layers.activation import GeluAndMul +from vllm.model_executor.layers.attention import Attention +from vllm.model_executor.layers.fused_moe import FusedMoE, GateLinear +from vllm.model_executor.layers.layernorm import RMSNorm +from vllm.model_executor.layers.linear import ( + ColumnParallelLinear, + MergedColumnParallelLinear, + QKVParallelLinear, + ReplicatedLinear, + RowParallelLinear, +) +from vllm.model_executor.layers.logits_processor import LogitsProcessor +from vllm.model_executor.layers.quantization import QuantizationConfig +from vllm.model_executor.layers.rotary_embedding import get_rope +from vllm.model_executor.layers.vocab_parallel_embedding import ( + ParallelLMHead, + VocabParallelEmbedding, +) +from vllm.model_executor.model_loader.weight_utils import ( + default_weight_loader, + maybe_remap_kv_scale_name, +) +from vllm.sequence import IntermediateTensors +from vllm.v1.attention.backends.utils import KVSharingFastPrefillMetadata + +from .interfaces import ( + EagleModelMixin, + MixtureOfExperts, + SupportsEagle3, + SupportsLoRA, + SupportsPP, +) +from .utils import ( + AutoWeightsLoader, + WeightsMapper, + extract_layer_index, + is_pp_missing_parameter, + make_layers, + maybe_prefix, +) + +logger = init_logger(__name__) + + +def _get_text_config(config): + """Dereference text_config if config is a nested Gemma4Config. + + Gemma4 checkpoints use architectures=["Gemma4ForConditionalGeneration"] + which yields a Gemma4Config with nested text_config. This function + transparently returns the text config regardless of nesting. + """ + if hasattr(config, "text_config"): + return config.text_config diff --git a/tooling/inference-frameworks/snippets/vllm_gemma4_mm_head_80.py b/tooling/inference-frameworks/snippets/vllm_gemma4_mm_head_80.py new file mode 100644 index 0000000..6ee45dd --- /dev/null +++ b/tooling/inference-frameworks/snippets/vllm_gemma4_mm_head_80.py @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project +"""Gemma 4 multimodal model (image + audio + video support). + +Adds vision tower, audio tower, and multimodal embedders on top of the +text-only Gemma4ForCausalLM. The vision/audio encoders are loaded via +AutoModel.from_config and run in eager mode while the language model uses +the vLLM-optimized path. + +Video support: Gemma4 does **not** have a native video tower. Videos are +decomposed into timestamped image frames (up to 32 frames at 70 soft tokens +each) and fed through the same vision tower as regular images. The +processor inserts ``mm:ss`` timestamps between frames so the model can +reason about temporal order. +""" + +import math +from collections.abc import Iterable, Mapping, Sequence +from typing import Annotated, Any, Literal + +import numpy as np +import torch +from PIL import Image as PILImage +from torch import nn +from transformers import AutoModel, BatchFeature +from transformers.models.gemma4 import ( + Gemma4Config, + Gemma4Processor, + Gemma4VisionConfig, +) +from transformers.models.gemma4.configuration_gemma4 import ( + Gemma4AudioConfig, + Gemma4TextConfig, +) + +from vllm.config import VllmConfig +from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions +from vllm.inputs import MultiModalDataDict +from vllm.logger import init_logger +from vllm.model_executor.layers.layernorm import RMSNorm +from vllm.model_executor.layers.linear import ReplicatedLinear +from vllm.model_executor.models.gemma4 import Gemma4ForCausalLM +from vllm.model_executor.models.module_mapping import MultiModelKeys +from vllm.multimodal import MULTIMODAL_REGISTRY +from vllm.multimodal.inputs import ( + MultiModalFieldConfig, + MultiModalKwargsItems, + VideoItem, +) +from vllm.multimodal.parse import ( + AudioProcessorItems, + ImageProcessorItems, + MultiModalDataItems, + MultiModalDataParser, +) +from vllm.multimodal.processing import BaseDummyInputsBuilder +from vllm.multimodal.processing.processor import ( + BaseMultiModalProcessor, + BaseProcessingInfo, + PromptReplacement, + PromptUpdate, + PromptUpdateDetails, +) +from vllm.sequence import IntermediateTensors +from vllm.utils.tensor_schema import TensorSchema, TensorShape + +from .interfaces import ( + MultiModalEmbeddings, + SupportsEagle3, + SupportsLoRA, + SupportsMultiModal, + SupportsPP, +) +from .utils import ( + AutoWeightsLoader, + WeightsMapper, + init_vllm_registered_model, + maybe_prefix, +) + diff --git a/tooling/inference-frameworks/snippets/vllm_registry_excerpt.txt b/tooling/inference-frameworks/snippets/vllm_registry_excerpt.txt new file mode 100644 index 0000000..54fb140 --- /dev/null +++ b/tooling/inference-frameworks/snippets/vllm_registry_excerpt.txt @@ -0,0 +1,16 @@ +# Source: vllm-project/vllm main branch — vllm/model_executor/models/registry.py +# Verified 2026-04-18 via GitHub API. + +# Line 99 (text-only Gemma 4 CausalLM): +"Gemma4ForCausalLM": ("gemma4", "Gemma4ForCausalLM"), + +# Line 230 (multimodal Gemma 4: vision + audio + video): +"Gemma4ForCausalLM": ("gemma4_mm", "Gemma4ForConditionalGeneration"), + +# The second (_mm) registration maps Gemma4ForCausalLM -> gemma4_mm.Gemma4ForConditionalGeneration, +# which wires in: +# - vision_tower (pixel_values, pixel_position_ids) +# - audio_tower (input_features_padded, input_features_mask) [E2B/E4B only] +# - video path (pixel_values_videos — decomposed to frames, up to 32 frames @ 70 soft tokens) +# +# vLLM dispatches based on whether the HF config has audio_config populated.

Source: Google (blog.google)

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%0Df+*&;H*_>+aFE?abLzc_&!+1Gx5D0P5qK+?||B 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�+& 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 IC&(|zpM?7QRd0RD?bt}hYL)wyjKOYGAXFr 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�d;_P4;bY7f4eiK@3I!|u&EE9N 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