Upload 5 files
Browse files- .gitattributes +1 -0
- JMTB_1_rescore_float.csv +3 -0
- modernbert_run_test.ipynb +947 -0
- test_check.png +0 -0
- train_jmtb_test_v6 (コピー).ipynb +853 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
JMTB_1_rescore_float.csv filter=lfs diff=lfs merge=lfs -text
|
JMTB_1_rescore_float.csv
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cc332dc75886e5c8679ad098739972d741770591223fe0ada0e74078494487ca
|
3 |
+
size 47064523
|
modernbert_run_test.ipynb
ADDED
@@ -0,0 +1,947 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 3,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"ename": "ValueError",
|
10 |
+
"evalue": "The config parameter `problem_type` was not understood: received single_label_regression but only 'regression', 'single_label_classification' and 'multi_label_classification' are valid.",
|
11 |
+
"output_type": "error",
|
12 |
+
"traceback": [
|
13 |
+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
14 |
+
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
|
15 |
+
"Cell \u001b[0;32mIn[3], line 18\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# もし学習時のクラスがカスタムクラス ModernBertForScoring なら\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# model = ModernBertForScoring.from_pretrained(MODEL_DIR)\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 15\u001b[0m \n\u001b[1;32m 16\u001b[0m \u001b[38;5;66;03m# 例:カスタムクラス ModernBertForScoring の場合\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrain_jmtb_v6\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ModernBertForScoring\n\u001b[0;32m---> 18\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mModernBertForScoring\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\u001b[43mMODEL_DIR\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 20\u001b[0m tokenizer \u001b[38;5;241m=\u001b[39m AutoTokenizer\u001b[38;5;241m.\u001b[39mfrom_pretrained(MODEL_DIR)\n\u001b[1;32m 22\u001b[0m \u001b[38;5;66;03m# GPU利用する場合\u001b[39;00m\n",
|
16 |
+
"File \u001b[0;32m~/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/modeling_utils.py:3571\u001b[0m, in \u001b[0;36mPreTrainedModel.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, config, cache_dir, ignore_mismatched_sizes, force_download, local_files_only, token, revision, use_safetensors, weights_only, *model_args, **kwargs)\u001b[0m\n\u001b[1;32m 3569\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(config, PretrainedConfig):\n\u001b[1;32m 3570\u001b[0m config_path \u001b[38;5;241m=\u001b[39m config \u001b[38;5;28;01mif\u001b[39;00m config \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m pretrained_model_name_or_path\n\u001b[0;32m-> 3571\u001b[0m config, model_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig_class\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_pretrained\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3572\u001b[0m \u001b[43m \u001b[49m\u001b[43mconfig_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3573\u001b[0m \u001b[43m \u001b[49m\u001b[43mcache_dir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3574\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_unused_kwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 3575\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce_download\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforce_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3576\u001b[0m \u001b[43m \u001b[49m\u001b[43mresume_download\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresume_download\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3577\u001b[0m \u001b[43m \u001b[49m\u001b[43mproxies\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mproxies\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3578\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_files_only\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlocal_files_only\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3579\u001b[0m \u001b[43m \u001b[49m\u001b[43mtoken\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3580\u001b[0m \u001b[43m \u001b[49m\u001b[43mrevision\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrevision\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3581\u001b[0m \u001b[43m \u001b[49m\u001b[43msubfolder\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msubfolder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3582\u001b[0m \u001b[43m \u001b[49m\u001b[43m_from_auto\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrom_auto_class\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3583\u001b[0m \u001b[43m \u001b[49m\u001b[43m_from_pipeline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrom_pipeline\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3584\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3585\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3586\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 3587\u001b[0m \u001b[38;5;66;03m# In case one passes a config to `from_pretrained` + \"attn_implementation\"\u001b[39;00m\n\u001b[1;32m 3588\u001b[0m \u001b[38;5;66;03m# override the `_attn_implementation` attribute to `attn_implementation` of the kwargs\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3592\u001b[0m \u001b[38;5;66;03m# we pop attn_implementation from the kwargs but this handles the case where users\u001b[39;00m\n\u001b[1;32m 3593\u001b[0m \u001b[38;5;66;03m# passes manually the config to `from_pretrained`.\u001b[39;00m\n\u001b[1;32m 3594\u001b[0m config \u001b[38;5;241m=\u001b[39m copy\u001b[38;5;241m.\u001b[39mdeepcopy(config)\n",
|
17 |
+
"File \u001b[0;32m~/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/configuration_utils.py:569\u001b[0m, in \u001b[0;36mPretrainedConfig.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, cache_dir, force_download, local_files_only, token, revision, **kwargs)\u001b[0m\n\u001b[1;32m 563\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m config_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel_type\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_type:\n\u001b[1;32m 564\u001b[0m logger\u001b[38;5;241m.\u001b[39mwarning(\n\u001b[1;32m 565\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou are using a model of type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconfig_dict[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmodel_type\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m to instantiate a model of type \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 566\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_type\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. This is not supported for all configurations of models and can yield errors.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 567\u001b[0m )\n\u001b[0;32m--> 569\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mconfig_dict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
|
18 |
+
"File \u001b[0;32m~/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/configuration_utils.py:740\u001b[0m, in \u001b[0;36mPretrainedConfig.from_dict\u001b[0;34m(cls, config_dict, **kwargs)\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;66;03m# We remove it from kwargs so that it does not appear in `return_unused_kwargs`.\u001b[39;00m\n\u001b[1;32m 738\u001b[0m config_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mattn_implementation\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mattn_implementation\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 740\u001b[0m config \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mconfig_dict\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 742\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(config, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpruned_heads\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 743\u001b[0m config\u001b[38;5;241m.\u001b[39mpruned_heads \u001b[38;5;241m=\u001b[39m {\u001b[38;5;28mint\u001b[39m(key): value \u001b[38;5;28;01mfor\u001b[39;00m key, value \u001b[38;5;129;01min\u001b[39;00m config\u001b[38;5;241m.\u001b[39mpruned_heads\u001b[38;5;241m.\u001b[39mitems()}\n",
|
19 |
+
"File \u001b[0;32m~/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/models/modernbert/configuration_modernbert.py:173\u001b[0m, in \u001b[0;36mModernBertConfig.__init__\u001b[0;34m(self, vocab_size, hidden_size, intermediate_size, num_hidden_layers, num_attention_heads, hidden_activation, max_position_embeddings, initializer_range, initializer_cutoff_factor, norm_eps, norm_bias, pad_token_id, eos_token_id, bos_token_id, cls_token_id, sep_token_id, global_rope_theta, attention_bias, attention_dropout, global_attn_every_n_layers, local_attention, local_rope_theta, embedding_dropout, mlp_bias, mlp_dropout, decoder_bias, classifier_pooling, classifier_dropout, classifier_bias, classifier_activation, deterministic_flash_attn, sparse_prediction, sparse_pred_ignore_index, reference_compile, repad_logits_with_grad, **kwargs)\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 136\u001b[0m vocab_size\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m50368\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 172\u001b[0m ):\n\u001b[0;32m--> 173\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43mpad_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpad_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[43m \u001b[49m\u001b[43mbos_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbos_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 176\u001b[0m \u001b[43m \u001b[49m\u001b[43meos_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meos_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 177\u001b[0m \u001b[43m \u001b[49m\u001b[43mcls_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcls_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 178\u001b[0m \u001b[43m \u001b[49m\u001b[43msep_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msep_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 179\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 180\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 181\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvocab_size \u001b[38;5;241m=\u001b[39m vocab_size\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_position_embeddings \u001b[38;5;241m=\u001b[39m max_position_embeddings\n",
|
20 |
+
"File \u001b[0;32m~/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/configuration_utils.py:286\u001b[0m, in \u001b[0;36mPretrainedConfig.__init__\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 284\u001b[0m allowed_problem_types \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mregression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msingle_label_classification\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmulti_label_classification\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproblem_type \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproblem_type \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m allowed_problem_types:\n\u001b[0;32m--> 286\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 287\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe config parameter `problem_type` was not understood: received \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mproblem_type\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 288\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbut only \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mregression\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msingle_label_classification\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmulti_label_classification\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m are valid.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 289\u001b[0m )\n\u001b[1;32m 291\u001b[0m \u001b[38;5;66;03m# TPU arguments\u001b[39;00m\n\u001b[1;32m 292\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mxla_device\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
|
21 |
+
"\u001b[0;31mValueError\u001b[0m: The config parameter `problem_type` was not understood: received single_label_regression but only 'regression', 'single_label_classification' and 'multi_label_classification' are valid."
|
22 |
+
]
|
23 |
+
}
|
24 |
+
],
|
25 |
+
"source": [
|
26 |
+
"import torch\n",
|
27 |
+
"from transformers import AutoTokenizer\n",
|
28 |
+
"\n",
|
29 |
+
"# カスタムクラスが必要な場合はそちらを import\n",
|
30 |
+
"# from your_module import ModernBertForScoring\n",
|
31 |
+
"\n",
|
32 |
+
"MODEL_DIR = \"./modernbert_jamt_finetune_ckpt_49\" # 実際のパスに置き換えてください\n",
|
33 |
+
"\n",
|
34 |
+
"# もし学習時のクラスがカスタムクラス ModernBertForScoring なら\n",
|
35 |
+
"# model = ModernBertForScoring.from_pretrained(MODEL_DIR)\n",
|
36 |
+
"\n",
|
37 |
+
"# もし学習時に ModernBertForSequenceClassification などを使ったなら(config.jsonを修正済み)\n",
|
38 |
+
"# from transformers import AutoModelForSequenceClassification\n",
|
39 |
+
"# model = AutoModelForSequenceClassification.from_pretrained(MODEL_DIR)\n",
|
40 |
+
"\n",
|
41 |
+
"# 例:カスタムクラス ModernBertForScoring の場合\n",
|
42 |
+
"from train_jmtb_v6 import ModernBertForScoring\n",
|
43 |
+
"model = ModernBertForScoring.from_pretrained(MODEL_DIR)\n",
|
44 |
+
"\n",
|
45 |
+
"tokenizer = AutoTokenizer.from_pretrained(MODEL_DIR)\n",
|
46 |
+
"\n",
|
47 |
+
"# GPU利用する場合\n",
|
48 |
+
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
|
49 |
+
"model.to(device)\n",
|
50 |
+
"model.eval()\n"
|
51 |
+
]
|
52 |
+
},
|
53 |
+
{
|
54 |
+
"cell_type": "code",
|
55 |
+
"execution_count": null,
|
56 |
+
"metadata": {},
|
57 |
+
"outputs": [
|
58 |
+
{
|
59 |
+
"name": "stdout",
|
60 |
+
"output_type": "stream",
|
61 |
+
"text": [
|
62 |
+
"Predicted score: 0.3452\n"
|
63 |
+
]
|
64 |
+
}
|
65 |
+
],
|
66 |
+
"source": [
|
67 |
+
"def predict_score(text: str, model, tokenizer, device):\n",
|
68 |
+
" \"\"\"\n",
|
69 |
+
" 1つのテキストに対し、学習済みモデルで 0.0~1.0 の推定スコアを返す\n",
|
70 |
+
" (ModernBertForScoring で Sigmoidがかかっている想定)\n",
|
71 |
+
" \"\"\"\n",
|
72 |
+
" # トークナイズ\n",
|
73 |
+
" inputs = tokenizer(\n",
|
74 |
+
" text,\n",
|
75 |
+
" return_tensors=\"pt\",\n",
|
76 |
+
" truncation=True,\n",
|
77 |
+
" max_length=512\n",
|
78 |
+
" )\n",
|
79 |
+
" # GPUへ移動\n",
|
80 |
+
" inputs = {k: v.to(device) for k, v in inputs.items()}\n",
|
81 |
+
"\n",
|
82 |
+
" # 推論\n",
|
83 |
+
" with torch.no_grad():\n",
|
84 |
+
" outputs = model(**inputs)\n",
|
85 |
+
" # ModernBertForScoring なら outputs.logits が [batch_size,1]\n",
|
86 |
+
" score = outputs.logits.squeeze().item() # floatに変換\n",
|
87 |
+
"\n",
|
88 |
+
" return score\n",
|
89 |
+
"\n",
|
90 |
+
"# ------------------------\n",
|
91 |
+
"# 推論テスト\n",
|
92 |
+
"# ------------------------\n",
|
93 |
+
"example_text = \"これはテスト入力です。BERTに対するテストを行います。\"\n",
|
94 |
+
"pred_score = predict_score(example_text, model, tokenizer, device)\n",
|
95 |
+
"print(f\"Predicted score: {pred_score:.4f}\")\n"
|
96 |
+
]
|
97 |
+
},
|
98 |
+
{
|
99 |
+
"cell_type": "code",
|
100 |
+
"execution_count": null,
|
101 |
+
"metadata": {},
|
102 |
+
"outputs": [],
|
103 |
+
"source": [
|
104 |
+
"import pickle"
|
105 |
+
]
|
106 |
+
},
|
107 |
+
{
|
108 |
+
"cell_type": "code",
|
109 |
+
"execution_count": null,
|
110 |
+
"metadata": {},
|
111 |
+
"outputs": [],
|
112 |
+
"source": [
|
113 |
+
"# 学習時に保存したデータセットpickle (floatラベル)\n",
|
114 |
+
"with open(r\"/media/kurogane/kioxia1/dataset/sss/pixiv/modernbert_jamt_finetune_ckpt_49/dataset_dict_float.pkl\", \"rb\") as file:\n",
|
115 |
+
" dataset_dict = pickle.load(file)\n",
|
116 |
+
"\n",
|
117 |
+
"# テストセットだけ取り出す (train/validation も必要なら適宜呼び出す)\n",
|
118 |
+
"test_dataset = dataset_dict[\"test\"]\n"
|
119 |
+
]
|
120 |
+
},
|
121 |
+
{
|
122 |
+
"cell_type": "code",
|
123 |
+
"execution_count": null,
|
124 |
+
"metadata": {},
|
125 |
+
"outputs": [
|
126 |
+
{
|
127 |
+
"data": {
|
128 |
+
"text/plain": [
|
129 |
+
"Dataset({\n",
|
130 |
+
" features: ['input_text', 'label'],\n",
|
131 |
+
" num_rows: 648\n",
|
132 |
+
"})"
|
133 |
+
]
|
134 |
+
},
|
135 |
+
"execution_count": 12,
|
136 |
+
"metadata": {},
|
137 |
+
"output_type": "execute_result"
|
138 |
+
}
|
139 |
+
],
|
140 |
+
"source": [
|
141 |
+
"test_dataset"
|
142 |
+
]
|
143 |
+
},
|
144 |
+
{
|
145 |
+
"cell_type": "code",
|
146 |
+
"execution_count": null,
|
147 |
+
"metadata": {},
|
148 |
+
"outputs": [],
|
149 |
+
"source": [
|
150 |
+
"from tqdm import tqdm"
|
151 |
+
]
|
152 |
+
},
|
153 |
+
{
|
154 |
+
"cell_type": "code",
|
155 |
+
"execution_count": null,
|
156 |
+
"metadata": {},
|
157 |
+
"outputs": [
|
158 |
+
{
|
159 |
+
"name": "stderr",
|
160 |
+
"output_type": "stream",
|
161 |
+
"text": [
|
162 |
+
"100%|██████████| 648/648 [00:04<00:00, 133.80it/s]\n"
|
163 |
+
]
|
164 |
+
}
|
165 |
+
],
|
166 |
+
"source": [
|
167 |
+
"l_estimate_scores = []\n",
|
168 |
+
"for i_dataset in tqdm(test_dataset):\n",
|
169 |
+
" # print(i_dataset)\n",
|
170 |
+
" f_estimate_score = predict_score(i_dataset['input_text'], model, tokenizer, device)\n",
|
171 |
+
" l_estimate_scores.append([f_estimate_score, i_dataset[\"label\"]])"
|
172 |
+
]
|
173 |
+
},
|
174 |
+
{
|
175 |
+
"cell_type": "code",
|
176 |
+
"execution_count": null,
|
177 |
+
"metadata": {},
|
178 |
+
"outputs": [
|
179 |
+
{
|
180 |
+
"data": {
|
181 |
+
"text/plain": [
|
182 |
+
"[[0.9064586758613586, 0.9],\n",
|
183 |
+
" [0.8449122309684753, 0.9],\n",
|
184 |
+
" [0.929304838180542, 0.8],\n",
|
185 |
+
" [0.806448757648468, 0.9],\n",
|
186 |
+
" [0.6466315984725952, 0.6],\n",
|
187 |
+
" [0.9507829546928406, 1.0],\n",
|
188 |
+
" [0.8817955851554871, 1.0],\n",
|
189 |
+
" [0.9700656533241272, 0.9],\n",
|
190 |
+
" [0.8967279195785522, 1.0],\n",
|
191 |
+
" [0.6367055177688599, 0.6],\n",
|
192 |
+
" [0.7786707282066345, 0.9],\n",
|
193 |
+
" [0.8398993611335754, 0.9],\n",
|
194 |
+
" [0.8425216674804688, 0.9],\n",
|
195 |
+
" [0.8936999440193176, 1.0],\n",
|
196 |
+
" [0.8087979555130005, 0.9],\n",
|
197 |
+
" [0.8145586848258972, 0.8],\n",
|
198 |
+
" [0.6279298663139343, 0.4],\n",
|
199 |
+
" [0.4987145960330963, 0.8],\n",
|
200 |
+
" [0.696692705154419, 0.7],\n",
|
201 |
+
" [0.7956013083457947, 0.9],\n",
|
202 |
+
" [0.8720244765281677, 0.9],\n",
|
203 |
+
" [0.8167892694473267, 0.9],\n",
|
204 |
+
" [0.8600430488586426, 0.9],\n",
|
205 |
+
" [0.8366582989692688, 0.7],\n",
|
206 |
+
" [0.8482577800750732, 0.7],\n",
|
207 |
+
" [0.10592726618051529, 0.2],\n",
|
208 |
+
" [0.3639181852340698, 0.2],\n",
|
209 |
+
" [0.45103591680526733, 0.7],\n",
|
210 |
+
" [0.8230735659599304, 0.7],\n",
|
211 |
+
" [0.7876871824264526, 0.8],\n",
|
212 |
+
" [0.8766051530838013, 0.9],\n",
|
213 |
+
" [0.8099154233932495, 0.7],\n",
|
214 |
+
" [0.6839173436164856, 0.8],\n",
|
215 |
+
" [0.8837357759475708, 0.9],\n",
|
216 |
+
" [0.5957882404327393, 0.6],\n",
|
217 |
+
" [0.405498206615448, 0.6],\n",
|
218 |
+
" [0.8267595767974854, 0.9],\n",
|
219 |
+
" [0.9590301513671875, 1.0],\n",
|
220 |
+
" [0.7926787734031677, 0.7],\n",
|
221 |
+
" [0.5048006176948547, 0.2],\n",
|
222 |
+
" [0.872920036315918, 0.9],\n",
|
223 |
+
" [0.4801338016986847, 0.4],\n",
|
224 |
+
" [0.9707834720611572, 1.0],\n",
|
225 |
+
" [0.954249918460846, 0.9],\n",
|
226 |
+
" [0.6119499206542969, 0.8],\n",
|
227 |
+
" [0.804256796836853, 0.3],\n",
|
228 |
+
" [0.9629430174827576, 1.0],\n",
|
229 |
+
" [0.8675076365470886, 0.9],\n",
|
230 |
+
" [0.4841710329055786, 0.2],\n",
|
231 |
+
" [0.7352050542831421, 0.9],\n",
|
232 |
+
" [0.7698368430137634, 0.9],\n",
|
233 |
+
" [0.42692598700523376, 0.2],\n",
|
234 |
+
" [0.7776671051979065, 0.6],\n",
|
235 |
+
" [0.9430829882621765, 1.0],\n",
|
236 |
+
" [0.780847430229187, 0.9],\n",
|
237 |
+
" [0.9405631422996521, 1.0],\n",
|
238 |
+
" [0.254617303609848, 0.4],\n",
|
239 |
+
" [0.8624202013015747, 0.9],\n",
|
240 |
+
" [0.9356356263160706, 1.0],\n",
|
241 |
+
" [0.7910308241844177, 0.9],\n",
|
242 |
+
" [0.2423963099718094, 0.2],\n",
|
243 |
+
" [0.9045445919036865, 0.9],\n",
|
244 |
+
" [0.3448959290981293, 0.4],\n",
|
245 |
+
" [0.8975270390510559, 0.9],\n",
|
246 |
+
" [0.7061187028884888, 0.9],\n",
|
247 |
+
" [0.8589214086532593, 0.9],\n",
|
248 |
+
" [0.7566481232643127, 0.9],\n",
|
249 |
+
" [0.9401050209999084, 1.0],\n",
|
250 |
+
" [0.887227475643158, 0.9],\n",
|
251 |
+
" [0.7086873650550842, 0.9],\n",
|
252 |
+
" [0.9077960252761841, 0.9],\n",
|
253 |
+
" [0.9026407599449158, 1.0],\n",
|
254 |
+
" [0.935111939907074, 0.9],\n",
|
255 |
+
" [0.5277835130691528, 0.4],\n",
|
256 |
+
" [0.7517065405845642, 0.7],\n",
|
257 |
+
" [0.6940519213676453, 0.5],\n",
|
258 |
+
" [0.9113664031028748, 1.0],\n",
|
259 |
+
" [0.4126318097114563, 0.3],\n",
|
260 |
+
" [0.5240322947502136, 0.6],\n",
|
261 |
+
" [0.8750995397567749, 0.9],\n",
|
262 |
+
" [0.9469568729400635, 0.8],\n",
|
263 |
+
" [0.7899268269538879, 0.9],\n",
|
264 |
+
" [0.857871413230896, 0.2],\n",
|
265 |
+
" [0.7683762907981873, 0.7],\n",
|
266 |
+
" [0.8666701912879944, 0.9],\n",
|
267 |
+
" [0.902720034122467, 0.9],\n",
|
268 |
+
" [0.9435014128684998, 1.0],\n",
|
269 |
+
" [0.6808632612228394, 0.8],\n",
|
270 |
+
" [0.9126145839691162, 0.9],\n",
|
271 |
+
" [0.8799282908439636, 0.9],\n",
|
272 |
+
" [0.6882354021072388, 0.7],\n",
|
273 |
+
" [0.8309448957443237, 0.9],\n",
|
274 |
+
" [0.8704410195350647, 0.9],\n",
|
275 |
+
" [0.8138535022735596, 0.9],\n",
|
276 |
+
" [0.6686734557151794, 0.3],\n",
|
277 |
+
" [0.8925440907478333, 1.0],\n",
|
278 |
+
" [0.7934283018112183, 1.0],\n",
|
279 |
+
" [0.9107365012168884, 0.9],\n",
|
280 |
+
" [0.9745094180107117, 1.0],\n",
|
281 |
+
" [0.8090866804122925, 0.9],\n",
|
282 |
+
" [0.9362606406211853, 0.9],\n",
|
283 |
+
" [0.6617568135261536, 0.3],\n",
|
284 |
+
" [0.6281882524490356, 0.9],\n",
|
285 |
+
" [0.6575912833213806, 0.6],\n",
|
286 |
+
" [0.7039993405342102, 0.6],\n",
|
287 |
+
" [0.8477407097816467, 0.9],\n",
|
288 |
+
" [0.8910886645317078, 0.9],\n",
|
289 |
+
" [0.7563804388046265, 0.9],\n",
|
290 |
+
" [0.8112492561340332, 0.9],\n",
|
291 |
+
" [0.7291156053543091, 0.9],\n",
|
292 |
+
" [0.5929954051971436, 0.5],\n",
|
293 |
+
" [0.5142516493797302, 0.5],\n",
|
294 |
+
" [0.6867972016334534, 0.6],\n",
|
295 |
+
" [0.8761500120162964, 0.9],\n",
|
296 |
+
" [0.8619706034660339, 0.9],\n",
|
297 |
+
" [0.897497832775116, 0.9],\n",
|
298 |
+
" [0.8493452668190002, 0.8],\n",
|
299 |
+
" [0.8616324663162231, 0.9],\n",
|
300 |
+
" [0.6340180039405823, 0.4],\n",
|
301 |
+
" [0.7829850912094116, 0.9],\n",
|
302 |
+
" [0.6297580599784851, 0.4],\n",
|
303 |
+
" [0.8162065744400024, 0.9],\n",
|
304 |
+
" [0.7388235330581665, 0.4],\n",
|
305 |
+
" [0.7455839514732361, 0.9],\n",
|
306 |
+
" [0.8802245855331421, 0.6],\n",
|
307 |
+
" [0.7003363966941833, 0.9],\n",
|
308 |
+
" [0.5237756371498108, 0.2],\n",
|
309 |
+
" [0.8556636571884155, 0.6],\n",
|
310 |
+
" [0.851711094379425, 0.8],\n",
|
311 |
+
" [0.8817101716995239, 0.9],\n",
|
312 |
+
" [0.8661450743675232, 0.9],\n",
|
313 |
+
" [0.8317744135856628, 0.8],\n",
|
314 |
+
" [0.3223874866962433, 0.3],\n",
|
315 |
+
" [0.916279137134552, 0.9],\n",
|
316 |
+
" [0.8346007466316223, 0.5],\n",
|
317 |
+
" [0.8453168272972107, 0.9],\n",
|
318 |
+
" [0.37649181485176086, 0.3],\n",
|
319 |
+
" [0.6854564547538757, 0.8],\n",
|
320 |
+
" [0.7912370562553406, 0.9],\n",
|
321 |
+
" [0.38355275988578796, 0.9],\n",
|
322 |
+
" [0.7108463048934937, 0.7],\n",
|
323 |
+
" [0.8513278365135193, 0.9],\n",
|
324 |
+
" [0.9008965492248535, 0.9],\n",
|
325 |
+
" [0.1853475570678711, 0.2],\n",
|
326 |
+
" [0.5783144235610962, 0.5],\n",
|
327 |
+
" [0.7818315029144287, 0.9],\n",
|
328 |
+
" [0.7993879914283752, 0.7],\n",
|
329 |
+
" [0.7314165830612183, 0.8],\n",
|
330 |
+
" [0.9500613808631897, 1.0],\n",
|
331 |
+
" [0.8998763561248779, 1.0],\n",
|
332 |
+
" [0.38737180829048157, 0.4],\n",
|
333 |
+
" [0.8452264666557312, 0.9],\n",
|
334 |
+
" [0.25194141268730164, 0.3],\n",
|
335 |
+
" [0.9476278424263, 0.9],\n",
|
336 |
+
" [0.4460093379020691, 0.3],\n",
|
337 |
+
" [0.8978778719902039, 0.9],\n",
|
338 |
+
" [0.8573941588401794, 0.9],\n",
|
339 |
+
" [0.3037511706352234, 0.3],\n",
|
340 |
+
" [0.7195190787315369, 0.9],\n",
|
341 |
+
" [0.6808164119720459, 0.8],\n",
|
342 |
+
" [0.7646284103393555, 0.9],\n",
|
343 |
+
" [0.9012228846549988, 0.9],\n",
|
344 |
+
" [0.5082786083221436, 0.8],\n",
|
345 |
+
" [0.9199990034103394, 0.9],\n",
|
346 |
+
" [0.7429797053337097, 0.6],\n",
|
347 |
+
" [0.7855229377746582, 0.9],\n",
|
348 |
+
" [0.7403103709220886, 0.9],\n",
|
349 |
+
" [0.856158971786499, 0.9],\n",
|
350 |
+
" [0.7221283316612244, 0.9],\n",
|
351 |
+
" [0.8180127739906311, 0.9],\n",
|
352 |
+
" [0.8110374212265015, 0.6],\n",
|
353 |
+
" [0.8805463314056396, 0.9],\n",
|
354 |
+
" [0.8187531232833862, 0.8],\n",
|
355 |
+
" [0.6386672258377075, 0.6],\n",
|
356 |
+
" [0.9463333487510681, 1.0],\n",
|
357 |
+
" [0.8654801845550537, 0.9],\n",
|
358 |
+
" [0.9553059935569763, 0.9],\n",
|
359 |
+
" [0.7202808260917664, 0.4],\n",
|
360 |
+
" [0.596796452999115, 0.6],\n",
|
361 |
+
" [0.599234938621521, 0.2],\n",
|
362 |
+
" [0.8640603423118591, 0.9],\n",
|
363 |
+
" [0.8499320149421692, 0.7],\n",
|
364 |
+
" [0.8750359416007996, 0.9],\n",
|
365 |
+
" [0.922467827796936, 1.0],\n",
|
366 |
+
" [0.8759791851043701, 1.0],\n",
|
367 |
+
" [0.43951845169067383, 0.3],\n",
|
368 |
+
" [0.9501491189002991, 0.9],\n",
|
369 |
+
" [0.7858310341835022, 0.9],\n",
|
370 |
+
" [0.9279288053512573, 1.0],\n",
|
371 |
+
" [0.8105558753013611, 0.9],\n",
|
372 |
+
" [0.7309414148330688, 0.7],\n",
|
373 |
+
" [0.4521546959877014, 0.3],\n",
|
374 |
+
" [0.8569731116294861, 0.9],\n",
|
375 |
+
" [0.7542720437049866, 0.9],\n",
|
376 |
+
" [0.9578987956047058, 0.9],\n",
|
377 |
+
" [0.9457001090049744, 0.9],\n",
|
378 |
+
" [0.8531457781791687, 0.9],\n",
|
379 |
+
" [0.8666984438896179, 0.9],\n",
|
380 |
+
" [0.48565420508384705, 0.4],\n",
|
381 |
+
" [0.8775691390037537, 0.9],\n",
|
382 |
+
" [0.6819878220558167, 0.4],\n",
|
383 |
+
" [0.9245203137397766, 1.0],\n",
|
384 |
+
" [0.8452584147453308, 1.0],\n",
|
385 |
+
" [0.8809332251548767, 0.9],\n",
|
386 |
+
" [0.7760116457939148, 0.7],\n",
|
387 |
+
" [0.8173214197158813, 0.9],\n",
|
388 |
+
" [0.7378541827201843, 0.9],\n",
|
389 |
+
" [0.5877021551132202, 0.4],\n",
|
390 |
+
" [0.5508979558944702, 0.8],\n",
|
391 |
+
" [0.3678698241710663, 0.5],\n",
|
392 |
+
" [0.30494531989097595, 0.3],\n",
|
393 |
+
" [0.6908549070358276, 0.6],\n",
|
394 |
+
" [0.5437881946563721, 0.6],\n",
|
395 |
+
" [0.8356095552444458, 0.9],\n",
|
396 |
+
" [0.31034883856773376, 0.2],\n",
|
397 |
+
" [0.8924189805984497, 0.8],\n",
|
398 |
+
" [0.6236647963523865, 0.3],\n",
|
399 |
+
" [0.6277945637702942, 0.4],\n",
|
400 |
+
" [0.6978229880332947, 0.1],\n",
|
401 |
+
" [0.8123990893363953, 0.9],\n",
|
402 |
+
" [0.4208259880542755, 0.7],\n",
|
403 |
+
" [0.8291409611701965, 0.9],\n",
|
404 |
+
" [0.8832250237464905, 0.9],\n",
|
405 |
+
" [0.6538210511207581, 0.8],\n",
|
406 |
+
" [0.896472692489624, 0.9],\n",
|
407 |
+
" [0.6764245629310608, 0.4],\n",
|
408 |
+
" [0.8327236175537109, 0.9],\n",
|
409 |
+
" [0.8454877138137817, 0.9],\n",
|
410 |
+
" [0.8654239773750305, 0.8],\n",
|
411 |
+
" [0.6745596528053284, 0.6],\n",
|
412 |
+
" [0.7898547649383545, 0.8],\n",
|
413 |
+
" [0.6550565361976624, 0.4],\n",
|
414 |
+
" [0.6239812970161438, 0.8],\n",
|
415 |
+
" [0.9469243884086609, 0.9],\n",
|
416 |
+
" [0.9485745429992676, 0.9],\n",
|
417 |
+
" [0.6684531569480896, 0.6],\n",
|
418 |
+
" [0.9079251289367676, 0.9],\n",
|
419 |
+
" [0.7882359027862549, 0.6],\n",
|
420 |
+
" [0.7799747586250305, 0.9],\n",
|
421 |
+
" [0.7874063849449158, 0.9],\n",
|
422 |
+
" [0.8244850039482117, 0.9],\n",
|
423 |
+
" [0.6317123174667358, 0.6],\n",
|
424 |
+
" [0.8460860252380371, 0.9],\n",
|
425 |
+
" [0.8276510834693909, 0.9],\n",
|
426 |
+
" [0.38163939118385315, 0.9],\n",
|
427 |
+
" [0.9736513495445251, 1.0],\n",
|
428 |
+
" [0.8883947730064392, 0.9],\n",
|
429 |
+
" [0.7605443596839905, 0.8],\n",
|
430 |
+
" [0.19729329645633698, 0.2],\n",
|
431 |
+
" [0.88736891746521, 1.0],\n",
|
432 |
+
" [0.862339198589325, 0.9],\n",
|
433 |
+
" [0.7687414884567261, 0.9],\n",
|
434 |
+
" [0.7632433176040649, 0.6],\n",
|
435 |
+
" [0.20476382970809937, 0.2],\n",
|
436 |
+
" [0.31666404008865356, 0.9],\n",
|
437 |
+
" [0.8854409456253052, 0.9],\n",
|
438 |
+
" [0.28262194991111755, 0.4],\n",
|
439 |
+
" [0.8240434527397156, 0.1],\n",
|
440 |
+
" [0.8445137143135071, 0.9],\n",
|
441 |
+
" [0.5455150604248047, 0.3],\n",
|
442 |
+
" [0.9618996977806091, 1.0],\n",
|
443 |
+
" [0.8494833111763, 0.8],\n",
|
444 |
+
" [0.4823213815689087, 0.4],\n",
|
445 |
+
" [0.7849555611610413, 0.6],\n",
|
446 |
+
" [0.6141435503959656, 0.7],\n",
|
447 |
+
" [0.7253923416137695, 0.9],\n",
|
448 |
+
" [0.7148001790046692, 0.9],\n",
|
449 |
+
" [0.929366946220398, 0.9],\n",
|
450 |
+
" [0.3592156171798706, 0.7],\n",
|
451 |
+
" [0.3085547983646393, 0.2],\n",
|
452 |
+
" [0.770656943321228, 0.9],\n",
|
453 |
+
" [0.8839257955551147, 0.9],\n",
|
454 |
+
" [0.8835964202880859, 0.9],\n",
|
455 |
+
" [0.3086932301521301, 0.3],\n",
|
456 |
+
" [0.644216775894165, 0.4],\n",
|
457 |
+
" [0.7603057622909546, 0.8],\n",
|
458 |
+
" [0.47372305393218994, 0.3],\n",
|
459 |
+
" [0.8266362547874451, 0.9],\n",
|
460 |
+
" [0.8671748638153076, 0.9],\n",
|
461 |
+
" [0.7935934662818909, 0.9],\n",
|
462 |
+
" [0.338331937789917, 0.4],\n",
|
463 |
+
" [0.5553470253944397, 0.4],\n",
|
464 |
+
" [0.7325969934463501, 0.8],\n",
|
465 |
+
" [0.9176349639892578, 0.9],\n",
|
466 |
+
" [0.5863208770751953, 0.5],\n",
|
467 |
+
" [0.8673837780952454, 0.9],\n",
|
468 |
+
" [0.8770381808280945, 0.9],\n",
|
469 |
+
" [0.6373818516731262, 0.8],\n",
|
470 |
+
" [0.6105970144271851, 0.6],\n",
|
471 |
+
" [0.9128532409667969, 0.9],\n",
|
472 |
+
" [0.6021369099617004, 0.5],\n",
|
473 |
+
" [0.6904911994934082, 0.8],\n",
|
474 |
+
" [0.8588377833366394, 0.9],\n",
|
475 |
+
" [0.4375683069229126, 0.6],\n",
|
476 |
+
" [0.8753483891487122, 0.9],\n",
|
477 |
+
" [0.8913830518722534, 1.0],\n",
|
478 |
+
" [0.7222169637680054, 0.7],\n",
|
479 |
+
" [0.7359307408332825, 0.6],\n",
|
480 |
+
" [0.8244432806968689, 0.9],\n",
|
481 |
+
" [0.6900085210800171, 0.8],\n",
|
482 |
+
" [0.2715027630329132, 0.1],\n",
|
483 |
+
" [0.6896530389785767, 0.6],\n",
|
484 |
+
" [0.6765221953392029, 0.6],\n",
|
485 |
+
" [0.3277732729911804, 0.4],\n",
|
486 |
+
" [0.4515093266963959, 0.4],\n",
|
487 |
+
" [0.8928239941596985, 0.9],\n",
|
488 |
+
" [0.5652311444282532, 0.7],\n",
|
489 |
+
" [0.4977130591869354, 0.2],\n",
|
490 |
+
" [0.74165278673172, 0.9],\n",
|
491 |
+
" [0.48645636439323425, 0.7],\n",
|
492 |
+
" [0.8301733732223511, 0.9],\n",
|
493 |
+
" [0.46485790610313416, 0.6],\n",
|
494 |
+
" [0.9069660902023315, 1.0],\n",
|
495 |
+
" [0.6526173949241638, 0.5],\n",
|
496 |
+
" [0.22337760031223297, 0.1],\n",
|
497 |
+
" [0.8109521865844727, 0.9],\n",
|
498 |
+
" [0.2853657305240631, 0.2],\n",
|
499 |
+
" [0.8568928241729736, 0.9],\n",
|
500 |
+
" [0.5527607202529907, 0.6],\n",
|
501 |
+
" [0.8812926411628723, 0.9],\n",
|
502 |
+
" [0.7154238224029541, 0.6],\n",
|
503 |
+
" [0.9051880836486816, 0.9],\n",
|
504 |
+
" [0.5803526043891907, 0.8],\n",
|
505 |
+
" [0.7091109156608582, 0.8],\n",
|
506 |
+
" [0.5601979494094849, 0.7],\n",
|
507 |
+
" [0.787548840045929, 0.7],\n",
|
508 |
+
" [0.7948053479194641, 0.8],\n",
|
509 |
+
" [0.9312030076980591, 0.9],\n",
|
510 |
+
" [0.8789415955543518, 1.0],\n",
|
511 |
+
" [0.9068158864974976, 1.0],\n",
|
512 |
+
" [0.8658299446105957, 0.9],\n",
|
513 |
+
" [0.9198936820030212, 1.0],\n",
|
514 |
+
" [0.6551686525344849, 0.9],\n",
|
515 |
+
" [0.6174558401107788, 0.3],\n",
|
516 |
+
" [0.8762447237968445, 0.8],\n",
|
517 |
+
" [0.8365645408630371, 0.9],\n",
|
518 |
+
" [0.1843896359205246, 0.1],\n",
|
519 |
+
" [0.583404541015625, 0.9],\n",
|
520 |
+
" [0.8519049882888794, 0.8],\n",
|
521 |
+
" [0.6710367798805237, 0.8],\n",
|
522 |
+
" [0.4004596769809723, 0.3],\n",
|
523 |
+
" [0.9558364748954773, 0.9],\n",
|
524 |
+
" [0.8146979212760925, 0.8],\n",
|
525 |
+
" [0.9368678331375122, 0.9],\n",
|
526 |
+
" [0.9128404259681702, 0.9],\n",
|
527 |
+
" [0.8924294114112854, 0.9],\n",
|
528 |
+
" [0.8706570863723755, 0.9],\n",
|
529 |
+
" [0.36182519793510437, 0.2],\n",
|
530 |
+
" [0.8756670951843262, 0.9],\n",
|
531 |
+
" [0.5055785179138184, 0.3],\n",
|
532 |
+
" [0.7487927079200745, 0.9],\n",
|
533 |
+
" [0.9558643102645874, 1.0],\n",
|
534 |
+
" [0.5944591760635376, 0.6],\n",
|
535 |
+
" [0.6496614813804626, 0.6],\n",
|
536 |
+
" [0.891505241394043, 0.9],\n",
|
537 |
+
" [0.6592487096786499, 0.6],\n",
|
538 |
+
" [0.7970435619354248, 1.0],\n",
|
539 |
+
" [0.7491934299468994, 0.4],\n",
|
540 |
+
" [0.5845210552215576, 0.9],\n",
|
541 |
+
" [0.7628567814826965, 0.9],\n",
|
542 |
+
" [0.40675088763237, 0.5],\n",
|
543 |
+
" [0.627162754535675, 0.9],\n",
|
544 |
+
" [0.5906123518943787, 0.8],\n",
|
545 |
+
" [0.6509009003639221, 0.6],\n",
|
546 |
+
" [0.9104874134063721, 1.0],\n",
|
547 |
+
" [0.8778848648071289, 0.8],\n",
|
548 |
+
" [0.7858289480209351, 0.7],\n",
|
549 |
+
" [0.9646210670471191, 1.0],\n",
|
550 |
+
" [0.49148932099342346, 0.5],\n",
|
551 |
+
" [0.5657476186752319, 0.5],\n",
|
552 |
+
" [0.7989112138748169, 0.5],\n",
|
553 |
+
" [0.896877646446228, 0.9],\n",
|
554 |
+
" [0.8994553089141846, 0.9],\n",
|
555 |
+
" [0.8644108176231384, 0.9],\n",
|
556 |
+
" [0.5436504483222961, 0.3],\n",
|
557 |
+
" [0.38367825746536255, 0.2],\n",
|
558 |
+
" [0.35513395071029663, 0.3],\n",
|
559 |
+
" [0.9275620579719543, 0.9],\n",
|
560 |
+
" [0.854905903339386, 0.8],\n",
|
561 |
+
" [0.5229591727256775, 0.8],\n",
|
562 |
+
" [0.8073667287826538, 0.9],\n",
|
563 |
+
" [0.7266579866409302, 0.6],\n",
|
564 |
+
" [0.23632675409317017, 0.1],\n",
|
565 |
+
" [0.552478551864624, 0.9],\n",
|
566 |
+
" [0.8053351640701294, 0.9],\n",
|
567 |
+
" [0.850672721862793, 0.9],\n",
|
568 |
+
" [0.9100931286811829, 0.9],\n",
|
569 |
+
" [0.8568122982978821, 0.9],\n",
|
570 |
+
" [0.6421248912811279, 0.9],\n",
|
571 |
+
" [0.5956704020500183, 0.3],\n",
|
572 |
+
" [0.3317554295063019, 0.3],\n",
|
573 |
+
" [0.927498996257782, 0.9],\n",
|
574 |
+
" [0.8942874073982239, 1.0],\n",
|
575 |
+
" [0.9104828238487244, 1.0],\n",
|
576 |
+
" [0.37761199474334717, 0.2],\n",
|
577 |
+
" [0.7857874631881714, 0.7],\n",
|
578 |
+
" [0.8570524454116821, 0.3],\n",
|
579 |
+
" [0.8882994651794434, 0.9],\n",
|
580 |
+
" [0.9283419251441956, 0.9],\n",
|
581 |
+
" [0.8294586539268494, 0.9],\n",
|
582 |
+
" [0.3736439049243927, 0.5],\n",
|
583 |
+
" [0.6581687331199646, 0.7],\n",
|
584 |
+
" [0.8052690029144287, 0.9],\n",
|
585 |
+
" [0.8928396701812744, 0.9],\n",
|
586 |
+
" [0.6559609174728394, 0.8],\n",
|
587 |
+
" [0.870569109916687, 0.8],\n",
|
588 |
+
" [0.3797019422054291, 0.4],\n",
|
589 |
+
" [0.8790174126625061, 0.6],\n",
|
590 |
+
" [0.573027491569519, 0.3],\n",
|
591 |
+
" [0.8363456726074219, 0.9],\n",
|
592 |
+
" [0.6144676804542542, 0.7],\n",
|
593 |
+
" [0.8835358023643494, 0.9],\n",
|
594 |
+
" [0.7157717943191528, 0.9],\n",
|
595 |
+
" [0.7214363217353821, 0.1],\n",
|
596 |
+
" [0.7688565850257874, 0.8],\n",
|
597 |
+
" [0.6583333015441895, 0.5],\n",
|
598 |
+
" [0.7756986021995544, 1.0],\n",
|
599 |
+
" [0.18134945631027222, 0.1],\n",
|
600 |
+
" [0.3336744010448456, 0.3],\n",
|
601 |
+
" [0.7706341743469238, 0.9],\n",
|
602 |
+
" [0.734782874584198, 0.9],\n",
|
603 |
+
" [0.9471049308776855, 0.9],\n",
|
604 |
+
" [0.6686676144599915, 0.9],\n",
|
605 |
+
" [0.872651994228363, 0.9],\n",
|
606 |
+
" [0.6990708708763123, 0.6],\n",
|
607 |
+
" [0.4532737135887146, 0.4],\n",
|
608 |
+
" [0.5959187150001526, 0.4],\n",
|
609 |
+
" [0.9041457176208496, 0.9],\n",
|
610 |
+
" [0.9407055377960205, 0.9],\n",
|
611 |
+
" [0.9118932485580444, 0.9],\n",
|
612 |
+
" [0.5548721551895142, 0.2],\n",
|
613 |
+
" [0.9288930892944336, 0.9],\n",
|
614 |
+
" [0.48166006803512573, 0.3],\n",
|
615 |
+
" [0.8659979701042175, 0.9],\n",
|
616 |
+
" [0.7878676652908325, 0.8],\n",
|
617 |
+
" [0.9107018709182739, 1.0],\n",
|
618 |
+
" [0.8593129515647888, 0.8],\n",
|
619 |
+
" [0.6023291945457458, 0.4],\n",
|
620 |
+
" [0.8151740431785583, 0.6],\n",
|
621 |
+
" [0.9689931869506836, 1.0],\n",
|
622 |
+
" [0.32890671491622925, 0.4],\n",
|
623 |
+
" [0.25132861733436584, 0.2],\n",
|
624 |
+
" [0.8355442881584167, 0.9],\n",
|
625 |
+
" [0.5196486711502075, 0.3],\n",
|
626 |
+
" [0.5570502877235413, 0.9],\n",
|
627 |
+
" [0.1721695214509964, 0.2],\n",
|
628 |
+
" [0.9613489508628845, 0.9],\n",
|
629 |
+
" [0.8573195934295654, 0.9],\n",
|
630 |
+
" [0.7359338402748108, 0.9],\n",
|
631 |
+
" [0.6692647933959961, 0.2],\n",
|
632 |
+
" [0.7032365798950195, 0.5],\n",
|
633 |
+
" [0.7604613304138184, 0.8],\n",
|
634 |
+
" [0.3672597110271454, 0.6],\n",
|
635 |
+
" [0.8801596760749817, 1.0],\n",
|
636 |
+
" [0.8825082182884216, 0.9],\n",
|
637 |
+
" [0.9223929643630981, 0.9],\n",
|
638 |
+
" [0.2902374267578125, 0.2],\n",
|
639 |
+
" [0.6596561074256897, 0.9],\n",
|
640 |
+
" [0.5656098127365112, 0.6],\n",
|
641 |
+
" [0.5993040800094604, 0.3],\n",
|
642 |
+
" [0.326254278421402, 0.4],\n",
|
643 |
+
" [0.7709024548530579, 0.9],\n",
|
644 |
+
" [0.56084805727005, 0.8],\n",
|
645 |
+
" [0.8905344009399414, 0.9],\n",
|
646 |
+
" [0.6955621838569641, 0.7],\n",
|
647 |
+
" [0.6527406573295593, 0.6],\n",
|
648 |
+
" [0.8516212105751038, 0.9],\n",
|
649 |
+
" [0.6509021520614624, 0.4],\n",
|
650 |
+
" [0.849424421787262, 0.6],\n",
|
651 |
+
" [0.7331821322441101, 0.9],\n",
|
652 |
+
" [0.3355243504047394, 0.3],\n",
|
653 |
+
" [0.9231580495834351, 1.0],\n",
|
654 |
+
" [0.6610034108161926, 0.7],\n",
|
655 |
+
" [0.18266692757606506, 0.3],\n",
|
656 |
+
" [0.7420765161514282, 0.9],\n",
|
657 |
+
" [0.8482139110565186, 0.7],\n",
|
658 |
+
" [0.7824781537055969, 0.7],\n",
|
659 |
+
" [0.7808020710945129, 0.9],\n",
|
660 |
+
" [0.5461168885231018, 0.3],\n",
|
661 |
+
" [0.7221590280532837, 0.9],\n",
|
662 |
+
" [0.6944252848625183, 0.8],\n",
|
663 |
+
" [0.7390590310096741, 0.9],\n",
|
664 |
+
" [0.42653611302375793, 0.4],\n",
|
665 |
+
" [0.8902081847190857, 1.0],\n",
|
666 |
+
" [0.9005285501480103, 0.9],\n",
|
667 |
+
" [0.9097873568534851, 0.9],\n",
|
668 |
+
" [0.21993842720985413, 0.2],\n",
|
669 |
+
" [0.421650767326355, 0.6],\n",
|
670 |
+
" [0.8794265389442444, 0.9],\n",
|
671 |
+
" [0.9476831555366516, 0.9],\n",
|
672 |
+
" [0.7081140875816345, 0.7],\n",
|
673 |
+
" [0.8922443985939026, 0.9],\n",
|
674 |
+
" [0.3995065987110138, 0.9],\n",
|
675 |
+
" [0.8627650737762451, 0.9],\n",
|
676 |
+
" [0.9611384868621826, 0.9],\n",
|
677 |
+
" [0.8823320865631104, 1.0],\n",
|
678 |
+
" [0.7572306990623474, 0.9],\n",
|
679 |
+
" [0.8725445866584778, 0.9],\n",
|
680 |
+
" [0.9449562430381775, 0.9],\n",
|
681 |
+
" [0.7717506885528564, 0.9],\n",
|
682 |
+
" [0.15474310517311096, 0.1],\n",
|
683 |
+
" [0.9121803045272827, 0.9],\n",
|
684 |
+
" [0.8079653382301331, 0.9],\n",
|
685 |
+
" [0.835227370262146, 0.9],\n",
|
686 |
+
" [0.8131006956100464, 0.9],\n",
|
687 |
+
" [0.8179431557655334, 0.7],\n",
|
688 |
+
" [0.9555372595787048, 0.9],\n",
|
689 |
+
" [0.8693034648895264, 0.9],\n",
|
690 |
+
" [0.8599344491958618, 0.9],\n",
|
691 |
+
" [0.7984340190887451, 1.0],\n",
|
692 |
+
" [0.7487307190895081, 0.8],\n",
|
693 |
+
" [0.9249837398529053, 0.9],\n",
|
694 |
+
" [0.7589347958564758, 0.9],\n",
|
695 |
+
" [0.3615719974040985, 0.2],\n",
|
696 |
+
" [0.3107086420059204, 0.4],\n",
|
697 |
+
" [0.7213683128356934, 0.7],\n",
|
698 |
+
" [0.8425479531288147, 0.9],\n",
|
699 |
+
" [0.7714840769767761, 0.4],\n",
|
700 |
+
" [0.8188011646270752, 0.8],\n",
|
701 |
+
" [0.7286155819892883, 0.6],\n",
|
702 |
+
" [0.4045146107673645, 0.2],\n",
|
703 |
+
" [0.6047667264938354, 0.4],\n",
|
704 |
+
" [0.6913502812385559, 0.4],\n",
|
705 |
+
" [0.6467778086662292, 0.5],\n",
|
706 |
+
" [0.3444978594779968, 0.2],\n",
|
707 |
+
" [0.8719446659088135, 0.9],\n",
|
708 |
+
" [0.7965179085731506, 0.9],\n",
|
709 |
+
" [0.7913227081298828, 0.9],\n",
|
710 |
+
" [0.9410687685012817, 1.0],\n",
|
711 |
+
" [0.44169095158576965, 0.3],\n",
|
712 |
+
" [0.8851080536842346, 0.9],\n",
|
713 |
+
" [0.8913792371749878, 0.9],\n",
|
714 |
+
" [0.8524451851844788, 0.9],\n",
|
715 |
+
" [0.8013086915016174, 0.9],\n",
|
716 |
+
" [0.8113997578620911, 0.8],\n",
|
717 |
+
" [0.8060635328292847, 0.8],\n",
|
718 |
+
" [0.32350343465805054, 0.3],\n",
|
719 |
+
" [0.8984023332595825, 0.9],\n",
|
720 |
+
" [0.587394654750824, 0.6],\n",
|
721 |
+
" [0.5370021462440491, 0.4],\n",
|
722 |
+
" [0.942569375038147, 0.9],\n",
|
723 |
+
" [0.8009219169616699, 0.7],\n",
|
724 |
+
" [0.896619975566864, 0.9],\n",
|
725 |
+
" [0.8658144474029541, 0.9],\n",
|
726 |
+
" [0.7016218900680542, 0.4],\n",
|
727 |
+
" [0.8604831099510193, 0.8],\n",
|
728 |
+
" [0.8699275851249695, 0.9],\n",
|
729 |
+
" [0.45879390835762024, 0.4],\n",
|
730 |
+
" [0.5645806193351746, 0.4],\n",
|
731 |
+
" [0.9470452666282654, 0.9],\n",
|
732 |
+
" [0.870012640953064, 0.9],\n",
|
733 |
+
" [0.8051838278770447, 0.9],\n",
|
734 |
+
" [0.8563840389251709, 0.9],\n",
|
735 |
+
" [0.9484373927116394, 1.0],\n",
|
736 |
+
" [0.9129024147987366, 0.9],\n",
|
737 |
+
" [0.9109873175621033, 0.9],\n",
|
738 |
+
" [0.7702903747558594, 0.9],\n",
|
739 |
+
" [0.23435641825199127, 0.3],\n",
|
740 |
+
" [0.773851215839386, 0.9],\n",
|
741 |
+
" [0.8853207230567932, 0.9],\n",
|
742 |
+
" [0.19917032122612, 0.2],\n",
|
743 |
+
" [0.9677890539169312, 0.9],\n",
|
744 |
+
" [0.636743426322937, 0.4],\n",
|
745 |
+
" [0.6735020875930786, 0.9],\n",
|
746 |
+
" [0.16387033462524414, 0.2],\n",
|
747 |
+
" [0.8149173855781555, 0.8],\n",
|
748 |
+
" [0.7951643466949463, 0.9],\n",
|
749 |
+
" [0.8490980267524719, 0.9],\n",
|
750 |
+
" [0.8448660373687744, 0.9],\n",
|
751 |
+
" [0.7506303787231445, 0.3],\n",
|
752 |
+
" [0.8545787930488586, 0.8],\n",
|
753 |
+
" [0.532014012336731, 0.9],\n",
|
754 |
+
" [0.9296807646751404, 0.1],\n",
|
755 |
+
" [0.8303433656692505, 0.9],\n",
|
756 |
+
" [0.9027467370033264, 0.8],\n",
|
757 |
+
" [0.7876701354980469, 0.9],\n",
|
758 |
+
" [0.4417012333869934, 0.5],\n",
|
759 |
+
" [0.6421471238136292, 0.4],\n",
|
760 |
+
" [0.8930367827415466, 0.9],\n",
|
761 |
+
" [0.7860907912254333, 0.4],\n",
|
762 |
+
" [0.6721752285957336, 0.6],\n",
|
763 |
+
" [0.8049106597900391, 0.9],\n",
|
764 |
+
" [0.8319634199142456, 0.9],\n",
|
765 |
+
" [0.9733098149299622, 0.9],\n",
|
766 |
+
" [0.7663295269012451, 0.9],\n",
|
767 |
+
" [0.9548745155334473, 1.0],\n",
|
768 |
+
" [0.28572025895118713, 0.2],\n",
|
769 |
+
" [0.29264578223228455, 0.2],\n",
|
770 |
+
" [0.08858926594257355, 0.1],\n",
|
771 |
+
" [0.9195079207420349, 0.9],\n",
|
772 |
+
" [0.9017946124076843, 0.9],\n",
|
773 |
+
" [0.8725588321685791, 1.0],\n",
|
774 |
+
" [0.5177860856056213, 0.6],\n",
|
775 |
+
" [0.6396905183792114, 0.8],\n",
|
776 |
+
" [0.8232091069221497, 0.6],\n",
|
777 |
+
" [0.4722677171230316, 0.3],\n",
|
778 |
+
" [0.3547070622444153, 0.6],\n",
|
779 |
+
" [0.5229023098945618, 0.6],\n",
|
780 |
+
" [0.980872392654419, 1.0],\n",
|
781 |
+
" [0.9095045924186707, 1.0],\n",
|
782 |
+
" [0.8521897196769714, 0.9],\n",
|
783 |
+
" [0.9635071158409119, 1.0],\n",
|
784 |
+
" [0.892997145652771, 0.9],\n",
|
785 |
+
" [0.4399847388267517, 0.4],\n",
|
786 |
+
" [0.840275764465332, 0.9],\n",
|
787 |
+
" [0.28466078639030457, 0.8],\n",
|
788 |
+
" [0.9222121834754944, 1.0],\n",
|
789 |
+
" [0.8009138107299805, 0.9],\n",
|
790 |
+
" [0.4688073396682739, 0.3],\n",
|
791 |
+
" [0.788908839225769, 0.5],\n",
|
792 |
+
" [0.4609881043434143, 0.3],\n",
|
793 |
+
" [0.2563250660896301, 0.2],\n",
|
794 |
+
" [0.863552451133728, 0.9],\n",
|
795 |
+
" [0.9009376764297485, 1.0],\n",
|
796 |
+
" [0.8950297236442566, 0.9],\n",
|
797 |
+
" [0.7619693279266357, 0.8],\n",
|
798 |
+
" [0.9539045691490173, 0.9],\n",
|
799 |
+
" [0.857700526714325, 0.9],\n",
|
800 |
+
" [0.917656660079956, 0.9],\n",
|
801 |
+
" [0.4197356402873993, 0.1],\n",
|
802 |
+
" [0.8468145728111267, 0.9],\n",
|
803 |
+
" [0.8413441777229309, 0.6],\n",
|
804 |
+
" [0.8770924806594849, 0.9],\n",
|
805 |
+
" [0.7613767385482788, 0.7],\n",
|
806 |
+
" [0.5931036472320557, 0.7],\n",
|
807 |
+
" [0.7604084014892578, 0.7],\n",
|
808 |
+
" [0.9281649589538574, 1.0],\n",
|
809 |
+
" [0.38664042949676514, 0.3],\n",
|
810 |
+
" [0.9006865620613098, 1.0],\n",
|
811 |
+
" [0.8754125833511353, 0.9],\n",
|
812 |
+
" [0.8797391057014465, 0.9],\n",
|
813 |
+
" [0.7036916613578796, 0.8],\n",
|
814 |
+
" [0.9311502575874329, 0.9],\n",
|
815 |
+
" [0.6805518269538879, 0.8],\n",
|
816 |
+
" [0.7984088063240051, 0.9],\n",
|
817 |
+
" [0.8592762351036072, 0.9],\n",
|
818 |
+
" [0.7293879389762878, 0.8],\n",
|
819 |
+
" [0.7824617624282837, 0.9],\n",
|
820 |
+
" [0.866423487663269, 0.9],\n",
|
821 |
+
" [0.6669572591781616, 0.7],\n",
|
822 |
+
" [0.8584144711494446, 0.9],\n",
|
823 |
+
" [0.1908380538225174, 0.2],\n",
|
824 |
+
" [0.7461979389190674, 0.6],\n",
|
825 |
+
" [0.8193972706794739, 0.9],\n",
|
826 |
+
" [0.7538160085678101, 0.9],\n",
|
827 |
+
" [0.45426538586616516, 0.2],\n",
|
828 |
+
" [0.4462665617465973, 0.4],\n",
|
829 |
+
" [0.8647792935371399, 1.0]]"
|
830 |
+
]
|
831 |
+
},
|
832 |
+
"execution_count": 15,
|
833 |
+
"metadata": {},
|
834 |
+
"output_type": "execute_result"
|
835 |
+
}
|
836 |
+
],
|
837 |
+
"source": [
|
838 |
+
"l_estimate_scores"
|
839 |
+
]
|
840 |
+
},
|
841 |
+
{
|
842 |
+
"cell_type": "code",
|
843 |
+
"execution_count": 2,
|
844 |
+
"metadata": {},
|
845 |
+
"outputs": [
|
846 |
+
{
|
847 |
+
"ename": "NameError",
|
848 |
+
"evalue": "name 'l_estimate_scores' is not defined",
|
849 |
+
"output_type": "error",
|
850 |
+
"traceback": [
|
851 |
+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
852 |
+
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
853 |
+
"Cell \u001b[0;32mIn[2], line 7\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msklearn\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmetrics\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m mean_squared_error, mean_absolute_error, r2_score\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# 予測値(predicted)、実際値(actual)に分割\u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m predicted \u001b[38;5;241m=\u001b[39m [x[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m \u001b[43ml_estimate_scores\u001b[49m]\n\u001b[1;32m 8\u001b[0m actual \u001b[38;5;241m=\u001b[39m [x[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m l_estimate_scores]\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# --- 評価指標の計算 ---\u001b[39;00m\n",
|
854 |
+
"\u001b[0;31mNameError\u001b[0m: name 'l_estimate_scores' is not defined"
|
855 |
+
]
|
856 |
+
}
|
857 |
+
],
|
858 |
+
"source": [
|
859 |
+
"import numpy as np\n",
|
860 |
+
"import matplotlib.pyplot as plt\n",
|
861 |
+
"from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n",
|
862 |
+
"\n",
|
863 |
+
"\n",
|
864 |
+
"# 予測値(predicted)、実際値(actual)に分割\n",
|
865 |
+
"predicted = [x[0] for x in l_estimate_scores]\n",
|
866 |
+
"actual = [x[1] for x in l_estimate_scores]\n",
|
867 |
+
"\n",
|
868 |
+
"# --- 評価指標の計算 ---\n",
|
869 |
+
"mse = mean_squared_error(actual, predicted)\n",
|
870 |
+
"rmse = np.sqrt(mse)\n",
|
871 |
+
"mae = mean_absolute_error(actual, predicted)\n",
|
872 |
+
"r2 = r2_score(actual, predicted)\n",
|
873 |
+
"\n",
|
874 |
+
"print(\"MSE :\", mse)\n",
|
875 |
+
"print(\"RMSE:\", rmse)\n",
|
876 |
+
"print(\"MAE :\", mae)\n",
|
877 |
+
"print(\"R^2 :\", r2)\n",
|
878 |
+
"\n",
|
879 |
+
"# --- 散布図 (Predicted vs Actual) ---\n",
|
880 |
+
"plt.figure(figsize=(5, 5))\n",
|
881 |
+
"plt.scatter(actual, predicted, color='blue', label='Data Points')\n",
|
882 |
+
"# y = x の目安線\n",
|
883 |
+
"plt.plot([0, 1], [0, 1], 'r--', label='Ideal line (y=x)')\n",
|
884 |
+
"plt.xlabel('Actual')\n",
|
885 |
+
"plt.ylabel('Predicted')\n",
|
886 |
+
"plt.title('Predicted vs Actual')\n",
|
887 |
+
"plt.legend()\n",
|
888 |
+
"plt.show()\n",
|
889 |
+
"\n",
|
890 |
+
"# --- 残差プロット (Residual plot) ---\n",
|
891 |
+
"residuals = [p - a for p, a in zip(predicted, actual)]\n",
|
892 |
+
"\n",
|
893 |
+
"plt.figure(figsize=(5, 5))\n",
|
894 |
+
"plt.scatter(actual, residuals, color='green')\n",
|
895 |
+
"plt.axhline(0, color='red', linestyle='--') # 残差が0となるライン\n",
|
896 |
+
"plt.xlabel('Actual')\n",
|
897 |
+
"plt.ylabel('Residual (Predicted - Actual)')\n",
|
898 |
+
"plt.title('Residual Plot')\n",
|
899 |
+
"plt.show()\n",
|
900 |
+
"\n",
|
901 |
+
"# --- サンプルごとのバー比較 ---\n",
|
902 |
+
"indices = range(len(actual))\n",
|
903 |
+
"bar_width = 0.4\n",
|
904 |
+
"\n",
|
905 |
+
"plt.figure(figsize=(8, 5))\n",
|
906 |
+
"plt.bar(indices, actual, width=bar_width, label='Actual', alpha=0.7)\n",
|
907 |
+
"plt.bar([i + bar_width for i in indices], predicted, width=bar_width, label='Predicted', alpha=0.7)\n",
|
908 |
+
"\n",
|
909 |
+
"plt.xlabel('Sample Index')\n",
|
910 |
+
"plt.ylabel('Score')\n",
|
911 |
+
"plt.title('Actual vs Predicted')\n",
|
912 |
+
"plt.xticks([i + bar_width/2 for i in indices], indices) # 棒の中央にインデックスを合わせる\n",
|
913 |
+
"plt.legend()\n",
|
914 |
+
"plt.tight_layout()\n",
|
915 |
+
"plt.show()\n"
|
916 |
+
]
|
917 |
+
},
|
918 |
+
{
|
919 |
+
"cell_type": "code",
|
920 |
+
"execution_count": null,
|
921 |
+
"metadata": {},
|
922 |
+
"outputs": [],
|
923 |
+
"source": []
|
924 |
+
}
|
925 |
+
],
|
926 |
+
"metadata": {
|
927 |
+
"kernelspec": {
|
928 |
+
"display_name": "vllmtest",
|
929 |
+
"language": "python",
|
930 |
+
"name": "python3"
|
931 |
+
},
|
932 |
+
"language_info": {
|
933 |
+
"codemirror_mode": {
|
934 |
+
"name": "ipython",
|
935 |
+
"version": 3
|
936 |
+
},
|
937 |
+
"file_extension": ".py",
|
938 |
+
"mimetype": "text/x-python",
|
939 |
+
"name": "python",
|
940 |
+
"nbconvert_exporter": "python",
|
941 |
+
"pygments_lexer": "ipython3",
|
942 |
+
"version": "3.12.4"
|
943 |
+
}
|
944 |
+
},
|
945 |
+
"nbformat": 4,
|
946 |
+
"nbformat_minor": 2
|
947 |
+
}
|
test_check.png
ADDED
![]() |
train_jmtb_test_v6 (コピー).ipynb
ADDED
@@ -0,0 +1,853 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"#!/usr/bin/env python\n",
|
10 |
+
"# -*- coding: utf-8 -*-\n",
|
11 |
+
"\n",
|
12 |
+
"\"\"\"\n",
|
13 |
+
"Sample script to finetune ModernBERT-Ja-130M on Japanese MT-bench (0~10 discrete scores).\n",
|
14 |
+
"\"\"\"\n",
|
15 |
+
"\n",
|
16 |
+
"import os\n",
|
17 |
+
"import gc\n",
|
18 |
+
"import re\n",
|
19 |
+
"import glob\n",
|
20 |
+
"import json\n",
|
21 |
+
"import random\n",
|
22 |
+
"import pickle\n",
|
23 |
+
"import numpy as np\n",
|
24 |
+
"import pandas as pd\n",
|
25 |
+
"from typing import Dict, Any\n",
|
26 |
+
"\n",
|
27 |
+
"from matplotlib import pyplot as plt\n",
|
28 |
+
"\n",
|
29 |
+
"import torch\n",
|
30 |
+
"from torch import nn\n",
|
31 |
+
"from datasets import Dataset, DatasetDict\n",
|
32 |
+
"\n",
|
33 |
+
"\n",
|
34 |
+
"\n",
|
35 |
+
"from transformers import (\n",
|
36 |
+
" AutoTokenizer,\n",
|
37 |
+
" AutoConfig,\n",
|
38 |
+
" ModernBertForSequenceClassification,\n",
|
39 |
+
" DataCollatorWithPadding,\n",
|
40 |
+
" Trainer,\n",
|
41 |
+
" TrainingArguments,\n",
|
42 |
+
")\n",
|
43 |
+
"\n",
|
44 |
+
"from transformers.modeling_outputs import SequenceClassifierOutput\n",
|
45 |
+
"\n",
|
46 |
+
"\n",
|
47 |
+
"\n",
|
48 |
+
"\n",
|
49 |
+
"os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n",
|
50 |
+
"\n",
|
51 |
+
"# -------------------------------------------------------\n",
|
52 |
+
"# 1. パラメータ設定(適宜変更)\n",
|
53 |
+
"# -------------------------------------------------------\n",
|
54 |
+
"CSV_FILE_PATH = r\"/media/kurogane/kioxia1/dataset/sss/pixiv/JMTB_1_rescore_float.csv\" # Japanese MT benchのCSVファイルパスを指定\n",
|
55 |
+
"MODEL_NAME = \"sbintuitions/modernbert-ja-130m\" # ModernBERT-Ja-130M\n",
|
56 |
+
"NUM_LABELS = 1 # 0~10の11クラス分類とする\n",
|
57 |
+
"SEED = 42\n",
|
58 |
+
"\n",
|
59 |
+
"\n",
|
60 |
+
"BASE_PROMPT = \"AIアシスタントがユーザーの質問に対して提供した回答の質を、公平な立場で評価してください。評価の際は、回答の有用性、関連性、正確性、深さ、創造性、詳細さを考慮してください。評価の前に短い説明を提供し、できるだけ客観的に評価してください。期待される言語は日本語です。日本語以外の言語での回答は、特に要求されない限り減点対象となります。全く日本語を使用しない場合、最低評価となります。ただし、Pythonのスクリプトや計算結果のみを提供する場合、日本語は必須ではありません。評価を0から1.0の範囲で小数点第一位までの数値で示し、floatで記載してください。例:\\\"0.5\\\"。\"\n",
|
61 |
+
"\n",
|
62 |
+
"# -------------------------------------------------------\n",
|
63 |
+
"# 2. CSV読み込み & データ前処理\n",
|
64 |
+
"# -------------------------------------------------------\n",
|
65 |
+
"def load_jmtb_data(csv_path: str) -> pd.DataFrame:\n",
|
66 |
+
" \"\"\"\n",
|
67 |
+
" CSVを読み込んでDataFrameを返す。\n",
|
68 |
+
" CSVの列名例:\n",
|
69 |
+
" ['model_name', 'question_id', 'category', 'question', 'answer', 'judge', 'user_prompt',\n",
|
70 |
+
" 'judgment', 'score', 'turn', 'tstamp', 'sub_category']\n",
|
71 |
+
" \"\"\"\n",
|
72 |
+
" df = pd.read_csv(csv_path)\n",
|
73 |
+
" return df\n",
|
74 |
+
"\n",
|
75 |
+
"\n",
|
76 |
+
"def build_input_text(row: pd.Series, df: pd.DataFrame) -> str:\n",
|
77 |
+
" \"\"\"\n",
|
78 |
+
" turn=1 の場合は「ターン1のみ」のテキストを構築。\n",
|
79 |
+
" turn=2 の場合は「ターン1のQ&A + ターン2のQ&A」を一つに連結したテキストを構築。\n",
|
80 |
+
" \"\"\"\n",
|
81 |
+
" turn = row[\"turn\"]\n",
|
82 |
+
" if turn == 1:\n",
|
83 |
+
" # シングルターン\n",
|
84 |
+
" # text = (\n",
|
85 |
+
" # f\"{BASE_PROMPT}\\n\\n\",\n",
|
86 |
+
" # f\"{row['question']}\",\n",
|
87 |
+
" # f\"{row['answer']}\",\n",
|
88 |
+
" # )\n",
|
89 |
+
" text = f\"<cls>{BASE_PROMPT}<sep>{row['question']}<sep>{row['answer']}<sep>\"\n",
|
90 |
+
" else:\n",
|
91 |
+
" # 2ターン目のscore行なので、同じquestion_idのturn=1を探す\n",
|
92 |
+
" qid = row[\"question_id\"]\n",
|
93 |
+
" # 同じquestion_id & turn=1の行を検索\n",
|
94 |
+
" df_turn1 = df[(df[\"question_id\"] == qid) & (df[\"turn\"] == 1)]\n",
|
95 |
+
" if len(df_turn1) > 0:\n",
|
96 |
+
" # 1行だけのはずだが、複数ある場合はiloc[0]\n",
|
97 |
+
" r1 = df_turn1.iloc[0]\n",
|
98 |
+
" # text = (\n",
|
99 |
+
" # f\"{BASE_PROMPT}\\n\\n\",\n",
|
100 |
+
" # f\"{r1['question']}\\n\\n{row['question']}\",\n",
|
101 |
+
" # f\"{row['answer']}\",\n",
|
102 |
+
" # )\n",
|
103 |
+
" text = f\"<cls>{BASE_PROMPT}<sep>{r1['question']}\\n\\n{row['question']}<sep>{row['answer']}<sep>\"\n",
|
104 |
+
" else:\n",
|
105 |
+
" # turn=1が見当たらない不備データの場合 -> 仕方ないのでターン2だけ\n",
|
106 |
+
" # text = (\n",
|
107 |
+
" # f\"{BASE_PROMPT}\\n\\n\",\n",
|
108 |
+
" # f\"{row['question']}\",\n",
|
109 |
+
" # f\"{row['answer']}\",\n",
|
110 |
+
" # )\n",
|
111 |
+
" text = f\"<cls>{BASE_PROMPT}<sep>{row['question']}<sep>{row['answer']}<sep>\"\n",
|
112 |
+
" return text\n",
|
113 |
+
"\n",
|
114 |
+
"\n",
|
115 |
+
"def create_dataset_from_df(df: pd.DataFrame) -> Dataset:\n",
|
116 |
+
" \"\"\"\n",
|
117 |
+
" pandas DataFrame から [input_text, label] を作り、Hugging Face Datasets の Dataset を返す。\n",
|
118 |
+
" - label は score (0~10) をそのまま格納。\n",
|
119 |
+
" \"\"\"\n",
|
120 |
+
" # 新しい列 input_text と label を作成\n",
|
121 |
+
" # 参照しやすいようにデータフレームをコピー\n",
|
122 |
+
" df2 = df.copy()\n",
|
123 |
+
"\n",
|
124 |
+
" # テキスト列を作成\n",
|
125 |
+
" df2[\"input_text\"] = df2.apply(lambda row: build_input_text(row, df2), axis=1)\n",
|
126 |
+
" # スコアを整数化(既にintなら不要)\n",
|
127 |
+
" df2[\"label\"] = df2[\"score\"].astype(float)\n",
|
128 |
+
"\n",
|
129 |
+
" # 必要な列のみ残す\n",
|
130 |
+
" used_cols = [\"input_text\", \"label\"]\n",
|
131 |
+
" df2 = df2[used_cols]\n",
|
132 |
+
"\n",
|
133 |
+
" # Pandas -> Huggingface Dataset\n",
|
134 |
+
" dataset = Dataset.from_pandas(df2, preserve_index=False)\n",
|
135 |
+
" return dataset\n",
|
136 |
+
"\n",
|
137 |
+
"\n",
|
138 |
+
"# -------------------------------------------------------\n",
|
139 |
+
"# 3. データセットの分割: train/valid/test\n",
|
140 |
+
"# -------------------------------------------------------\n",
|
141 |
+
"def split_dataset(\n",
|
142 |
+
" dataset: Dataset,\n",
|
143 |
+
" split_ratio=(0.8, 0.1, 0.1),\n",
|
144 |
+
" seed=SEED\n",
|
145 |
+
") -> DatasetDict:\n",
|
146 |
+
" \"\"\"\n",
|
147 |
+
" Dataset を train/dev/test に分割 (ランダム).\n",
|
148 |
+
" デフォルトは 8:1:1\n",
|
149 |
+
" \"\"\"\n",
|
150 |
+
" train_ratio, valid_ratio, test_ratio = split_ratio\n",
|
151 |
+
" # assert sum(split_ratio) == 1.0\n",
|
152 |
+
" n_samples = len(dataset)\n",
|
153 |
+
"\n",
|
154 |
+
" # まず shuffle\n",
|
155 |
+
" dataset = dataset.shuffle(seed=seed)\n",
|
156 |
+
"\n",
|
157 |
+
" train_end = int(n_samples * train_ratio)\n",
|
158 |
+
" valid_end = int(n_samples * (train_ratio + valid_ratio))\n",
|
159 |
+
"\n",
|
160 |
+
" train_dataset = dataset.select(range(0, train_end))\n",
|
161 |
+
" valid_dataset = dataset.select(range(train_end, valid_end))\n",
|
162 |
+
" test_dataset = dataset.select(range(valid_end, n_samples))\n",
|
163 |
+
"\n",
|
164 |
+
" return DatasetDict({\n",
|
165 |
+
" \"train\": train_dataset,\n",
|
166 |
+
" \"validation\": valid_dataset,\n",
|
167 |
+
" \"test\": test_dataset\n",
|
168 |
+
" })\n",
|
169 |
+
"\n",
|
170 |
+
"\n",
|
171 |
+
"# -------------------------------------------------------\n",
|
172 |
+
"# 4. トークナイズ関数\n",
|
173 |
+
"# -------------------------------------------------------\n",
|
174 |
+
"def tokenize_function(examples, tokenizer, max_length=None):\n",
|
175 |
+
" \"\"\"\n",
|
176 |
+
" 文章をトークナイズ。max_lengthは適宜設定(Noneの場合は基本無制限、FlashAttention2でpadding無視)\n",
|
177 |
+
" \"\"\"\n",
|
178 |
+
" return tokenizer(\n",
|
179 |
+
" examples[\"input_text\"],\n",
|
180 |
+
" truncation=(max_length is not None),\n",
|
181 |
+
" max_length=max_length,\n",
|
182 |
+
" )\n",
|
183 |
+
"\n",
|
184 |
+
"\n",
|
185 |
+
"# -------------------------------------------------------\n",
|
186 |
+
"# 5. 評価指標: 分類タスク (単純にAccuracyを例示)\n",
|
187 |
+
"# 必要に応じて MAE, F1, MSE などを追加実装してください。\n",
|
188 |
+
"# -------------------------------------------------------\n",
|
189 |
+
"def compute_metrics_regression(eval_pred):\n",
|
190 |
+
" logits, labels = eval_pred\n",
|
191 |
+
" # logits: shape (batch_size, 1)\n",
|
192 |
+
" predictions = logits.reshape(-1)\n",
|
193 |
+
" mae = mean_absolute_error(labels, predictions)\n",
|
194 |
+
" mse = mean_squared_error(labels, predictions)\n",
|
195 |
+
" return {\n",
|
196 |
+
" \"mae\": mae,\n",
|
197 |
+
" \"mse\": mse\n",
|
198 |
+
" }\n",
|
199 |
+
"\n",
|
200 |
+
"class ModernBertForScoring(ModernBertForSequenceClassification):\n",
|
201 |
+
" \"\"\"\n",
|
202 |
+
" ModernBertForSequenceClassificationを継承し、\n",
|
203 |
+
" 出力層にシグモイドをかけて 0~1 の範囲にマッピングするカスタムクラス。\n",
|
204 |
+
" \"\"\"\n",
|
205 |
+
"\n",
|
206 |
+
" def __init__(self, config):\n",
|
207 |
+
" super().__init__(config)\n",
|
208 |
+
" # num_labels=1 + 回帰タスク想定なので、classification_head は linear + activation とする\n",
|
209 |
+
" # 既存の self.classifier を再利用しつつ、最後にシグモイドを追加するイメージ\n",
|
210 |
+
" self.sigmoid = nn.Sigmoid()\n",
|
211 |
+
" # もし self.classifier が 1 出力以外になっている場合は要調整\n",
|
212 |
+
" # (ModernBertForSequenceClassification の場合は config.num_labels に応じた Linear が作られる想定)\n",
|
213 |
+
"\n",
|
214 |
+
" def forward(\n",
|
215 |
+
" self,\n",
|
216 |
+
" input_ids=None,\n",
|
217 |
+
" attention_mask=None,\n",
|
218 |
+
" token_type_ids=None,\n",
|
219 |
+
" labels=None,\n",
|
220 |
+
" **kwargs,\n",
|
221 |
+
" ):\n",
|
222 |
+
" # 親クラス(ModernBertForSequenceClassification)の forward を実行\n",
|
223 |
+
" # ただし 親クラスは [loss, logits] を返す実装なので、それを受け取り再加工する\n",
|
224 |
+
" outputs = super().forward(\n",
|
225 |
+
" input_ids=input_ids,\n",
|
226 |
+
" attention_mask=attention_mask,\n",
|
227 |
+
" token_type_ids=token_type_ids,\n",
|
228 |
+
" labels=None, # ここでは一旦親の loss 計算を無効化し、自前でやる\n",
|
229 |
+
" **kwargs,\n",
|
230 |
+
" )\n",
|
231 |
+
"\n",
|
232 |
+
" # 親から返される logits は shape = (batch_size, num_labels=1) のはず\n",
|
233 |
+
" logits = outputs.logits # => [B,1]\n",
|
234 |
+
"\n",
|
235 |
+
" # ここでシグモイドをかけて 0~1 に収まるようにする\n",
|
236 |
+
" preds = self.sigmoid(logits) # => [B,1], range(0,1)\n",
|
237 |
+
"\n",
|
238 |
+
" loss = None\n",
|
239 |
+
" if labels is not None:\n",
|
240 |
+
" labels = labels.view(-1, 1).float()\n",
|
241 |
+
" loss_fct = nn.MSELoss()\n",
|
242 |
+
" loss = loss_fct(preds, labels)\n",
|
243 |
+
" \n",
|
244 |
+
" # hidden_states / attentions が None の場合も型的に問題なく格納できる\n",
|
245 |
+
" return SequenceClassifierOutput(\n",
|
246 |
+
" loss=loss,\n",
|
247 |
+
" logits=preds, # シグモイド後の出力 (shape=[B,1])\n",
|
248 |
+
" hidden_states=outputs.hidden_states,\n",
|
249 |
+
" attentions=outputs.attentions,\n",
|
250 |
+
" )\n",
|
251 |
+
"\n",
|
252 |
+
"\n",
|
253 |
+
"from sklearn.metrics import mean_absolute_error, mean_squared_error\n",
|
254 |
+
"\n",
|
255 |
+
"def compute_metrics_regression(eval_pred):\n",
|
256 |
+
" logits, labels = eval_pred\n",
|
257 |
+
" # logits: [batch_size, 1], labels: [batch_size]\n",
|
258 |
+
" preds = logits.reshape(-1)\n",
|
259 |
+
" mse = mean_squared_error(labels, preds)\n",
|
260 |
+
" mae = mean_absolute_error(labels, preds)\n",
|
261 |
+
" return {\n",
|
262 |
+
" \"mse\": mse,\n",
|
263 |
+
" \"mae\": mae\n",
|
264 |
+
" }\n",
|
265 |
+
"\n",
|
266 |
+
"\n"
|
267 |
+
]
|
268 |
+
},
|
269 |
+
{
|
270 |
+
"cell_type": "code",
|
271 |
+
"execution_count": 3,
|
272 |
+
"metadata": {},
|
273 |
+
"outputs": [
|
274 |
+
{
|
275 |
+
"name": "stdout",
|
276 |
+
"output_type": "stream",
|
277 |
+
"text": [
|
278 |
+
"[Info] Loading CSV from: /media/kurogane/kioxia1/dataset/sss/pixiv/JMTB_1_rescore_float.csv\n",
|
279 |
+
"[Info] CSV loaded: 6480 rows.\n",
|
280 |
+
"[Info] Built dataset with columns: ['input_text', 'label']\n",
|
281 |
+
"DatasetDict({\n",
|
282 |
+
" train: Dataset({\n",
|
283 |
+
" features: ['input_text', 'label'],\n",
|
284 |
+
" num_rows: 5184\n",
|
285 |
+
" })\n",
|
286 |
+
" validation: Dataset({\n",
|
287 |
+
" features: ['input_text', 'label'],\n",
|
288 |
+
" num_rows: 648\n",
|
289 |
+
" })\n",
|
290 |
+
" test: Dataset({\n",
|
291 |
+
" features: ['input_text', 'label'],\n",
|
292 |
+
" num_rows: 648\n",
|
293 |
+
" })\n",
|
294 |
+
"})\n",
|
295 |
+
"[Info] Loading tokenizer for sbintuitions/modernbert-ja-130m\n"
|
296 |
+
]
|
297 |
+
},
|
298 |
+
{
|
299 |
+
"data": {
|
300 |
+
"application/vnd.jupyter.widget-view+json": {
|
301 |
+
"model_id": "851e20ba48b845b995288997e95a58c5",
|
302 |
+
"version_major": 2,
|
303 |
+
"version_minor": 0
|
304 |
+
},
|
305 |
+
"text/plain": [
|
306 |
+
"Map: 0%| | 0/5184 [00:00<?, ? examples/s]"
|
307 |
+
]
|
308 |
+
},
|
309 |
+
"metadata": {},
|
310 |
+
"output_type": "display_data"
|
311 |
+
},
|
312 |
+
{
|
313 |
+
"data": {
|
314 |
+
"application/vnd.jupyter.widget-view+json": {
|
315 |
+
"model_id": "8cbfe3c0e65744e182794a40f80ca1bf",
|
316 |
+
"version_major": 2,
|
317 |
+
"version_minor": 0
|
318 |
+
},
|
319 |
+
"text/plain": [
|
320 |
+
"Map: 0%| | 0/648 [00:00<?, ? examples/s]"
|
321 |
+
]
|
322 |
+
},
|
323 |
+
"metadata": {},
|
324 |
+
"output_type": "display_data"
|
325 |
+
},
|
326 |
+
{
|
327 |
+
"data": {
|
328 |
+
"application/vnd.jupyter.widget-view+json": {
|
329 |
+
"model_id": "13f95d5559f64425aa8e1ffdecc72ac0",
|
330 |
+
"version_major": 2,
|
331 |
+
"version_minor": 0
|
332 |
+
},
|
333 |
+
"text/plain": [
|
334 |
+
"Map: 0%| | 0/648 [00:00<?, ? examples/s]"
|
335 |
+
]
|
336 |
+
},
|
337 |
+
"metadata": {},
|
338 |
+
"output_type": "display_data"
|
339 |
+
},
|
340 |
+
{
|
341 |
+
"name": "stderr",
|
342 |
+
"output_type": "stream",
|
343 |
+
"text": [
|
344 |
+
"Some weights of ModernBertForScoring were not initialized from the model checkpoint at sbintuitions/modernbert-ja-130m and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
|
345 |
+
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n",
|
346 |
+
"/home/kurogane/anaconda3/envs/vllmtest/lib/python3.12/site-packages/transformers/training_args.py:1575: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
|
347 |
+
" warnings.warn(\n",
|
348 |
+
"/tmp/ipykernel_122664/3661479277.py:98: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `Trainer.__init__`. Use `processing_class` instead.\n",
|
349 |
+
" trainer = Trainer(\n"
|
350 |
+
]
|
351 |
+
},
|
352 |
+
{
|
353 |
+
"name": "stdout",
|
354 |
+
"output_type": "stream",
|
355 |
+
"text": [
|
356 |
+
"[Info] Starting training ...\n"
|
357 |
+
]
|
358 |
+
},
|
359 |
+
{
|
360 |
+
"data": {
|
361 |
+
"text/html": [
|
362 |
+
"\n",
|
363 |
+
" <div>\n",
|
364 |
+
" \n",
|
365 |
+
" <progress value='2592' max='2592' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
366 |
+
" [2592/2592 18:44, Epoch 32/32]\n",
|
367 |
+
" </div>\n",
|
368 |
+
" <table border=\"1\" class=\"dataframe\">\n",
|
369 |
+
" <thead>\n",
|
370 |
+
" <tr style=\"text-align: left;\">\n",
|
371 |
+
" <th>Epoch</th>\n",
|
372 |
+
" <th>Training Loss</th>\n",
|
373 |
+
" <th>Validation Loss</th>\n",
|
374 |
+
" <th>Mse</th>\n",
|
375 |
+
" <th>Mae</th>\n",
|
376 |
+
" </tr>\n",
|
377 |
+
" </thead>\n",
|
378 |
+
" <tbody>\n",
|
379 |
+
" <tr>\n",
|
380 |
+
" <td>1</td>\n",
|
381 |
+
" <td>0.121000</td>\n",
|
382 |
+
" <td>0.050717</td>\n",
|
383 |
+
" <td>0.050717</td>\n",
|
384 |
+
" <td>0.172666</td>\n",
|
385 |
+
" </tr>\n",
|
386 |
+
" <tr>\n",
|
387 |
+
" <td>2</td>\n",
|
388 |
+
" <td>0.089100</td>\n",
|
389 |
+
" <td>0.041392</td>\n",
|
390 |
+
" <td>0.041392</td>\n",
|
391 |
+
" <td>0.158076</td>\n",
|
392 |
+
" </tr>\n",
|
393 |
+
" <tr>\n",
|
394 |
+
" <td>3</td>\n",
|
395 |
+
" <td>0.078900</td>\n",
|
396 |
+
" <td>0.029573</td>\n",
|
397 |
+
" <td>0.029573</td>\n",
|
398 |
+
" <td>0.121381</td>\n",
|
399 |
+
" </tr>\n",
|
400 |
+
" <tr>\n",
|
401 |
+
" <td>4</td>\n",
|
402 |
+
" <td>0.104900</td>\n",
|
403 |
+
" <td>0.064899</td>\n",
|
404 |
+
" <td>0.064899</td>\n",
|
405 |
+
" <td>0.209115</td>\n",
|
406 |
+
" </tr>\n",
|
407 |
+
" <tr>\n",
|
408 |
+
" <td>5</td>\n",
|
409 |
+
" <td>0.050500</td>\n",
|
410 |
+
" <td>0.029966</td>\n",
|
411 |
+
" <td>0.029966</td>\n",
|
412 |
+
" <td>0.131566</td>\n",
|
413 |
+
" </tr>\n",
|
414 |
+
" <tr>\n",
|
415 |
+
" <td>6</td>\n",
|
416 |
+
" <td>0.024500</td>\n",
|
417 |
+
" <td>0.068739</td>\n",
|
418 |
+
" <td>0.068739</td>\n",
|
419 |
+
" <td>0.215073</td>\n",
|
420 |
+
" </tr>\n",
|
421 |
+
" <tr>\n",
|
422 |
+
" <td>7</td>\n",
|
423 |
+
" <td>0.017600</td>\n",
|
424 |
+
" <td>0.032628</td>\n",
|
425 |
+
" <td>0.032628</td>\n",
|
426 |
+
" <td>0.140590</td>\n",
|
427 |
+
" </tr>\n",
|
428 |
+
" <tr>\n",
|
429 |
+
" <td>8</td>\n",
|
430 |
+
" <td>0.011500</td>\n",
|
431 |
+
" <td>0.024080</td>\n",
|
432 |
+
" <td>0.024080</td>\n",
|
433 |
+
" <td>0.107284</td>\n",
|
434 |
+
" </tr>\n",
|
435 |
+
" <tr>\n",
|
436 |
+
" <td>9</td>\n",
|
437 |
+
" <td>0.009600</td>\n",
|
438 |
+
" <td>0.023550</td>\n",
|
439 |
+
" <td>0.023550</td>\n",
|
440 |
+
" <td>0.106661</td>\n",
|
441 |
+
" </tr>\n",
|
442 |
+
" <tr>\n",
|
443 |
+
" <td>10</td>\n",
|
444 |
+
" <td>0.008900</td>\n",
|
445 |
+
" <td>0.019672</td>\n",
|
446 |
+
" <td>0.019672</td>\n",
|
447 |
+
" <td>0.098421</td>\n",
|
448 |
+
" </tr>\n",
|
449 |
+
" <tr>\n",
|
450 |
+
" <td>11</td>\n",
|
451 |
+
" <td>0.007900</td>\n",
|
452 |
+
" <td>0.020809</td>\n",
|
453 |
+
" <td>0.020809</td>\n",
|
454 |
+
" <td>0.108778</td>\n",
|
455 |
+
" </tr>\n",
|
456 |
+
" <tr>\n",
|
457 |
+
" <td>12</td>\n",
|
458 |
+
" <td>0.005000</td>\n",
|
459 |
+
" <td>0.018793</td>\n",
|
460 |
+
" <td>0.018793</td>\n",
|
461 |
+
" <td>0.098439</td>\n",
|
462 |
+
" </tr>\n",
|
463 |
+
" <tr>\n",
|
464 |
+
" <td>13</td>\n",
|
465 |
+
" <td>0.003600</td>\n",
|
466 |
+
" <td>0.017699</td>\n",
|
467 |
+
" <td>0.017699</td>\n",
|
468 |
+
" <td>0.098569</td>\n",
|
469 |
+
" </tr>\n",
|
470 |
+
" <tr>\n",
|
471 |
+
" <td>14</td>\n",
|
472 |
+
" <td>0.002900</td>\n",
|
473 |
+
" <td>0.020224</td>\n",
|
474 |
+
" <td>0.020224</td>\n",
|
475 |
+
" <td>0.100133</td>\n",
|
476 |
+
" </tr>\n",
|
477 |
+
" <tr>\n",
|
478 |
+
" <td>15</td>\n",
|
479 |
+
" <td>0.003400</td>\n",
|
480 |
+
" <td>0.017207</td>\n",
|
481 |
+
" <td>0.017207</td>\n",
|
482 |
+
" <td>0.096104</td>\n",
|
483 |
+
" </tr>\n",
|
484 |
+
" <tr>\n",
|
485 |
+
" <td>16</td>\n",
|
486 |
+
" <td>0.001200</td>\n",
|
487 |
+
" <td>0.017720</td>\n",
|
488 |
+
" <td>0.017720</td>\n",
|
489 |
+
" <td>0.095289</td>\n",
|
490 |
+
" </tr>\n",
|
491 |
+
" <tr>\n",
|
492 |
+
" <td>17</td>\n",
|
493 |
+
" <td>0.001500</td>\n",
|
494 |
+
" <td>0.017983</td>\n",
|
495 |
+
" <td>0.017983</td>\n",
|
496 |
+
" <td>0.096090</td>\n",
|
497 |
+
" </tr>\n",
|
498 |
+
" <tr>\n",
|
499 |
+
" <td>18</td>\n",
|
500 |
+
" <td>0.000800</td>\n",
|
501 |
+
" <td>0.017709</td>\n",
|
502 |
+
" <td>0.017709</td>\n",
|
503 |
+
" <td>0.095045</td>\n",
|
504 |
+
" </tr>\n",
|
505 |
+
" <tr>\n",
|
506 |
+
" <td>19</td>\n",
|
507 |
+
" <td>0.000900</td>\n",
|
508 |
+
" <td>0.017456</td>\n",
|
509 |
+
" <td>0.017456</td>\n",
|
510 |
+
" <td>0.094618</td>\n",
|
511 |
+
" </tr>\n",
|
512 |
+
" <tr>\n",
|
513 |
+
" <td>20</td>\n",
|
514 |
+
" <td>0.000300</td>\n",
|
515 |
+
" <td>0.017487</td>\n",
|
516 |
+
" <td>0.017487</td>\n",
|
517 |
+
" <td>0.095387</td>\n",
|
518 |
+
" </tr>\n",
|
519 |
+
" <tr>\n",
|
520 |
+
" <td>21</td>\n",
|
521 |
+
" <td>0.000200</td>\n",
|
522 |
+
" <td>0.017418</td>\n",
|
523 |
+
" <td>0.017418</td>\n",
|
524 |
+
" <td>0.094866</td>\n",
|
525 |
+
" </tr>\n",
|
526 |
+
" <tr>\n",
|
527 |
+
" <td>22</td>\n",
|
528 |
+
" <td>0.000100</td>\n",
|
529 |
+
" <td>0.017375</td>\n",
|
530 |
+
" <td>0.017375</td>\n",
|
531 |
+
" <td>0.095027</td>\n",
|
532 |
+
" </tr>\n",
|
533 |
+
" <tr>\n",
|
534 |
+
" <td>23</td>\n",
|
535 |
+
" <td>0.000100</td>\n",
|
536 |
+
" <td>0.017170</td>\n",
|
537 |
+
" <td>0.017170</td>\n",
|
538 |
+
" <td>0.095647</td>\n",
|
539 |
+
" </tr>\n",
|
540 |
+
" <tr>\n",
|
541 |
+
" <td>24</td>\n",
|
542 |
+
" <td>0.000100</td>\n",
|
543 |
+
" <td>0.017344</td>\n",
|
544 |
+
" <td>0.017344</td>\n",
|
545 |
+
" <td>0.095632</td>\n",
|
546 |
+
" </tr>\n",
|
547 |
+
" <tr>\n",
|
548 |
+
" <td>25</td>\n",
|
549 |
+
" <td>0.000000</td>\n",
|
550 |
+
" <td>0.017127</td>\n",
|
551 |
+
" <td>0.017127</td>\n",
|
552 |
+
" <td>0.095365</td>\n",
|
553 |
+
" </tr>\n",
|
554 |
+
" <tr>\n",
|
555 |
+
" <td>26</td>\n",
|
556 |
+
" <td>0.000000</td>\n",
|
557 |
+
" <td>0.017153</td>\n",
|
558 |
+
" <td>0.017153</td>\n",
|
559 |
+
" <td>0.095548</td>\n",
|
560 |
+
" </tr>\n",
|
561 |
+
" <tr>\n",
|
562 |
+
" <td>27</td>\n",
|
563 |
+
" <td>0.000000</td>\n",
|
564 |
+
" <td>0.017262</td>\n",
|
565 |
+
" <td>0.017262</td>\n",
|
566 |
+
" <td>0.095495</td>\n",
|
567 |
+
" </tr>\n",
|
568 |
+
" <tr>\n",
|
569 |
+
" <td>28</td>\n",
|
570 |
+
" <td>0.000000</td>\n",
|
571 |
+
" <td>0.017204</td>\n",
|
572 |
+
" <td>0.017204</td>\n",
|
573 |
+
" <td>0.095659</td>\n",
|
574 |
+
" </tr>\n",
|
575 |
+
" <tr>\n",
|
576 |
+
" <td>29</td>\n",
|
577 |
+
" <td>0.000000</td>\n",
|
578 |
+
" <td>0.017318</td>\n",
|
579 |
+
" <td>0.017318</td>\n",
|
580 |
+
" <td>0.095501</td>\n",
|
581 |
+
" </tr>\n",
|
582 |
+
" <tr>\n",
|
583 |
+
" <td>30</td>\n",
|
584 |
+
" <td>0.000000</td>\n",
|
585 |
+
" <td>0.017286</td>\n",
|
586 |
+
" <td>0.017286</td>\n",
|
587 |
+
" <td>0.095896</td>\n",
|
588 |
+
" </tr>\n",
|
589 |
+
" <tr>\n",
|
590 |
+
" <td>31</td>\n",
|
591 |
+
" <td>0.000000</td>\n",
|
592 |
+
" <td>0.017363</td>\n",
|
593 |
+
" <td>0.017363</td>\n",
|
594 |
+
" <td>0.095974</td>\n",
|
595 |
+
" </tr>\n",
|
596 |
+
" <tr>\n",
|
597 |
+
" <td>32</td>\n",
|
598 |
+
" <td>0.000000</td>\n",
|
599 |
+
" <td>0.017250</td>\n",
|
600 |
+
" <td>0.017250</td>\n",
|
601 |
+
" <td>0.095597</td>\n",
|
602 |
+
" </tr>\n",
|
603 |
+
" </tbody>\n",
|
604 |
+
"</table><p>"
|
605 |
+
],
|
606 |
+
"text/plain": [
|
607 |
+
"<IPython.core.display.HTML object>"
|
608 |
+
]
|
609 |
+
},
|
610 |
+
"metadata": {},
|
611 |
+
"output_type": "display_data"
|
612 |
+
},
|
613 |
+
{
|
614 |
+
"name": "stdout",
|
615 |
+
"output_type": "stream",
|
616 |
+
"text": [
|
617 |
+
"[Info] Evaluating on test set ...\n"
|
618 |
+
]
|
619 |
+
},
|
620 |
+
{
|
621 |
+
"data": {
|
622 |
+
"text/html": [
|
623 |
+
"\n",
|
624 |
+
" <div>\n",
|
625 |
+
" \n",
|
626 |
+
" <progress value='81' max='81' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
627 |
+
" [81/81 00:01]\n",
|
628 |
+
" </div>\n",
|
629 |
+
" "
|
630 |
+
],
|
631 |
+
"text/plain": [
|
632 |
+
"<IPython.core.display.HTML object>"
|
633 |
+
]
|
634 |
+
},
|
635 |
+
"metadata": {},
|
636 |
+
"output_type": "display_data"
|
637 |
+
},
|
638 |
+
{
|
639 |
+
"name": "stdout",
|
640 |
+
"output_type": "stream",
|
641 |
+
"text": [
|
642 |
+
"Test set metrics: {'eval_loss': 0.022432124242186546, 'eval_mse': 0.022432127967476845, 'eval_mae': 0.10348472744226456, 'eval_runtime': 1.4185, 'eval_samples_per_second': 456.805, 'eval_steps_per_second': 57.101, 'epoch': 32.0}\n",
|
643 |
+
"[Info] Done. Saving final model ...\n",
|
644 |
+
"[Info] Finished.\n"
|
645 |
+
]
|
646 |
+
},
|
647 |
+
{
|
648 |
+
"data": {
|
649 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGwCAYAAABRgJRuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACQu0lEQVR4nO3deXxTVfr48U+SJuneAqUthZaCIIusslRARceO4DooIi4zMMjgqFRH6sp8FRydmaIigwsj6gyoP2VgXEfFYQZQcBRwKSCyiIJIEWjL1r1N0uT+/ri9t0mbtEn3Js/79coraXLuzUmw16fPec45BkVRFIQQQgghOjlje3dACCGEEKIlSFAjhBBCiKAgQY0QQgghgoIENUIIIYQIChLUCCGEECIoSFAjhBBCiKAgQY0QQgghgkJYe3egrbhcLo4dO0ZMTAwGg6G9uyNESFIUhdLSUlJSUjAaO8ffVHLtEKJ9BXLdCJmg5tixY6SmprZ3N4QQwJEjR+jVq1d7d8Mvcu0QomPw57oRMkFNTEwMoH4psbGx7dwbIUJTSUkJqamp+u9jZyDXDiHaVyDXjZAJarS0cWxsrFyYhGhnnWkYR64dQnQM/lw3OsegthBCCCFEIySoEUIIIURQkKBGCCGEEEEhZGpqRMfndDpxOBzt3Q3RDGazGZPJ1N7dECFMriOdT0teNySoEe1OURTy8/MpKipq766IFhAfH09ycnKnKgYWnZ9cRzq3lrpuSFAj2p12IUpMTCQyMlL+Z9hJKYpCRUUFhYWFAPTo0aOdeyRCiVxHOqeWvm5IUCPaldPp1C9E3bp1a+/uiGaKiIgAoLCwkMTERBmKEm1CriOdW0teN6RQWLQrbew7MjKynXsiWor2byl1DaKtyHWk82up64YENaJDkFRx8JB/S9Fe5L+9zqul/u0kqBFCCCFEUJCgRgghhBBBQYIaITqol19+mfj4+PbuhhCikwvkWvLII48wYsSIVu1Pa5KgpoOqtDvbuwtCCH+5XFB2Ak7sb++eCBHSJKjpgP79zXGGPPIf3vjqSHt3RYg2tWzZMtLT0wkPDycjI4MvvvjCZ9s9e/YwdepU0tPTMRgMLF26tF6bnJwcxowZQ0xMDImJiUyZMoX9+1sh8LAVw+J+sGwsVNta/vxCCL9IUNMB7ThShNOlsD2vqL270uYURaHCXt0uN0VRAuqry+UiJyeHPn36EBERwfDhw3nzzTdxuVz06tWL559/3qP9jh07MBqNHD58GIAlS5YwdOhQoqKiSE1N5Y477qCsrKxJ35uWMl6xYgVpaWlER0dzxx134HQ6eeKJJ0hOTiYxMZE//elPHsf504dPP/2UCy64gIiICFJTU7nrrrsoLy9vUj8bsmbNGrKzs1m4cCHbt29n+PDhTJo0SV+Uq66Kigr69u3LokWLSE5O9tpm8+bNzJ07l23btrF+/XocDgeXXnppy/ffGgeGmstpxemWPbdoErmWNO1a4q1vjz76KL169cJqtTJixAjWrVunv26328nKyqJHjx6Eh4fTu3dvcnJyAPXf4JFHHiEtLQ2r1UpKSgp33XVXi/TLF1l8rwMqt1UDUFZzH0oqHU4GL/hPu7z33kcnEWnx/1ciJyeH1157jeXLl9O/f38++eQTfvnLX/Kf//yHG2+8kVWrVnH77bfr7V9//XUmTJhA7969ATAajTzzzDP06dOHH374gTvuuIP777+fv/71r03q/8GDB/n3v//NunXrOHjwINdddx0//PADZ599Nps3b2bLli3ccsstZGZmkpGR4VcfDh48yOTJk/njH//IihUrOHHiBFlZWWRlZbFy5com9dOXJUuWMGfOHGbNmgXA8uXLWbt2LStWrODBBx+s137MmDGMGTMGwOvrgMfFF9TagsTERHJzc7nwwgtbrvNGI0R0hYqTUHkaYmU15fYm15KmX0vcPf300zz11FO88MILjBw5khUrVnD11VezZ88e+vfvzzPPPMN7773HP//5T9LS0jhy5AhHjqijDG+99RZ/+ctfWL16Neeccw75+fl8/fXXze5TQySo6YAqauppykMwqOksbDYbf/7zn9mwYQPjxo0DoG/fvnz66ae88MIL3H///Tz11FPk5eWRlpaGy+Vi9erVPPTQQ/o57r77bv1xeno6f/zjH7ntttuafCFyuVysWLGCmJgYBg8ezMUXX8z+/fv58MMPMRqNDBgwgMcff5yPP/5YD2oa60NOTg4333yz3k67iE2cOJHnn3+e8PDwJvW1LrvdTm5uLvPnz9efMxqNZGZmsnXr1hZ5D4Di4mIAunbt6rONzWbDZqsdQiopKfHv5JE1QU3FqWb1UYSWjngtcbd48WIeeOABbrjhBgD9GrJ06VKWLVtGXl4e/fv35/zzz8dgMOiB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2lo1kqkRfrrooou4++6727sbQUOCmlZUWWdlYH/UzdTI8JMQnUiEZGqEaE8S1LSiiiYMP8k6NUJ0YrIAnxDtSoKaVuQ+jTvQdWoiLerCXSE3pVtRwF7ePrcA9wlyuVzk5OTQp08fIiIiGD58OG+++SYul4tevXrx/PPPe7TfsWMHRqORw4cPA7BkyRKGDh1KVFQUqamp3HHHHZSVlTXpa3vkkUcYMWIEK1asIC0tjejoaO644w6cTidPPPEEycnJJCYm8qc//cntq1Z45JFHSEtLw2q1kpKSwl133aW/brPZuPfee+nZsydRUVFkZGTU239J1CGFwh1HJ7qWaM6cOcOMGTPo0qULkZGRXHbZZXz//ff664cPH+aqq66iS5cuREVFcc455/Dhhx/qx9588810796diIgI+vfvz8qVK1vkq+xMmrSi8LJly/SddIcPH86zzz7L2LFjvbZ96aWXePXVV9m9ezcAo0aN4s9//rNHe0VRWLhwIS+99BJFRUVMmDCB559/Xt/aHOD06dPceeedvP/++xiNRqZOncrTTz9NdHR0Uz5Cm6h0uA8/BbZOTWKMlR9PVYTeNgmOCvhzSvu89++PgcW/TUcBcnJyeO2111i+fDn9+/fnk08+4Ze//CX/+c9/uPHGG1m1ahW333673v71119nwoQJ+oqeRqORZ555hj59+vDDDz9wxx13cP/99/PXv/61Sd0/ePAg//73v1m3bh0HDx7kuuuu44cffuDss89m8+bNbNmyhVtuuYXMzEwyMjJ46623+Mtf/sLq1as555xzyM/P5+uvv9bPl5WVxd69e1m9ejUpKSm88847TJ48mW+++cbjd1O40QuF/dvrTbSiTnQt0fz617/m+++/57333iM2NpYHHniAyy+/nL1792I2m5k7dy52u51PPvmEqKgo9u7dq/8/8OGHH2bv3r38+9//JiEhgQMHDlBZWdnSn6zDCzioWbNmDdnZ2SxfvpyMjAyWLl3KpEmT2L9/P4mJifXab9q0iRtvvJHx48cTHh7O448/zqWXXsqePXvo2bMnAE888QTPPPMMr7zyCn369OHhhx9m0qRJ7N27V9+C/Oabb+b48eOsX78eh8PBrFmzuPXWW1m1alUzv4LW4z6UZHe6sFe7sIQ1nBzTMjWJseH8eKqiXo2N6BhsNht//vOf2bBhA+PGjQOgb9++fPrpp7zwwgvcf//9PPXUU+Tl5ZGWlobL5WL16tU89NBD+jnciwPT09P54x//yG233dbkoMblcrFixQpiYmIYPHgwF198Mfv37+fDDz/EaDQyYMAAHn/8cT7++GMyMjLIy8sjOTmZzMxMzGYzaWlp+h8beXl5rFy5kry8PFJS1P8x3Hvvvaxbt46VK1fy5z//uYnfXJDTVhWWTI0IkBbMfPbZZ4wfPx5Q/xBKTU3l3XffZdq0aeTl5TF16lSGDh0KqNccTV5eHiNHjmT06NGAek0JRQEHNUuWLGHOnDnMmjULgOXLl7N27VpWrFjBgw8+WK993V0///a3v/HWW2+xceNGZsyYgaIoLF26lIceeohf/OIXALz66qskJSXx7rvvcsMNN7Bv3z7WrVvHl19+qf+DPfvss1x++eUsXrxYv+h2NN5mMlnCLA0f45apgRAcfjJHqn/ltNd7++nAgQNUVFTw85//3ON5u93OyJEjGTFiBIMGDWLVqlU8+OCDbN68mcLCQqZNm6a33bBhAzk5OXz77beUlJRQXV1NVVUVFRUVREb63xdNeno6MTEx+s9JSUmYTCaMRqPHc4WFhQBMmzaNpUuX0rdvXyZPnszll1/OVVddRVhYGN988w1Op5Ozzz7b4z1sNhvdunULuG8hQ6Z0dxyd5Fqi2bdvH2FhYWRkZOjPdevWjQEDBrBv3z4A7rrrLm6//Xb++9//kpmZydSpUxk2bBgAt99+O1OnTmX79u1ceumlTJkyRQ+OQklANTV2u53c3FwyMzNrT2A0kpmZydatW/06R0VFBQ6Hg65d1V/+Q4cOkZ+f73HOuLg4MjIy9HNu3bqV+Ph4PaAByMzMxGg08vnnn3t9H5vNRklJicetrTVlx20tM5MYE15zTIjt/WQwqGnb9rgZDH53U6t9Wbt2LTt37tRve/fu5c033wTU7KKWSVy1ahWTJ0/WA4Iff/yRK6+8kmHDhvHWW2+Rm5vLsmXLAPX3rCnMZnOdr9Lg9TmXywVAamoq+/fv569//SsRERHccccdXHjhhTgcDsrKyjCZTOTm5np8vn379vH00083qX8hwb2mpol1FaKFdJJrSSB+85vf8MMPP/CrX/2Kb775htGjR/Pss88CcNlll3H48GHmzZvHsWPHuOSSS7j33ntbpR8dWUBBzcmTJ3E6nfW2J09KSiI/P9+vczzwwAOkpKToQYx2XEPnzM/Prze0FRYWRteuXX2+b05ODnFxcfotNTXVr/61pPI6M5n8WatGa5MUW5OpsXnfIl60r8GDB2O1WsnLy6Nfv34eN+2/tZtuuondu3eTm5vLm2++yc0336wfn5ubi8vl4qmnnuK8887j7LPP5tixtv+rMiIigquuuopnnnmGTZs2sXXrVr755htGjhyJ0+mksLCw3udLTk5u8352GlqmxmlTazqE8NOgQYOorq72+EP91KlT7N+/n8GDB+vPpaamctttt/H2229zzz338NJLL+mvde/enZkzZ/Laa6+xdOlSXnzxxTb9DB1BkwqFm2rRokWsXr2aTZs26bUyrWX+/PlkZ2frP5eUlLR5YFNZd3NKPzI1WnYnsSaoqXK4qHa6CDPJRLWOJCYmhnvvvZd58+bhcrk4//zzKS4u5rPPPiM2NpaZM2eSnp7O+PHjmT17Nk6nk6uvvlo/vl+/fjgcDp599lmuuuoqPvvsM5YvX96mn+Hll1/G6XSSkZFBZGQkr732GhEREfTu3Ztu3bpx8803M2PGDJ566ilGjhzJiRMn2LhxI8OGDeOKK65o0752GpZoMFnAaVezNU0oFhWhqX///vziF79gzpw5vPDCC8TExPDggw/Ss2dPvTTj7rvv5rLLLuPss8/mzJkzfPzxxwwaNAiABQsWMGrUKM455xxsNhsffPCB/looCej/lAkJCZhMJgoKCjyeLygoaPSvt8WLF7No0SL++9//6mOAgH5cQ+dMTk7W6wA01dXVnD592uf7Wq1WYmNjPW5trSlrzmh1ONrwE9TP+IiO4bHHHuPhhx8mJyeHQYMGMXnyZNauXUufPn30NjfffDNff/0111xzDREREfrzw4cPZ8mSJTz++OMMGTKE119/nZycnDbtf3x8PC+99BITJkxg2LBhbNiwgffff18fIlu5ciUzZszgnnvuYcCAAUyZMoUvv/yStLS0Nu1np2IwyAJ8oslWrlzJqFGjuPLKKxk3bhyKovDhhx/qw8hOp5O5c+fq15uzzz5bn1hgsViYP38+w4YN48ILL8RkMrF69er2/DjtQwnQ2LFjlaysLP1np9Op9OzZU8nJyfF5zOOPP67ExsYqW7durfeay+VSkpOTlcWLF+vPFRcXK1arVfnHP/6hKIqi7N27VwGUr776Sm/zn//8RzEYDMrRo0f96ndxcbECKMXFxX61bwkPvPm10vuBD/Tbh7uONXrM2D+tV3o/8IGy+2iR0v/3Hyq9H/hA+elMRRv0tn1UVlYqe/fuVSorK9u7K6KFNPRv2h6/h80VcJ+XnacoC2MV5cBHrdsxoZPrSOfXUteNgIefsrOzmTlzJqNHj2bs2LEsXbqU8vJyfTbUjBkz6Nmzp/5X5+OPP86CBQtYtWoV6enpeg1MdHQ00dHRGAwG7r77bv74xz/Sv39/fUp3SkoKU6ZMAdCj0jlz5rB8+XIcDgdZWVnccMMNHXbmE9TP1Pg1/FSTqYmyhBFlNWGvcMmqwkJ0JhGyqrAQ7SXgoGb69OmcOHGCBQsWkJ+fz4gRI1i3bp1e6JuXl+cxhfT555/Hbrdz3XXXeZxn4cKFPPLIIwDcf//9lJeXc+utt1JUVMT555/PunXrPOpuXn/9dbKysrjkkkv0xfeeeeaZpnzmNhPo8JOiKPrsp0iriejwMM5UOEJvAT5RzznnnKOvRFzXCy+84FGELNpZZM1aNbIAnxBtrkmFwllZWWRlZXl9re4y6j/++GOj5zMYDDz66KM8+uijPtt07dq1Qy+0541W9BtuNlLlcDVaG2OrduGqmQUaZQkjyqL+84TcWjWing8//BCHw/tMuLozB0U7k60ShGg3bTr7KdRomZruMVaOnK5sNFPj/nqE2URMeFi950Vo0rZWEJ2ALMDXbhRZG6jTaql/O5kn3Iq0TE33aHV6dmPBiRYERVpMGI0GoqxqUFMaAkGNtiCc6PxC/t9SMjVtTpsdVFEhawN1Vtq/Xd0FQwMlmZpWVLvlgX+rA+v1NDXDTlpQE8yZGovFgtFo5NixY3Tv3h2LxYKhlVbjFK1LURTsdjsnTpzAaDRisTS8JUjQkkxNmzOZTMTHx+tLf0RGRsp1pJNQFIWKigoKCwuJj4/HZDI163wS1LSiSrfhJ2g8ONF28o60qP+oMSEQ1BiNRvr06cPx48fbZUVd0fIiIyNJS0vzmDAQUiJr9saSTE2b0tYsq7ummegc4uPjW2S1cglqWpGWedGDmkZ23K7QMzVqUBMqw08Wi4W0tDSqq6txOmWhwc7MZDIRFhYW2n8ly+J77cJgMNCjRw8SExN9FtWLjslsNjc7Q6ORoKaVuFwKVQ61tkDfcdvPTI0WzESHQKZGo22+2NzxVCHanTb8VCFTutuDyWRqsf9Bis4nRPPDra/SUZtx8Hf4qW6mRgtqZEq3EJ2IlqmxFYNTMgZCtCUJalqJNtRkMEDXKLVgsrzRQuHa1YShNmPTWIGxEKIDiYgHaobfZAE+IdqUBDWtRCsSjjSbaoeRGqupsdWuJgwQLevUCNH5GE0QHqc+lmJhIdqUBDWtRF9zxhrm99TsijqZmuia4Ea2SRCik5Fp3UK0CwlqWol7fYwW1DicCrZq30NJFXbPTI0W3EimRohOpiUW4PthM5w62DL9ESJESFDTSrSsS4TZRJSlthK/obqaujU12vBTsE/pFiLoNDdTc/oQvHo1/HNGy/VJiBAgQU0rcZ+eHWYyEm421jzvO0DRa2rqzH6STI0QnUxzF+A7XZOhKf6pZfojRIiQoKaVVDp8TM9uIEDRMzV11qmpsDtxumSjNiE6jeYuwFdWsyquQ/YyEiIQEtS0EvfhJ6jdz6nBTI2PFYWh8ZlTQogOJLKLet/UTI0W1DjtstaNEAGQoKaVVNRZHVifAWVvoKbG5llTYw0zEmY01LwmQY0QnUZzC4XL3PYvspc3vz9ChAgJalqJnqnRh5/Ue78yNTVtDQaDXiwsqwoL0Yk0t1C43C2okSEoIfwmQU0rqdBqasyeQ0kN1tTUydS4P5a1aoToRJqdqSmofWyXoEYIf0lQ00q04afIusNPfmRqoqy1U8Bj9FWFZasEITqN5mZqyk7UPnbI8JMQ/pKgppXoKwprw09+FAqX60NWbpkaPcMjxYJCdBr67KczoDRh5mK51NQI0RQS1LQSPetiqTv85D3j4nC6sFe7PI7x5zghRAekZWpc1WArCexYpwMqTtX+LMNPQvhNgppWUlEn6xLVSKFwhdusqEi3TE2MFtRUSaZGiE7DHAHmSPVxoHU15Sc9f5bhJyH8JkFNK6msM/wU1chO3Vpmx2wyYAmr/WfRg6EGpoILESyWLVtGeno64eHhZGRk8MUXX/hsu2fPHqZOnUp6ejoGg4GlS5c2+5wtqqkL8LkXCYNkaoQIgAQ1raTcx0J6vjI1WiGwe5YGINpqBmT2kwh+a9asITs7m4ULF7J9+3aGDx/OpEmTKCws9Nq+oqKCvn37smjRIpKTk1vknC1KX4DvTGDHlZ/w/FkyNUL4TYKaVlKbqdG2PNCGn7xnXOrW4Gi042SdGhHslixZwpw5c5g1axaDBw9m+fLlREZGsmLFCq/tx4wZw5NPPskNN9yA1WptkXMC2Gw2SkpKPG5Nok/rPtVwu7rqZWokqBHCXxLUtJK6s58aW2+mvM4UcI0/U8GF6Ozsdju5ublkZmbqzxmNRjIzM9m6dWubnjMnJ4e4uDj9lpqa2qT3b/K07rI6WSQZfhLCbxLUtJK6w0+N7bitbYBZL1NTs05NqQQ1IoidPHkSp9NJUlKSx/NJSUnk5+e36Tnnz59PcXGxfjty5EiT3r/JC/DVDWpk+EkIv4U13kQESlGUesNPTa+pkUyNEG3JarX6HM4KSFMzNdoaNdZYdTq4ZGqE8JtkalqB3emi2qUuuBWhFwrX1Mb4nNJdfzVhkKBGhIaEhARMJhMFBZ71JAUFBT6LgNvjnAFpbqamS2/1XvZ+EsJvEtS0gkqPNWc8Zz9V2J0oXlYY9ZWp0Y6T4ScRzCwWC6NGjWLjxo36cy6Xi40bNzJu3LgOc86ARHZT75taU9Olj3pvL2u5PgkR5GT4qRVoRcIWkxGzSY0bteCk2qVgq3YRbjbVOUYyNSK0ZWdnM3PmTEaPHs3YsWNZunQp5eXlzJo1C4AZM2bQs2dPcnJyALUQeO/evfrjo0ePsnPnTqKjo+nXr59f52xVkU3M1GjDT121oEYyNUL4q0mZmpZeIEt7re5t7ty5epuLLrqo3uu33XZbU7rf6rQAJdItQHHfedtbgFJub7imRqZ0i2A3ffp0Fi9ezIIFCxgxYgQ7d+5k3bp1eqFvXl4ex48f19sfO3aMkSNHMnLkSI4fP87ixYsZOXIkv/nNb/w+Z6ty3//JX9X22vZapkaGn4TwW8CZGm0xq+XLl5ORkcHSpUuZNGkS+/fvJzExsV57bYGsadOmMW/ePK/n/PLLL3E6a4dsdu/ezc9//nOmTZvm0W7OnDk8+uij+s+RkZGBdr9N6NO53bIxJqOBCLOJSoeTcpuTbtF1jrF5n/1UuxKxE5dLwWg0tGLPhWhfWVlZZGVleX1t06ZNHj+np6d7HcoN5JytSl98L4BMjbbwnjEM4nqpj2WdGiH8FnCmpjUWyOrevTvJycn67YMPPuCss85i4sSJHu0iIyM92sXGxgba/TZRu++T9wDFW7Gwnqmxes/UAFQ4ZKsEIToNLVPjKAdHlX/HaAvvRXUHS1TN8ZKpEcJfAQU1rbFAlrf3eO2117jlllswGDyzEq+//joJCQkMGTKE+fPnU1Hh+5e9xVYFbYLa+pi6AYq2j1P9oMbXisLhZiOmmuyMDEEJ0YmEx4Gh5vfZ32JhLVMTnVi7IaZkaoTwW0DDTw0tZvXtt9+2SIfeffddioqK+PWvf+3x/E033UTv3r1JSUlh165dPPDAA+zfv5+3337b63lycnL4wx/+0CJ9CpSeqalTDBzZwKrC2uyniDo1NQaDgSiLiZKqatn/SYjOxGCAiC5QcVIdgopNafwYPVOTCJaaMWopFBbCbx1u9tPf//53LrvsMlJSPC8At956q/546NCh9OjRg0suuYSDBw9y1lln1TvP/Pnzyc7O1n8uKSlp+nLnAaq7RYKmoZlMvjI1ADHhZkqqqmUGlBCdTWRXNajxN1OjTeeOTgRLTaZGVhQWwm8BBTWtvZjV4cOH2bBhg8/si7uMjAwADhw44DWoaeqqoC6Xwrf5pXSPsdI9pmmrimpFv/X3cTLVvF6/NsbX3k/ux0mmRohOJtAF+LwNP7mq1VlRYZaW758QQSagmprWXsxq5cqVJCYmcsUVVzTadufOnQD06NGj2e/r7s5/7ODyZ/7He18fa/I5tILeSLP/hcINZWoaOk4I0YEFugCfx/BTVO3zkq0Rwi8Bz37Kzs7mpZde4pVXXmHfvn3cfvvt9RbImj9/vt7ebrezc+dOdu7c6bFA1oEDBzzO63K5WLlyJTNnziQszDNbcfDgQR577DFyc3P58ccfee+995gxYwYXXnghw4YNa8rn9ml4ahwAn35/osnnqLAFPvzka50a9+OkUFiITibQad1lbpkakxmMZvVnKRYWwi8B19RMnz6dEydOsGDBAvLz8xkxYkS9BbKMxtpYSVsgS7N48WIWL17MxIkTPdad2LBhA3l5edxyyy313tNisbBhwwZ9NdDU1FSmTp3KQw89FGj3G3V+v+7At3x+6DT2aheWsMDXJ6zwMT1bz7h4m/2krVNjrZ+p0YMhL8cJITqwQBfg0zI10TVrflmioKpIioWF8FOTCoVbY4GsSy+91Ge71NRUNm/eHHA/m2JgcgzdoiycKrez80gRY/t0DfgclY6amhofw091MzUul1I7ZNVQpkaGn4ToXALdKkHbIiG6ZoapFtTI8JMQfpENLeswGg2M75cANH0IqnZ6dp2gpubn8jqFwlXVTrR4zlumJkqGn4TonPRMjR9BjaMKqorVx1Hd1Xt9rRrJ1AjhDwlqvLhAC2oOnGzS8drwU93F93wV/GrtDQYID2tg+EkyNUJ0Lnqm5lTjbfUtEszq+jbgNq1bghoh/CFBjRcT+qtBzdc/FVNS5Qj4eH34yUehcEWd2hi9sNhs8rq3U3S4elypBDVCdC6BTOl2X6NGW03dXDMDyl7W8n0TIghJUONFz/gI+iRE4XQpbDvox19Ydehrzlh8ZWo8h5/K7d7Xtal7nGRqhOhkIgMYftLqabShJ6id1i3DT0L4RYIaH86vGYL6rAlDUJU+VhTW6mXqBicNrVEDEKMHNbKhpRCdil5TUwSuRn5/y+oUCYMMPwkRIAlqfJhQE9T8rwlBjZZ5qVso7Ks2xldmR6NlamT4SYhORsvUoNQWAfuiBzVumRp9+ElmPwnhDwlqfBh3VjeMBvjhRDnHiioDOlbL1ET5HH7ykanxMvPJ/XkZfhKikzGZwRqrPm6srqbudG6QTI0QAZKgxoe4CDPDesUDgQ9B+drQUgtyym3VHmvyNJapibGqq4rKlG4hOiFtJlNjdTXuWyRo9CndkqkRwh8S1DTg/CZM7Xa5FCodPtapqcm4uBSocrj057VMTd0gqO5xkqkRohPydwE+9y0SNJZo9V6CGiH8IkFNA87vX1ss7M+qyIAe0ICX4Se3n92HoBra9wlqp3SX2av97ocQooPwdwG+ulskgAw/CREgCWoaMDItngiziZNldvYXlPp1jMdCembPr9doNOjZGPe1ahra9wlqC4wVpfb8QohOwt8F+LTF99xramT4SYiASFDTAGuYSd/76dPv/RuC0oKVCLMJg6H+QnreioUby9REmE1oa/LJEJQQnYw/C/A5KsFWoj72tk6NZGqE8IsENY24oH9gdTUVjQ0leVlzprF1agwGg0zrFqKz8mcBPm06t8kC4XG1z0umRoiASFDTCG29ms9/OI292tVI66YV/eqzn3ysKAyy/5MQnVaUeg2h5JjvNu5DT+4ZXllRWIiASFDTiAFJMSREW6h0ONmed6bR9r6mc2u0YmH34afGMjXge40bIUQH12Okev/TV+Dy8YeRPp27u+fz+vCTZGqE8IcENY0wGg16tsaf9WoaDWq8ZFwCydTIWjVCdDI9hkFYhDr8dOp77228bZEAbsNPkqkRwh8S1PhB3zLBj2Lh2uGnhrc8CDRTow8/2SWoEaJTMZmh12j1cd5W7228bZEAUigsRIAkqPGDtgjfrp+KKK50NNi2sUxNtNXk0Q4an/2kHieZGiE6rbTz1Pu8bd5f97ZFArhlasrUNR2EEA2SoMYPKfER9O0ehUuBbT80vNaErx26Ne5bJdQ9xtc6NeprWoZH1qkRotPRgxpfmRovWyRAbaZGcUG1rXX6JkQQkaDGT/qWCY0MQWn1MREBDD+VNzJkBbUZHpn9JEQn1GsMYIAzP0Jpfv3XvW2RALVBDcgQlBB+kKDGT/4WC1c4Gq6P8TY1u8LWeKZG3ypBghohOp/wOEgaoj72NgSlDz/VCWqMJjBZ1ceyVo0QjZKgxk/jzuqG0QA/nCynsLTKZ7tGh5/qDCPZq13Yna6aY3xnamRKtxCdXEN1NVqhcN3hJ5D9n4QIgAQ1fooNN5McGw7A0TOVPts1PvzkOYxU6VYw7CsQAoiRQmEhOjdfdTX2crUQGOpnagDM2gJ8Za3XNyGChAQ1AUiOU4Oa/OIGMjXa8JOPoSS9ULimjka7t4QZMZt8/3NEyZRuITo3LajJ/wZsbgGKlqUJCwdrTP3jZFVhIfwmQU0A9KCmxHdQo2dqzP4tvtfYtgp1j5PhJyE6qbheEJcKihOOflX7fLlbkbCXTXBl+EkI/0lQE4Ck2MaDmtrp2f5taKndRzVQTwMy/CREUPBWV+NrOrdGH36SQmEhGiNBTQC0mpqCBoaftNlPEX5uaFkeYKZGpnQL0YmlZqj37nU1vrZI0EimRgi/SVATAH+Gn7Tp2ZE+hp/ctztQFKW2fQP7PoFM6RYiKKSNU+9/+gqcNb/LvrZI0OirCkumRojGSFATAG34qaDE98qeFY0MP2nPuxSodDj1TE1D+z6B2zYJNjUYEkJ0QomDwBqnzmQq2K0+52uLBI0lWr2XoEaIRklQE4AeNZma48WVPgMLrfDX1/CTewFxma3aba+ohjM17sFQlcMVWMeFEB2D0QSpY9XHWl2NvkaNj0yNDD8J4TcJagKgZWqqHC5KKr0PAzW2oaXRaNCzMuU2p14j09BqwqAOZ2kTI0ptDW+qKYTowNLq1NWU+VhNWKMPP0lQI0RjJKgJQLjZRHykGfBeV2OvdlHtUjM4/qwOXB5ApkYNhjxnTgkhOiGtriZvm7rzdqPDT7L4nhD+alJQs2zZMtLT0wkPDycjI4MvvvjCZ9s9e/YwdepU0tPTMRgMLF26tF6bRx55BIPB4HEbOHCgR5uqqirmzp1Lt27diI6OZurUqRQUFDSl+82S3MC07gq3hfEams3kvv+TvzU1dY8TQnRSKeeC0Qxl+VB0uPHhJ7MMPwnhr4CDmjVr1pCdnc3ChQvZvn07w4cPZ9KkSRQWFnptX1FRQd++fVm0aBHJyck+z3vOOedw/Phx/fbpp596vD5v3jzef/993njjDTZv3syxY8e49tprA+1+syU1MK1by7qYTQa/Vwf2d/aTepwa+JTKWjVCdF6WSEgZoT4+sKE2WGk0UyNBjRCNafz/pHUsWbKEOXPmMGvWLACWL1/O2rVrWbFiBQ8++GC99mPGjGHMmDEAXl/XOxIW5jPoKS4u5u9//zurVq3iZz/7GQArV65k0KBBbNu2jfPOO6/eMTabDZutdpZSSUmJ/x+yAQ1navwt+lWDkzKb/7OfQDI1QgSN1Az46UvY+y/1Z3MkWKO9t9WCGofMfhKiMQFlaux2O7m5uWRmZtaewGgkMzOTrVu3NnBk477//ntSUlLo27cvN998M3l5efprubm5OBwOj/cdOHAgaWlpPt83JyeHuLg4/Zaamtqs/mmS9RlQvoefGltIzz040Xf19iNTI2vViGAXyNA2wBtvvMHAgQMJDw9n6NChfPjhhx6vl5WVkZWVRa9evYiIiGDw4MEsX768NT+Cf7S6mh8/U+99FQmDFAoLEYCAgpqTJ0/idDpJSvJMkyYlJZGfn9/kTmRkZPDyyy+zbt06nn/+eQ4dOsQFF1xAaWkpAPn5+VgsFuLj4/1+3/nz51NcXKzfjhw50uT+udOCmoIGMjW+pnNrIi3uNTXaNgmNZ2q0QmEJakQwCnRoe8uWLdx4443Mnj2bHTt2MGXKFKZMmcLu3bv1NtnZ2axbt47XXnuNffv2cffdd5OVlcV7773XVh/LO227BKWm6N/XFglQO6Vb1qkRolEdYvbTZZddxrRp0xg2bBiTJk3iww8/pKioiH/+859NPqfVaiU2Ntbj1hL04ScvmRp93yc/15wps1VTYdOyO35kamT4SQQx96FtLaMSGRnJihUrvLZ/+umnmTx5Mvfddx+DBg3iscce49xzz+W5557T22zZsoWZM2dy0UUXkZ6ezq233srw4cMbzQC1uqgE6Na/9ucGMzUy/CSEvwIKahISEjCZTPVmHRUUFDRYBByo+Ph4zj77bA4cOABAcnIydrudoqKiVn1ff9SuKlw/qClvZOE9TbTb/k96pqaRdWpAhp9E8GrK0PbWrVs92gNMmjTJo/348eN57733OHr0KIqi8PHHH/Pdd99x6aWX+uyLzWajpKTE49YqtPVqoOGgRgqFhfBbQEGNxWJh1KhRbNy4UX/O5XKxceNGxo0b12KdKisr4+DBg/To0QOAUaNGYTabPd53//795OXltej7+kMbfjpVbsdW7bleTIWfQ0m1s5+cbnU4/sx+kqBGBKemDG3n5+c32v7ZZ59l8ODB9OrVC4vFwuTJk1m2bBkXXnihz760Vj1ePWlu1y5/hp9kSrcQjQp49lN2djYzZ85k9OjRjB07lqVLl1JeXq7PhpoxYwY9e/YkJycHUP8C27t3r/746NGj7Ny5k+joaPr16wfAvffey1VXXUXv3r05duwYCxcuxGQyceONNwIQFxfH7Nmzyc7OpmvXrsTGxnLnnXcybtw4rzOfWlOXSDOWMCP2aheFJTZSu0bqr/k7lOSxTo2t4RWIvR1XJlO6hfDLs88+y7Zt23jvvffo3bs3n3zyCXPnziUlJaVelkczf/58srOz9Z9LSkpaJ7BxD2r8GX6yl6uL9WlLiwsh6gk4qJk+fTonTpxgwYIF5OfnM2LECNatW6f/xZSXl4fRWJsAOnbsGCNHjtR/Xrx4MYsXL2bixIls2rQJgJ9++okbb7yRU6dO0b17d84//3y2bdtG9+61i1H95S9/wWg0MnXqVGw2G5MmTeKvf/1rUz93kxkMBpJjw8k7XUF+SZVnUOPwr1DYc0VhbUp3ADU1dglqRHBpytB2cnJyg+0rKyv5/e9/zzvvvMMVV1wBwLBhw9i5cyeLFy/2GdRYrVasVmtzP1LjuvZVF9wrP9HI8JN2jVHAUen2sxCiroCDGoCsrCyysrK8vqYFKpr09PRGd5VevXp1o+8ZHh7OsmXLWLZsmd/9bC16UFOnWLgywOGn0iq3bRL8qKmpHX6SbRJEcHEf2p4yZQpQO7Tt61ozbtw4Nm7cyN13360/t379en1I2uFw4HA4PP7IAjCZTLhcHWBTWIMBLrxfXasm/QLf7cxuQYyjQoIaIRrQpKAm1CX5mNatDSVFNDb7qSboOVFmc3vO/0xNWZVsaCmCT6BD27/73e+YOHEiTz31FFdccQWrV6/mq6++4sUXXwQgNjaWiRMnct999xEREUHv3r3ZvHkzr776KkuWLGm3z+kh41b11hCjCcIioLpSHYKKSmibvgnRCUlQ0wTJsWpqul6mxuHf4ntaxuVEiRrUGAwQbm68Zru2FkcyNSL4BDq0PX78eFatWsVDDz3E73//e/r378+7777LkCFD9DarV69m/vz53HzzzZw+fZrevXvzpz/9idtuu63NP1+zWCLVoEaKhYVokAQ1TZDkY6uE2m0S/FtRuNRWW09j8KP4T6Z0i2AXyNA2wLRp05g2bZrP8yUnJ7Ny5cqW6l77MUcBp2RatxCN6BCL73U2PeIiAN/DT43v/eT5uj8zn6B2fRsJaoQIMfqqwmXt2w8hOjgJapogOU4dfqq7/5P/w0+mOj/7lzBznzXVWPG1ECKImGWtGiH8IUFNE2jDT4UlNo/gwt81Z6KbnKlRj6t2KdiqO8DsDSFE27C4rVUjhPBJgpomSIxRgxq708Xpcrv+vL7jdiPDTxFmk8f6Wf7MfKrbToaghAghWlAjmRohGiRBTRNYwowkRFsAz2LhCm34qZE1ZwwGg0eA4s8aNQBGo0GfDi6rCgsRQrThJykUFqJBEtQ0kbeNLSsC2PLAva7G30wNQGyEGYCiSlmrRoiQIYXCQvhFgpom6lGzAF9+ce0CevqUbrP/m1OC/zU1ULuhZn5xpd/HCCE6ObMMPwnhDwlqmkhfq6YmuHC5FCod/m954F4s7O/sJ4CUeHU6+dGiqkZaCiGChl4oLEGNEA2RoKaJkusswKcFNODn8JOlaZmanjVBzbEiydQIETK04SeHzH4SoiES1DSRtv9Tfs1WB9rQE0B4mP+bU9Z93JiUmveVoEaIEGKWTI0Q/pCgpom0TE1BzQJ8lW5bJBiNfmx54DZEFWH2P1OTIpkaIUKPXigsmRohGiJBTRPpBbs1w0/ldv9WE9ZEemRqAg9qpKZGiBCiFwpLUCNEQySoaSItqCmudFBpd+rDTxEBrg4MjS/W506rqTlZZqPKIbt1CxESpFBYCL9IUNNEMdYwPSuTX1JFhb12x21/uLcLJFMTH2nWh6vyiyVbI0RIsMjeT0L4Q4KaJjIYDLUzoIqrAs7UuAcygWRqDAYDKfFSLCxESDHL3k9C+EOCmmZwX1VYKxT2N1PjsU5NAEENuNfVSFAjREiQQmEh/CJBTTO4FwtrhcL+Z2oC3/tJkxKnzYCS4SchQoJZhp+E8IcENc2Q5Db85D6l2x8tkamR4SchQoQlWr13VIDL1b59EaIDk6CmGbT9nwpKamtq/K2PcQ9+As7UaDU1sv+TEKFBG34CqJbfeyF8kaCmGbRMzfHiqoDXqfEYfgpg8T2ondYtNTVChIiwiNrHMq1bCJ8kqGmG5Lj6hcL+BjVxEWa9fZgpsH8G9+EnRVECOlYI0QkZjbV1Nfay9u2LEB1YYMUcwoM2pbuw1EZZlZap8e8rTe0ayV0/66cHKAG9b00wVeVwcabCQdcoS8DnEEJ0MpYotaZGioWF8EmCmmZIiLZgNIDTpXDkjHqhCWTH7exLBzTpfcPNJhKirZwss3GsqFKCGiFCgZ6pkaBGCF9k+KkZwkxGusdYAfjhhLp+hL9TupurpyzAJ0RosTS+/9PcVdu5+rlPcThlhpQITRLUNFNyzZoxp8rtQODTs5tKpnULEWIaydS4XAoffnOcXT8Vc+S0ZHNEaJKgppmSY60ePwcy/NQcelAj+z8JERoaWVW41FaNNm+guNLRRp0SomORoKaZtGJhTVsNP8lWCUKEGH0BPh9BTVVtICNBjQhVEtQ0U1KcZ1DTVsNPUlMjRIhpZPippLK69nFVtdc2QgS7JgU1y5YtIz09nfDwcDIyMvjiiy98tt2zZw9Tp04lPT0dg8HA0qVL67XJyclhzJgxxMTEkJiYyJQpU9i/f79Hm4suugiDweBxu+2225rS/RbV3pkaCWqECBHa8JOPTE2JZGqECDyoWbNmDdnZ2SxcuJDt27czfPhwJk2aRGFhodf2FRUV9O3bl0WLFpGcnOy1zebNm5k7dy7btm1j/fr1OBwOLr30UsrLPX9558yZw/Hjx/XbE088EWj3W1zdoCYqwC0PmkoLagpLbdirZaaDEEHPXDP7yUemptQtO1MiQY0IUQGPlSxZsoQ5c+Ywa9YsAJYvX87atWtZsWIFDz74YL32Y8aMYcyYMQBeXwdYt26dx88vv/wyiYmJ5ObmcuGFF+rPR0ZG+gyM2ktyneGnSHPbDD91i7JgCTNir3ZRUFJFatfIxg8SQnRejRQKuwcykqkRoSqgTI3dbic3N5fMzMzaExiNZGZmsnXr1hbrVHFxMQBdu3b1eP71118nISGBIUOGMH/+fCoqfE9btNlslJSUeNxaQ92gpq2GnwwGAyk17y3FwkKEgEbWqfEYfqqQoEaEpoDSCidPnsTpdJKUlOTxfFJSEt9++22LdMjlcnH33XczYcIEhgwZoj9/00030bt3b1JSUti1axcPPPAA+/fv5+233/Z6npycHP7whz+0SJ8aEmkJIyY8jNKqaswmA5awtqu9TomP4MdTFVJXI0QoaGT4yb1QWDI1IlR1uG0S5s6dy+7du/n00089nr/11lv1x0OHDqVHjx5ccsklHDx4kLPOOqveeebPn092drb+c0lJCampqa3S5+TYcEqryogIcLft5pJiYSGC155jxXSPtpKo1e3phcK+ampk+EmIgNIKCQkJmEwmCgoKPJ4vKChokVqXrKwsPvjgAz7++GN69erVYNuMjAwADhw44PV1q9VKbGysx621aENQ/m5m2VJq16qRBfiECCbHiiq56tlPueWVL2ufNDdSUyNBjRCBBTUWi4VRo0axceNG/TmXy8XGjRsZN25ckzuhKApZWVm88847fPTRR/Tp06fRY3bu3AlAjx49mvy+LSWp5i+pyDaa+aSRtWqECE6HT1XgUuDQCbcARqup8VkoLMNPQgScWsjOzmbmzJmMHj2asWPHsnTpUsrLy/XZUDNmzKBnz57k5OQAanHx3r179cdHjx5l586dREdH069fP0Adclq1ahX/+te/iImJIT8/H4C4uDgiIiI4ePAgq1at4vLLL6dbt27s2rWLefPmceGFFzJs2LAW+SKao4eeqZHhJyFE82lBSbndicPpwmwyuhUK+6ipccvUuD8WIpQEHNRMnz6dEydOsGDBAvLz8xkxYgTr1q3Ti4fz8vIwGmsTQMeOHWPkyJH6z4sXL2bx4sVMnDiRTZs2AfD8888D6gJ77lauXMmvf/1rLBYLGzZs0AOo1NRUpk6dykMPPRRo91uFnqlpo+ncGvegRlEUDAZDm76/EKJ11J2enRBtDWidmtKqapwuBZNRrgkitDTp/8JZWVlkZWV5fU0LVDTp6eko2i5rPjT2empqKps3bw6oj23pgv4JJMeGc+k5SY03bkEpNTuEl9udlFRVExdhbtP3F0K0jqJKu/5YD2oCWFEY1MLh+EhLq/VRiI6ow81+6ox6d4ti2+8vafP3jbCY6Bpl4XS5nWNFlRLUCBEk3GtiirQ1Zxrd+8kzqCmulKBGhB7Z0LKTS5FiYSGCjntQowcrWk1NdSW4nB7tFUXRh5/CaoacpFhYhCIJajo5bQhKghohgkext5lMWlAD9YqFKx1Oql3qMH6Pmj90JKgRoUiCmk5O1qoRIvgUVdjrPw4LB2oKf+sMQWnTucOMBnrEqtcECWpEKJKgppPrKdO6hQg6nrOfarI2BoPP/Z+0IuHYCDOxNbV1EtSIUCRBTSfXQ2pqhAg6HoXCbjOhfBULa1skxISH6RMG3BfjEyJUSFDTyckCfCKYLFu2jPT0dMLDw8nIyOCLL75osP0bb7zBwIEDCQ8PZ+jQoXz44Yf12uzbt4+rr76auLg4oqKiGDNmDHl5ea31EVpEcaWPLQ8s3rdK0AKY2HCzHtRIpkaEIglqOjlt+Cm/pIpqp6udeyNE061Zs4bs7GwWLlzI9u3bGT58OJMmTaKwsNBr+y1btnDjjTcye/ZsduzYwZQpU5gyZQq7d+/W2xw8eJDzzz+fgQMHsmnTJnbt2sXDDz9MeHh4W32sgLlcimdQU+Ee1ESr9z6Hn8KIjVBX6pCgRoQiCWo6ue7RVswmAy4FCkpt7d0dIZpsyZIlzJkzh1mzZjF48GCWL19OZGQkK1as8Nr+6aefZvLkydx3330MGjSIxx57jHPPPZfnnntOb/N///d/XH755TzxxBOMHDmSs846i6uvvprExESf/bDZbJSUlHjc2lKZvRqX23qkHsGJj+EnrQYnxmp2G36SoEaEHglqOjmj0aDvEi5DUKKzstvt5ObmkpmZqT9nNBrJzMxk69atXo/ZunWrR3uASZMm6e1dLhdr167l7LPPZtKkSSQmJpKRkcG7777bYF9ycnKIi4vTb6mpqc37cAHyyMwARd6Gn+pM6S6pWaMmNiJMhp9ESJOgJgjIWjWiszt58iROp1PfQ06TlJSkb3BbV35+foPtCwsLKSsrY9GiRUyePJn//ve/XHPNNVx77bUNbrsyf/58iouL9duRI0ea+ekCUzcY8czUeN+pWx9+kpoaEeJkm4Qg0FNfq0aCGiE0LpdaY/aLX/yCefPmATBixAi2bNnC8uXLmThxotfjrFYrVqu1zfpZlxaMRFlMlNudFFc6ajesbaxQOEKCGhHaJFMTBGQGlOjsEhISMJlMFBQUeDxfUFBAcnKy12OSk5MbbJ+QkEBYWBiDBw/2aDNo0KAOPftJC0bSuqlZGXu1iypHzSQAfZ2axqd0S1AjQpEENUGgNqiRVYVF52SxWBg1ahQbN27Un3O5XGzcuJFx48Z5PWbcuHEe7QHWr1+vt7dYLIwZM4b9+/d7tPnuu+/o3bt3C3+ClqMFIylx4Zjq7uPkc/ip/pTukioHLveKYyFCgAw/BQHZ1FIEg+zsbGbOnMno0aMZO3YsS5cupby8nFmzZgEwY8YMevbsSU5ODgC/+93vmDhxIk899RRXXHEFq1ev5quvvuLFF1/Uz3nfffcxffp0LrzwQi6++GLWrVvH+++/z6ZNm9rjI/pFC2DiIy3ERZg5XW6nqNKuTgjwVShcWX9FYUVRZ1LFhpvbrvNCtDMJaoKAbJUggsH06dM5ceIECxYsID8/nxEjRrBu3Tq9GDgvLw+jsTa5PH78eFatWsVDDz3E73//e/r378+7777LkCFD9DbXXHMNy5cvJycnh7vuuosBAwbw1ltvcf7557f55/NXUc3sp7gIM/E1QY0+I8rXlG634adwswlLmBF7tYviCocENSKkSFATBHrUBDUlVdWUVjmIkYuY6KSysrLIysry+pq37Mq0adOYNm1ag+e85ZZbuOWWW1qie21Cy9TEuWVdiuru1G0v8zim1G34STv2RKmN4koHbTshXYj2JTU1QSDaWlsceLxY6mqE6MxK9KAmjPjIOkW/PgqFa4efwmqOlQX4RGiSoCZIpMi0biGCQt2aGqDB4acqhxNbtTo7SsvsyAwoEaokqAkSKS28qvCJUhv/9843fJvftkvECxHqtF25tZoa8JapqZ39pA09GQwQbfHM1EhQI0KNBDVBoqXXqnl643e8/nkeC/61p0XOJ4TwT7HbTKZ6wYm5/uJ72ho10dYwjDVTwCWoEaFKgpogoQ8/nWl+UFPlcPLezmMAfHHoNIdPlTdyhBCipRS7zX6Ki7QA7oXC9YefSuoUCWvHggQ1IvTI7Kcgoa1V8+7OY2z74TT9EqPplxjNWd2jOCsxmoHJsXSNsvh1rvV7C/QLJcBbuT+RfemAVum3EKKW06Xov3vxkV4yNZZo9d5t+Ml9jRpNrNsCfEKEEglqgsT4sxI4q3sUB0+Uk19SRX5JFZ8eOKm/bjIaeHnWGC7o373Rc72Z+xMAA5Ji2F9Qylvbj3J35tl6alsI0TpK3YKQOPfhpwq1zsZbobBWUxMTXns5j615XFxZ+8eJEKFAgpog0T3GysZ7LqK40sGBwjIOFpZx4EQZBwrL2HushPySKpas/47z+yWoG+P5kF9cxf++PwHA0zeOYNryrRwtqmTrD6eY0C+hrT6OECFJy8hEWkyYTUbfU7qdNnBWgynMY4dujQw/iVAlQU2QiYswM6p3F0b17qI/V1haxfmPf8yOvCK2/XCacWd183n82zt+wqXAmPQuDEyO5erhKbz+eR5vfHVEghohWpn7wnvu90V1C4VBHYIyxdVbo8b9OAlqRKiRQuEQkBgTzvWjewHw100HfLZTFEUfepo2Sl2H9LpR6nHr9uTL+LwQrcx9iwRAn9JdUlmzOWWYFQw1l+2aIaiGMjWy+J4INRLUhIjfXngWJqOB/31/km9+KvbaZseRIn44UU6E2cTlw3oAMCI1nn6J0VQ5XHy463hbdlmIkFM3U6MV/LpqNqfEYHArFlaDmtotEtwyNXWHrYQIERLUhIjUrpFcVROoPL/Ze7bmja/ULM1lQ5KJtqoXSIPBoGdr3qjJ4gghWkfdoCbcbCLcrF6m668qrM6A8jb7yX34SVGUVu+3EB2FBDUh5PaL+gHw7935HDzhuSFelcPJB1+ra9NoQYzmmpE9MRog9/AZfqhznBCi5dQNatwfF9ddq8ahDT/5XqfG6VIotztbtc9CdCQS1ISQAckxZA5KRFHghc0HPV77z558Sm3V9IyP4Ly+noXESbHhTDxbnQr+pmRrhGg1tfs+1QYo8RE1C/DpmRrPnbq1TI37lO4IswmzyeDxuhChQIKaEKNla97ZcZTjxbWrD2vBytRRvbyuR3NdTeHw29uP4nRJOluI1lBcEUCmxl6npsbtGIPBoGdupK5GhJImBTXLli0jPT2d8PBwMjIy+OKLL3y23bNnD1OnTiU9PR2DwcDSpUubdM6qqirmzp1Lt27diI6OZurUqRQUFDSl+yFtVO8uZPTpisOp8NInhwB1vyhtob7rzu3l9bjMwYnERZjrLeonhGg53oafYvVp3TUL8OmbWvqe/eR+DglqRCgJOKhZs2YN2dnZLFy4kO3btzN8+HAmTZpEYWGh1/YVFRX07duXRYsWkZyc3ORzzps3j/fff5833niDzZs3c+zYMa699tpAuy+AOy5WszX/+CKP0+V23tlxFEWBjD5dSesW6fUYa5iJX4xIAWQISghfirSVf5uo2EvRb70F+HwUCrsPP7mfQ4IaEUoCDmqWLFnCnDlzmDVrFoMHD2b58uVERkayYsUKr+3HjBnDk08+yQ033IDVam3SOYuLi/n73//OkiVL+NnPfsaoUaNYuXIlW7ZsYdu2bV7PabPZKCkp8bgJ1YX9EzgnJZZKh5OXPzukByl1C4Tr0tau+c+efL8vlPZqF2t3HeeXf/ucoQv/w9vbJSASweenMxVMfPJjJj65qVnDs0V6TU3tPm21WyXUWVXYUUG106UXArsHQh7HSVAjQkhAQY3dbic3N5fMzMzaExiNZGZmsnXr1iZ1wJ9z5ubm4nA4PNoMHDiQtLQ0n++bk5NDXFycfktNTW1S/4KRwWDgjpramuWbf+DQyXIiLSYuH9qjweOG9IxlQFIM9moX79fMlPIl71QFj6/7lvGLNjJ31XY+PXCSUls1977xdaPHCtHZJMeGc6rMTnGlg33Hm/4HVImX4af4ejU1NUGNrYwyW+3eTnUzNbIAnwhFAW2TcPLkSZxOJ0lJSR7PJyUl8e233zapA/6cMz8/H4vFQnx8fL02+fn5Xs87f/58srOz9Z9LSkoksHEzeUgyfROi+OGkmsK+bEgPoqwN/+dgMBiYNroXf1y7j39+dYSRafFUOVzYqp3Yau6LKx18sOs4//u+tu6me4yV60f3oqDExpu5P3H3mp2YTUYmD/E+HClEZxNmMpLRpysbvy1k68FTDOkZ16TzeJ3SXXf4KbJmdmLFKUpqNqzU9opyJ5kaEYqCdu8nq9Xqc7hLqLt2/3ZiXx546xsApo1ueOhJ84sRPcn597fs+qmYK575tMG2F/RP4OaMNC4ZlITZZMTlUnC5FN7ecZQ7/7GdF381mosHJjb7swjREYw7q5sa1PxwijkX9g34eIfTpWdevM1+0qd0R9X8zpQV6EXCdbM07sdJUCNCSUBBTUJCAiaTqd6so4KCAp9FwC1xzuTkZOx2O0VFRR7Zmua8r4BrRvbiva+PEWE2MTa9q1/HdI+x8psL+rDmyyNYTEasZiPhYSaP++G94rlhTFq9omOj0cAT1w3D5lTrbH77Wi4rfz1GNsoUQUFb3+mLQ6epdroIMwVWsug+TOSx5UHd4CRaXTOK8hM+Zz55PU6IEBBQUGOxWBg1ahQbN25kypQpALhcLjZu3EhWVlaTOuDPOUeNGoXZbGbjxo1MnToVgP3795OXl8e4ceOa9L4CLGFGXv/NeQEfN/+yQcy/bFCT3jPMZGTp9BHYq12s31vA7Fe+5NVbMhjbx7+gSoiOanCPWOIizBRXOvjmaDEj07oEdLwWfMRYwzwCIq1ouDaoqRmqLyvQh5/qFgmD1NSI0BTw7Kfs7GxeeuklXnnlFfbt28ftt99OeXk5s2bNAmDGjBnMnz9fb2+329m5cyc7d+7Ebrdz9OhRdu7cyYEDB/w+Z1xcHLNnzyY7O5uPP/6Y3NxcZs2axbhx4zjvvMD/pyzal9lk5LmbRjLx7O5UOVzMWvkFX/54OqBzVNqdFJZWtVIPhQic0WjgvL5qcL7l4KmAj/c2nRu8ZFz04Sf3TE39v09jI8I8jxMiBARcUzN9+nROnDjBggULyM/PZ8SIEaxbt04v9M3Ly8NorI2Vjh07xsiRI/WfFy9ezOLFi5k4cSKbNm3y65wAf/nLXzAajUydOhWbzcakSZP461//2tTPLdqZNczEC78axS0vf8mWg6eYtnwrSbFWhvWKZ0RqPMN7xTO0VxxxEWbs1S6+zS9h10/F7PqpiF0/FfNdQSkuBXp3i+T8fglc0D+BcX0T9KLK9lJhr+aHE+UcPKHOTDFgwGAAA9TcGzAaDURbw4iPNBMXYdbvI8wmDAYDiqJQ5XBRbq+mwuZU7+3qX+RGg4EwoxGjEcKMRtQ/6A1UOZxU2J1U2KvdHjsxGNQl8yPMJiIstfeWMCOny+0UltgoKKmioMRGQWkVhSVVFFU4cDhdOJwK1S4X1U4Fh9NFtUsh2hpG9xgriTFWEmPCSYxVH3ePCWdQjxh6d4tqz6+/3Y3r243/7Clg2w+nmFuzHpS/vBUJu/9cZqvG4XRhjq4JauyllJepM61ivAw/yTo1IhQ1qVA4KyvL53CTFqho0tPT/doltqFzAoSHh7Ns2TKWLVsWUF9FxxVuNvG3maO5e/VONuwroKDExvq9BazfW1tf1TM+ghOlNuxOV73jDQY4fKqCw6fyeP3zPIwGGNorngv6JTCkZxw94sLpERdOt2grpjpbP5wut7P7aDHfHC1m99Fidh8rptLupFeXSNK6ut26RdKrSwRGg4EKu7Ne8HC63MHBE2UcKFRvR4sq6/XTXxaTEUuYkXJ7NR11Y+UKu5PCUht7vLx2d2Z/7s48u8371JGMr6kP+/LH09irXVjC/E+Ge9v3CTyzMCWVDrpFxUBYOFRX4SpVFyjVsjLuajM81fVeEyJYBe3sJ9E5RFrCeHHGaCrs1ew5VsLXR4r4+qdivj5SRN7pCj1IiIswM6xXnJ7BGd4rniiric9/OM2nB07y6YGTHCgsU48/UuTxHmFGA0mx4STHhRMTHsb3Bb6Dj5NldnbWOT5QXaMsnNU9ii6RFhSoCVAUFAUU1J2TS6scFFU6KK5wUFzpoNqlYHe66gVvEWYTUVY1u2I0GKh2KrgUBaer5qao540wm4i0eGZjIi0mAI9grNLhpNLuxFbtokukmaTYcJJi1YxLUoz6uEukGXOYkTCjAbPJSJip5t5ooKSymsLSKk6U2igstVFYWkVhiY0TZTb6JIR2lgagf2I0CdEW/b+jQGrFfGVqwkxGYqxhlNqqKap00C3aCtGJUJSHUlYIRDdYKFxS6UBRFAyG+nu6CRFsJKgRHUKkJYwx6V0Z4zYL63S5nf35paTEh5PWNdLrRTlzcBKZg9VhyuPFlXx24BRbDpzk0Kly8ourKCipotqlcLSosl4g0ychiiE94xiSEsvQnnHERpj56UwFeacrOHxKvT9yuoKfzlTWDuNYTERawvTHMeFh9E2Ipl9i7a1rlKVePxuiKArldidFFXYcToUoi4lIq/oedTNMHUPT1mAJBQaDgYy+3Vi76zhbD54KLKjxspmlJi7STKmt2rOupigPU/kJINrr8JN2HrvTRZXDRURNkCtEMJOgRnRYXaMsjDurm9/te8RFcN2oXh7bPVQ7XZwss3O8uJL84irOVDjo2z2KwSmxXv+69bZoWmv/lWswqDU20Y0sfig6h/FnqUHNloMn+V1mf7+P0zM1XurC4iLM/HSm0m0GlFpXE1Z1Aujjdfgp2hqGyWjA6VIornRIUCNCglxFRVALMxlJjlOHnppK0vYiEONq1qvZkVdElcNJuNm/YKLIx/ATuG1qWeEZ1ITb1JW7vQXoBoOB2PAwztQMcTbnd0CIziLgKd1CCCF865MQRVKsFbvTxfbDZ/w+zldNjftzdad1R9jVpRC8rVPjfpw29VuIYCdBjRBCtCCDwcD4s9RZUIGsV9NwUKPWaRXVydTEONTze9smAdymdVdIUCNCgwQ1QgjRwrQhqK0/BBDU1AQe8RH1C83rb5WgBjWxriL13svwk9fjhAhyEtQIIUQL0wrcvz5SRLnNv3ViGsrUaDU1RZV29YmarRK6KurwlrdCYfV5CWpEaJGgRgghWlhq10h6xkdQ7VL83gLEn5oafR+nKHVTywSKAcnUCKGRoEYIIVrB+LP8H4KyVasLI0LDQU1tTY2aqYky2Ig32bH6WLlYghoRaiSoEUKIVqANQW31o1hYCzoMBu9Fv/F1gxNrNK6wCAB6h5f5XHZAduoWoUaCGiGEaAVaULP7aHGjU6q1oCM23IzRyyrS3mpj7OHqDKs0S5nP80qmRoQaCWqEEKIV9IiLoE9CFC4Fvvih4bqahuppwL1QuDY4qbKqQU1KWInP80pQI0KNBDVCCNFKzquZ2t3YejWNBTX6Pk7VLqpqam8qzOq+Uj3CSn2eVysglsX3RKiQoEYIIVrJOD+LhbUC4Hgv+z5B7T5O7m1Lw9SgJtFQ7PO8kqkRoUaCGiGEaCXaInz7jpdwutzus50WdPja7sBgMNQLUIqM8QB0Q4IaITQS1AghRCvpHmOlf2I0AJ83kK1pbPgJamdAFVWowdFpQ7z6vMv3/lLa+aocLmzVTv87LkQnJUGNEEK0In+GoPwJaurOgDqpxKvHOH0HNTHhYWizvSVbI0KBBDVCiA5j2bJlpKenEx4eTkZGBl988UWD7d944w0GDhxIeHg4Q4cO5cMPP/TZ9rbbbsNgMLB06dIW7nXDxvZRa192Hiny2aZ23yffQU3doaR8VywAUdW+Z1YZjQZirOq6N7JWjQgFEtQIITqENWvWkJ2dzcKFC9m+fTvDhw9n0qRJFBYWem2/ZcsWbrzxRmbPns2OHTuYMmUKU6ZMYffu3fXavvPOO2zbto2UlJTW/hj1DOsZD6h1Nb6GgPwafor0DGqOVatBTYT9FCiKz+PiIqWuRoQOCWqEEB3CkiVLmDNnDrNmzWLw4MEsX76cyMhIVqxY4bX9008/zeTJk7nvvvsYNGgQjz32GOeeey7PPfecR7ujR49y55138vrrr2M2+w4aWktq1wjiIsw4nArf5XtfKM+foKZupuYnh1qrE+asArsswCcESFAjhOgA7HY7ubm5ZGZm6s8ZjUYyMzPZunWr12O2bt3q0R5g0qRJHu1dLhe/+tWvuO+++zjnnHP86ovNZqOkpMTj1hwGg4GhPeMA+Oao95lKgRUK19TU2MIoU8LVF8u8Z7Pcz1lS6d9u4UJ0ZhLUCCHa3cmTJ3E6nSQlJXk8n5SURH5+vtdj8vPzG23/+OOPExYWxl133eV3X3JycoiLi9NvqampAXwS74boQU2R19e1lYLjfKxTA/ULhUsqHZxU1PM2FNRoC/BJpkaEAglqhBBBKTc3l6effpqXX37Z54aP3syfP5/i4mL9duTIkWb3ZVivFsjURFoANQBSFIWSKgcn0IKaAp/HyfCTCCUS1Agh2l1CQgImk4mCAs//ORcUFJCcnOz1mOTk5Abb/+9//6OwsJC0tDTCwsIICwvj8OHD3HPPPaSnp/vsi9VqJTY21uPWXNrw0/780nrFwlUOJ/ZqF+B/TU2Vw4XDqdRmaspP+HWcEMFOghohRLuzWCyMGjWKjRs36s+5XC42btzIuHHjvB4zbtw4j/YA69ev19v/6le/YteuXezcuVO/paSkcN999/Gf//yn9T6MF726RBAfqRYL78/33KtJCzZMRgPRNdOvvdFnP1XYKa3Zy+kk8eqLDWRqvO3wLUSw8v0bJIQQbSg7O5uZM2cyevRoxo4dy9KlSykvL2fWrFkAzJgxg549e5KTkwPA7373OyZOnMhTTz3FFVdcwerVq/nqq6948cUXAejWrRvdunXzeA+z2UxycjIDBgxo08+mFQv/7/uT7PqpmGG94vXXtMLfuAhzg8Nk7hkXbYPKUlMX9UU/CoUlqBGhQIIaIUSHMH36dE6cOMGCBQvIz89nxIgRrFu3Ti8GzsvLw2isTS6PHz+eVatW8dBDD/H73/+e/v378+677zJkyJD2+ggN0oKa3XXqavypp3F/vbjSoR9TZukGdmT4SYgaEtQIITqMrKwssrKyvL62adOmes9NmzaNadOm+X3+H3/8sYk9az6tWHjXT96DGl+bWWq04MSlwLGiKgBsWlDjR6GwrCgsQoHU1AghRBsYWjPk9F1BKVWO2mJhfzM14WYT1jD1kn3kTAUA9vAE9cWyxjM1EtSIUCBBjRBCtIGUuHC6Rlmodil861YsrO263dC+TxqtWPjIaTWoqY7orr5QVuBzqwQpFBahpElBTUtvOmcwGLzennzySb1Nenp6vdcXLVrUlO4LIUSb81hZ+Kci/fkSPzM17m2OnK4EQIlOVF9w2sDmfeVj7ZhyuxOH09WkvgvRWQQc1LTGpnPHjx/3uK1YsQKDwcDUqVM9zvXoo496tLvzzjsD7b4QQrQbb9sl+Dv8BBAfoS7Apw0/RUZGg7VmHR0fM6Biw2tLJ2UISgS7gIOa1th0Ljk52eP2r3/9i4svvpi+fft6nCsmJsajXVRUVKDdF0KIdjPUS7FwUQBBjTaUdPRMZc3PYRClDUF5D2rCTEZ9/RsZghLBLqCgprU2nXNXUFDA2rVrmT17dr3XFi1aRLdu3Rg5ciRPPvkk1dW+N2hr6U3phBCiubQZUN8XlunFwsV+7Puk0Wpqql1q/UxMuBmia/a/kq0ShAgsqGmtTefcvfLKK8TExHDttdd6PH/XXXexevVqPv74Y37729/y5z//mfvvv99nX1tjUzohhGiO5NhwEqItOF0Ke4+rf2gFMvxUt01seBhE12RqGlirRoqFRajocOvUrFixgptvvpnw8HCP57Ozs/XHw4YNw2Kx8Nvf/pacnBysVmu988yfP9/jmJKSEglshBDtSisW/nj/CXYfLebctC7NC2oi3DM1Da0qLMNPIjQElKlpjU3n3P3vf/9j//79/OY3v2m0LxkZGVRXV/tcTKs1NqUTQojm0oqFtbqa4ooACoXrDFHFhIdBVM0MKFmAT4jAgprW2HTO3d///ndGjRrF8OHDG+3Lzp07MRqNJCYmBvIRhBCiXWmL8H3zUzGKoujZk7oBizf1h5/M/g0/hdcENVW+6xCFCAYBDz+19KZzmpKSEt544w2eeuqpeu+5detWPv/8cy6++GJiYmLYunUr8+bN45e//CVdunRpyucWQoh2UVssXMqpcrte9NuU4ae4CCkUFsJdwEFNa206t3r1ahRF4cYbb6z3nlarldWrV/PII49gs9no06cP8+bN86iZEUKIziApNpzuMVZOlNrYevAUAGaTgQizqdFjvWZq9OEnPza1rJCgRgS3JhUKt8amc7feeiu33nqr19fOPfdctm3bFnA/hRCiIxrWM46N3xby6fcnATXoMBgMjR4XH2nx+Dk6PAy0VYXLC9WtErycR5suLpkaEexk7ychhGhjQ2qKhT89UBvU+MO9XbQ1DJPRULv4ntMOVUVej+serc4Q/fFUeRN7LETnIEGNEEK0Ma2u5miRujKwv0GN+5YH+mNzOISr5/M1rXtsn64YDPBtfikFJVVN7LUQHZ8ENR3RqYPw9m+hcF9790QI0Qq0ad0af4OaMJORmJotD2LC3Y7R62q8BzXdoq36e37yne/aGyE6OwlqOqLtr8Ku1fDFi423FUJ0Oomx4STF1i4a6m9QA7X1MbERbiWR7nU1PlzYXx2m+qSmjkeIYCRBTUdUcky9Lz7avv0QQrSaoT3j9cd1C4AbogVAse6ZmuiGMzUAF56tBjWffn8CZ800ciGCjQQ1HVHp8Zr7Y+3bDyFEq3EfgooNJFOjBTUR/g8/AYxMiyfGGsaZCgffHC322U6IzkyCmo5IW0SrRIIaIYKVViwMgQ0/aSsPx4R7GX5qIKgxm4yM79cNkLoaEbwkqOmISmt2MK84BQ6ZqSBEMBrSs2lBTZeaoar4CC/DTw3U1EDtEJQENSJYSVDT2lzOwDIu9nKwldT+rA1FCSGCSvcYKz3iwoE6AUojbs7ozZXDenDtub1qn/RjqwSoLRbecaRIFuITQUmCmtb2wTxYMgh++sq/9lqWRiNDUEIErbsu6c8F/RPI6NvV72MGp8Ty3E3nkp4QVfuktgBfA1slAKR2jaRv9yicLoUtB2QWlAg+EtS0Ni2YOZrrX/u6QY1kaoQIWjeOTeP/zc7wXHOmKbRMTXkhuFwNNq2d2i1DUCL4SFDT2kpqpmUX/+Rf+7pBTIlM6xZCNELL1LiqfW6VoJk4QKurOYmiyNRuEVwkqGlN9vLaC4y/w0j1hp8kUyOEaESYBcLj1ccNzIACOK9PNyxhRo4WVXLwRFnr902INiRBTWtyD0j8zbiU1QQ1YRGBHSeECG1+FgtHWEyMTVdreDZ/J3U1IrhIUNOaStyGnPwNTrRMTY/hNcdJobAQwg/6tO7Ga2UmytRuEaQkqGlN7gFJyfFGC/iA2qCm57k1P8vwkxDCD/oCfA1naqB2vZptP5yiyuFszV4J0aYkqGlN7tkZl8Ovv6Bqg5pRtT+75KIjhGiEH1slaM5OiiY5NhxbtYsvDp1u5Y4J0XYkqGlNdYeOSvyYAaUFNclDwWACxenXRUoIEeL82CpBYzAYuPDsBECGoERwkaCmNdULahqpj7GVgr1UfRybAjE9/DtOCCH83CpBo2+ZIOvViCAiQU1rKq4ZfrLEeP7sS2nNWLglGqwxamADMgNKCNE4P2c/ac7vl4DRAN8VlHGsqLIVOyZE25GgpjVpwUivmvqYxoaftOncMcnqfWxNpkaKhYUQjfFzqwRNfKSF4anxAPxPsjUiSEhQ01oclVBZU4DXa4x639gwklZPE60FNT1rjpNMjRCiEe5Tuv2ZaYnblgmyXo0IEhLUtBYtgDFHQtI56uNGh59qMjJapkZqaoQQ/tIyNYoz4Lqa/31/gmqnf4GQEB2ZBDWtRcuuxKZAbK+a5/zM1OjDT1pNjQw/CSEaYTJD0hD18ffr/TpkeK844iLMlFRVc+NL23hi3bds2FvA6XJ7K3ZUiNYT1t4dCFpaABPbszY4KT2mrjljNHk/Rg9qetQeCzL8JITwzznXQMFu2P0mnPurRpuHmYxcM7InL2/5kS9/PMOXP57RX0vvFsm5aV24YWwaY/t0bc1eC9FiJFPTWvRMTU8182IwqTvoNrQAX71MjVuhsOymK4RozJCp6v2hT/xe32rhVYP577wLWXTtUK4f3Yt+idEA/Hiqgrd3HOWXf/ucH2TjS9FJSKamteiZmhQ1MxOTrAY6xUdrg5a6fNXUVFdB5RmIlL+WhBAN6NpHXY38aC7s/ReMndPoIQaDgbOTYjg7KYYbxqYBUFzhYMeRMzz30QG+OnyGBf/aw/+bPRaDwdDan0CIZpFMTWtxD2rAv6EkbX0JLZgJs0JkQuPHCSGERsvWfPNmk08RF2nmogGJLJ42HEuYkU8PnOT9XVLbJzo+CWpaS3HNmjRaMNPYQnq2UrDXpHi1RbQ8jpMLihDCD+dcAxjgyDYoOtKsU6UnRDH3on4APPbBXkqqHC3QQSFajwQ1rUXL1MTVBDVxNTOgin0swKfV01hiwBpd+7wUCwshAhGbAr0nqI/3vNPs0912UV/6JERxotTGkv9+1+zzCdGaJKhpDY4qqKhZzKpepsbHtO66RcIaWVVYCBGoIdeq97ubPgSlsYaZeOwX6lTxV7f+yO6jxc0+pxCtRYKa1qAFIGHhENFFfdxYxsVnUCP7PwkhAjR4ijrj8vjXcPJAs093fv8ErhqegkuB/3vnG5wumY0pOqYmBTXLli0jPT2d8PBwMjIy+OKLLxps/8YbbzBw4EDCw8MZOnQoH374ocfrv/71rzEYDB63yZMne7Q5ffo0N998M7GxscTHxzN79mzKylphmqGiwOEtUNWMv0bcF97TZgvoQY2vTE2dmU+axo4TIoi05LXF4XDwwAMPMHToUKKiokhJSWHGjBkcOxYCv0tR3eCsi9XHe95ukVM+fMUgYqxhfP1TMau+yPPa5otDp5n98pdc9/wWDp0sb5H3FSIQAQc1a9asITs7m4ULF7J9+3aGDx/OpEmTKCz0vibCli1buPHGG5k9ezY7duxgypQpTJkyhd27d3u0mzx5MsePH9dv//jHPzxev/nmm9mzZw/r16/ngw8+4JNPPuHWW28NtPuNe3MWrLwMdv6j8ba+uC+8p4lzC05czvrH+MrU6FslyPCTCG4tfW2pqKhg+/btPPzww2zfvp23336b/fv3c/XVV7flx2o/7rOgWmCdq8TYcO6dNACAJ9Z9S2FpFQCKovDx/kKmLd/C9S9sZeO3hXx1+AzX/PUztv1wqtnvW1haxakyW7PPI0KDQVEC+689IyODMWPG8NxzzwHgcrlITU3lzjvv5MEHH6zXfvr06ZSXl/PBBx/oz5133nmMGDGC5cuXA2qmpqioiHfffdfre+7bt4/Bgwfz5ZdfMnr0aADWrVvH5Zdfzk8//URKSkq9Y2w2GzZb7S9CSUkJqampFBcXExsb6/sDfvESfHgvdOsPWV/WZloC8elfYMMjMOwGuPYF9TmXEx7rru7Lkv1tba2M5s1bYPdbMOnPMG5u7fMnvoNlY8AaB/O9/3UkRGdRUlJCXFyc19/D1ri21PXll18yduxYDh8+TFpamtc2Tb52dDRVxfBkf3Da4LbPIHlIs0/pdClMWfYZ3xwt5hcjUph0TjLLPj7AnmMlAFhMRq4b3Yu9x0rYeaQIs8nAn64ZyvWjU5v0flsOnmTWyi+xhhl5d+4E+naPbvwgEXQaum7UFVCmxm63k5ubS2ZmZu0JjEYyMzPZunWr12O2bt3q0R5g0qRJ9dpv2rSJxMREBgwYwO23386pU6c8zhEfH68HNACZmZkYjUY+//xzr++bk5NDXFycfktN9fOXavgN6gykU9/DD5v8O6auumvUQM0CfFrWxUt9TGOFwrZisMmqniI4tea1xV1xcTEGg4H4+HifbZp87ehowuOg/8/Vxy1QMAxgMhr40zVDMBjgXzuPccfr29lzrIRIi4k5F/Thfw9czJ+vGcrqW8/jimE9cDgV7n9zF4v+/S2uAOtwduSd4TevfIWt2kVJVTW//X+5lNuqW+RziOAVUFBz8uRJnE4nSUlJHs8nJSWRn5/v9Zj8/PxG20+ePJlXX32VjRs38vjjj7N582Yuu+wynE6nfo7ExESPc4SFhdG1a1ef7zt//nyKi4v125Ejfq7XYI1RAxuAL//m3zF1eQtqwG0IyltQUzO8FF0nqLHGgDXWs40QQaa1ri3uqqqqeOCBB7jxxhsb/GuvydeOjkgbgtr9VotttTKsVzwzx6UDEBdh5neX9OezB37G/10xmKTYcADCzSaevWEkd/5MXeNm+eaD3P56LhV2/4KSfcdL+PXKL6mwOzmvb1cSY6x8X1jG/W/uIsDBBRFiOsQ2CTfccIP+eOjQoQwbNoyzzjqLTZs2cckllzTpnFarFavV2rQOjfkNfPkS7P9QXbwqPsC/1LS1aLS1aTRakFNcJ6hRFCjVVhP2soVCbAqcKFGDoYT+gfVFCIHD4eD6669HURSef/75Bts269rR0Zw9GcxRUJSnbp3Qa3Tjx/jh4SsHM+mcZIb2iiPa6v1/I0ajgXsuHUDf7lE88OY3/GdPAdNf2MYLvxpFSnyEz3MfOlnOr/7+BcWVDs5Ni2fFr8ew73gJN7y4jbXfHGf4/+K49cKzWuRziOATUKYmISEBk8lEQUGBx/MFBQUkJ3vfzyg5OTmg9gB9+/YlISGBAwcO6OeoWyxYXV3N6dOnGzxPkyUOhPQLQHFB7srAj/eVqfE1rdtWCo6amQLeghopFhZBrjWvLVpAc/jwYdavX9+56mKayxIJAy9XHzdj24S6TEYD487q5jOgcXfNyF68PieDrlEWvjlazEVPbuLBt3Zx0MsmmUeLKvnl3z7nZJmNwT1iWTlrLJGWMEb17sqCKwcDsOjf37LlwMkW+ywiuAQU1FgsFkaNGsXGjRv151wuFxs3bmTcuHFejxk3bpxHe4D169f7bA/w008/cerUKXr06KGfo6ioiNzcXL3NRx99hMvlIiMjI5CP4D9tI7jcV6A6gMr7ajuU1wRg7rOf3H+uG9Ro9TTWWLBE1T+nrCosglxrXVu0gOb7779nw4YNdOvWrXU+QEemDUHtecf7zMs2MCa9K+/eMYHRvbtgd7pY/eURMpdsZs6rX5F7+DQAJ0pt/PJvn3O0qJK+3aN4dfZY4iLM+jl+eV5vpp7bC5cCWf/YwdGiyib1xVbtDLi+R3QeAQ8/ZWdnM3PmTEaPHs3YsWNZunQp5eXlzJo1C4AZM2bQs2dPcnJyAPjd737HxIkTeeqpp7jiiitYvXo1X331FS+++CIAZWVl/OEPf2Dq1KkkJydz8OBB7r//fvr168ekSZMAGDRoEJMnT2bOnDksX74ch8NBVlYWN9xwg9eZTy1iwBUQkwKlx9Tdbodd799xWt2LyQKRdS6gWk1N3eEnX2vUaLRiYVmrRgSxlr62OBwOrrvuOrZv384HH3yA0+nU6226du2KxWJpnw/a1s66RC0aLstX1+Dqc0G7dCOtWyRv3j6er348zfLNP7BhXwHr96q30b27UFpVzaGT5fSMj+C12RkkRHsOARoMapHyt/kl7DlWwu2v5fLP344j3GzyaGevdrHveAnfF5aRX1zJ8eIq/ZZfXMmZCgdmk4HkuHB6xEWQEhdOSnwEPeLVx8lx4STHhtM1yiK7kndCAQc106dP58SJEyxYsID8/HxGjBjBunXr9IK9vLw8jMbaBND48eNZtWoVDz30EL///e/p378/7777LkOGqNMLTSYTu3bt4pVXXqGoqIiUlBQuvfRSHnvsMY9x7ddff52srCwuueQSjEYjU6dO5Zlnnmnu5/fNFAajZ8HHf1ILhv0NarwtvKfxtZBeWQP1NNq5QAqFRVBr6WvL0aNHee+99wAYMWKEx3t9/PHHXHTRRW3yudpdmAUGXQ07/h9880a7BTWa0eld+Vt6Vw4UlvLSJ4d4Z8dRvjp8BoDuMVZe/02Gz5qbcLOJ5b8cxdXPfcqun4pZ8K/d3Pmz/uw4UsTOvCJ2HDnDnmMl2KtdDfbB4VQ4crqSI6d9Z3ssJiOJsVaSY8NJigsnNjyMaqeCU1FwuRSqXQouRcHlgjCTAUuYEWuYEWuYCUuYEYvJiCXMSJjJgNloxGQ0YDYZCDOpj2PDw+gWbSUh2kq3aAsx1rB6QZS92kVRhZ0zFQ6KKuy4FOgeYyEh2kpchLnJQZeiKFQ5XCgomE1GwowGr+fS2pXZqqmwV1Nuc+JwujAZDfrNaDAQVvPY4XRhq3ZR5XBiq1Yf2xxOql0KERYTUZYwoqzqfWTNfYTZhNHYcsFjwOvUdFaBzHPXlRbAX84BlwN++z/oMazxY755E96aDb3Ph1lr63TiOCwZqC5f/vAJdZo3wGdPw/oFMGw6XPti/XN+9x9YdT30GA6//cS/vgvRATXp97CddcY+1/PDZnj1anWI+579aq1NB1FQUsXKz35kz7FiHrpiMAOSYxo95n/fn2Dmii/wNYoUH2lmcI9YesZH0CMunOQ49b5HfDhJMeFUOpwcK6rkWHEVx4oqOe72uKCkipNl9hb+lI2zmIx0i7YQG26mzFbNmQo7FXbfw4Va+4RoKwnRFkxGoxpkKQpOV+19tVOhwu5UgxK7k0q7k3J7tcdkOIMBzCY1EDObDJiMRqoc9du1BoMB9v5hMhEWk882gfwOdojZTx1WTBIMvlqdDvnlS3D1s40f456pqSs6EYxh4KpWszN6BqampiY6qf4xIIXCQojmSb8A4ntD0WF1OH3Eje3dI11SbDgPXjYwoGMu6N+dBy8byJ8//BazycDgHrGMSI1nRFo8I1K7kN4tssEsRhdocAaWvdpFYWkVBSVV5BfbOF5cSYXdqWcnwmoyFCajAaPRQHVNhsJe7cJW7cRe89judOFwqsGFw+mquVeodrkoqXRwqtzOqTI7ZbZq7E6XPkzmzmiA+EgL8RFmMMDJUhslVb7bN4WioPfZl0iLiUhLGNYwoxos1QRO1U4XLgWqXS7MRiNWswlrmJFws5q1sprVTJAaWDkpt1Wr924BU7i55bahlKCmMWPmqEHNrjfg54/WblDpi6+ZT1C7AF/xEbWupm5QE9Oj/jFQO2xVXqgWIoeFSC2AEKJlGI1w7q/goz/C9lc7VFDTVLdeeBZXDEuhW5SlXl1Nc1nCjPTqEkmvLm2T0apyOGsCHBvFlQ5iws10iTQTH2EhJjys3vCM1v5kqY2TZerNpYDJoAZZRgMeQ0OR1jCiLCZ9CCjSqgYoRgM4qhVsTicOp4Kj2oWjJhBT25qIsrb8EBGAy6VQVe2k3OZs0dolCWoak3YeJJ4DhXtg5yrPLQy80TM1Pb2/HpuiBjUlR4Ex6nO+VhPWRHYFk1Vd7rz0OHTpHfDHEEKEuBE3w8d/hrwtcPL7oFjzqmcD2ZbOJNxsomd8hN+fJ9D2DbIAmBtr1eKMRgORljAiLS0bhrRczidYGQww9jfq4y//Bq6GC9D0mU1xvoIaL9Oz9dlPPjI1BkPtDCgpFhZCNEVsCvS/VH28/dX27YsQrUSCGn8MvV4tsDv9A/zwUcNtGxp+As/duqFmNWEtU+OjpgZkrRohRPOdO0O9//of6lC2EEFGghp/WKNhxE3q4y8a2A/K6aidnu1z+Elbq6ZmKwVbCVTXTCusu++TuxhZq0YI0Uz9L1UnJJSfgO/WtXdvhGhxEtT4a0zNENR36+ovnqcpzQcUMJohMsF7m7oZFy1LEx7X8DRLLfMjM6CEEE1lMtf+gSZDUCIISVDjr4T+kHoeoMC+97230YuEe6izDbypuwCfr925fR4nw09CiGYY+Sv1/sCG2oyxEEFCgppAnDNFvd/7L++v60FNL++vQ21NTelxcFY3vDu3OykUFkK0hG5nqevWoKgzOoUIIhLUBGLQVep93tbaYSN3jRUJA0R1VxfgU1xq/U1jM580vrZYEEKIQGkFw9v/X+MzOoXoRCSoCURcL+g1Bp9DUP4ENUaTulEmqJmdxtao0cS4ZWrkIiSEaI5BV6l1fMV5cGhTe/dGiBYjQU2gBk9R770NQTW28J4m1j2oaWSHbk10EhiM6hYL5Sf87q4QQtRjjlD3mgMpGBZBRYKaQA2+Wr0//BmUFXq+1tjCexrt9eKjje/QrTGF1RYTS7GwEKK5tCGofR9A+an27YsQLUSCmkDFp0HKuWpNTN0hKH+Gn9xfLznmf00NSLGwEKLlJA+FlJHgcsCu1e3dGyFahAQ1TaHPgnq39jlnNZTV1Mc0OvxUMzuq5Cf/a2rAMxgSQojm0guGX0XfMlmITkyCmqYYVDME9eOnUH5SfVxWoGZvjGHqDKeGaMNPhfugumbb+MbWqQHPAmMhhGiuIdeBORJOfAtf/b29eyNEs0lQ0xRd+0CP4WoQ8+0H6nNaoBGTos5waoiWcTn5nXofHg/m8MbfV1YVFkK0pPBYGDNbfbz2HvggW/aEEp2aBDVNpc2C2vOueq/PfGqkngbqL87nTz0NyKrCQoiWl/ko/OwhwKBma165qnZRUCE6GQlqmmrwL9T7Q59AxWn/i4ShZgE+c+3PDe3O7U4KhYUQLc1ohAvvg5v+CdY4OLINXpwIR75s754JETAJapqq21mQNBQUJ3y7NrCgxmisDVAggEyNW6GwFPUJIVrS2ZfCrR9D94HqH04rL4Pcl9u7V0IERIKa5jinJluz913/F97TuLfzZ+YT1BYKOyqgqsi/Y4QQwl/dzoLfbFAnQ7gc8P7v4B83wa5/qhlpITo4CWqaQ6ur+WETFOxVHze28J7GI6jxM1NjDofIBPVx/jf+HSOEEIGwxsD1r8LPHgYMsH8tvD0HnjwL/n4pfLIY8ndLtlh0SBLUNEdCf0g8R9264OR+9Tm/MzVuw1TRftbUAAy8Qr3fttz/Y4QQIhAGA1x4L/x2M5w/T73OKS448jl89BgsnwB/GQIf/bF2JXUhOgAJappLKxjW+FNTA+rmmBp/MzUA47LU+/0fwsnv/T9OCCEC1WM4ZD4Cd2yBu3fDFUvg7MkQFqEuHvrJk7B0KKz5lTppQrI3op1JUNNc7kGNweR/1sU9+PG3pgag+9kw4HJAga3P+X+cEEI0R3yquqbNTWvggUMw7WXofb46WWLfe+pU8L+eB1+8BLbS9u6tCFES1DRX4kB1tgCoGZfGFt7TuA9TBTL8BDD+TvV+5z/qb6ophBCtzRwB51wDs9bC7Vth9C1gjlJXJv7wXnhmJJw80N69FCFIgpqWoGVr/B16Akg4GyK6quldf1YTdpc2DnqOBqcNvngxsGOFEKIlJQ2GK/8C9+yDyY9DfG8oPwH/uAEqi9q7dyLESFDTEsbMgbMvgwl3+X+MNRp+9zXMXh/4+xkMte/15d/AXh74OYQQoiWFx8F5t6nXtNiecOp7eGs2uJzt3TMRQiSoaQnR3eGm1TDoqsCOC4+FMGvT3nPgldClD1SegR2vN+0cQgjR0mKS4IZVajHxgQ2wYWF790iEEAlqOiujCcbNVR9vfQ6c1e3bHyGE0KSMgCl/VR9veVat/xOiDUhQ05mNuFmtyyk6DN++3969EUKIWkOuVfeUAnj/LtlLSrSJJgU1y5YtIz09nfDwcDIyMvjiiy8abP/GG28wcOBAwsPDGTp0KB9++KH+msPh4IEHHmDo0KFERUWRkpLCjBkzOHbsmMc50tPTMRgMHrdFixY1pfvBwxIJY+eojz97RtaIEEJ0LBf9HgZcAU47rLm5do88IVpJwEHNmjVryM7OZuHChWzfvp3hw4czadIkCgu9Ty3esmULN954I7Nnz2bHjh1MmTKFKVOmsHv3bgAqKirYvn07Dz/8MNu3b+ftt99m//79XH311fXO9eijj3L8+HH9dueddwba/eAz9lYIC4dj2+HwZ+3dGyGEqGU0wrUvQOJgKCuA1TeBo7K9eyWCmEFRAvvzPiMjgzFjxvDcc+rCby6Xi9TUVO68804efPDBeu2nT59OeXk5H3zwgf7ceeedx4gRI1i+3PtS/19++SVjx47l8OHDpKWlAWqm5u677+buu+8OpLu6kpIS4uLiKC4uJjY2tknn6LA+mAdfrVBX+rxpTXv3RgifOuPvYWfsc4dz5kd48WKoPK0u2HflEug+oL17JTqJQH4HA8rU2O12cnNzyczMrD2B0UhmZiZbt271eszWrVs92gNMmjTJZ3uA4uJiDAYD8fHxHs8vWrSIbt26MXLkSJ588kmqq30Xx9psNkpKSjxuQWtcFmCA79ZB4bft3RshhPDUJR2m/z81q3z4U3h+PPzn/6CquL17JoJMWCCNT548idPpJCnJcwXcpKQkvv3W+/9M8/PzvbbPz8/32r6qqooHHniAG2+80SMiu+uuuzj33HPp2rUrW7ZsYf78+Rw/fpwlS5Z4PU9OTg5/+MMfAvl4nVe3s9SNLr/9AF67FpKHQdc+6pTvLunq4/i0pk8fF0KI5ko/H+7YCut+D9/9W521ueuf6t5Sw29Uh6qEaKaAgprW5nA4uP7661EUheeff97jtezsbP3xsGHDsFgs/Pa3vyUnJwertf7/rOfPn+9xTElJCampqa3X+fZ2wT2w/99QclS91WWJhl88py5tLoQQ7aFrX3VNr+/Xw7oH4dQB+Ncd8NXf4bInodeo9u6h6OQCCmoSEhIwmUwUFBR4PF9QUEBysvdNGZOTk/1qrwU0hw8f5qOPPmp03CwjI4Pq6mp+/PFHBgyoPzZrtVq9BjtBq+e5MG8PFO6FM4fg9CF1HPvMj+pjexm8ORsUFwyZ2t69FUKEsv4/hz4T4fPnYfMTcDQX/vYz6D4Izp6k3nqNBZOX/0W5XHD6B/WYk9+pWZ6Efm3/GUSHFFBQY7FYGDVqFBs3bmTKlCmAWii8ceNGsrKyvB4zbtw4Nm7c6FHgu379esaNG6f/rAU033//PR9//DHdunVrtC87d+7EaDSSmJgYyEcIbrE91FtdLie8dxfsfA3emqNO/R56Xdv3TwghNGEWmPA7GDYdNjwCu9bAiX3q7bOlEB4P/TLVAMcSpQYxR3Ph6A6wudXifPV3uPktyfIIoAnDT9nZ2cycOZPRo0czduxYli5dSnl5ObNmzQJgxowZ9OzZk5ycHAB+97vfMXHiRJ566imuuOIKVq9ezVdffcWLL6obMTocDq677jq2b9/OBx98gNPp1OttunbtisViYevWrXz++edcfPHFxMTEsHXrVubNm8cvf/lLunTp0lLfRfAymuDqZ9XHO1+Dt2vWtpHARgjR3mKS4ZrlMOnPcPAj+O4/cGC9ugXM7jfVW11h4epmwLZSNTv9ylVww+tw1sVt33/RoQQc1EyfPp0TJ06wYMEC8vPzGTFiBOvWrdOLgfPy8jC6FXyNHz+eVatW8dBDD/H73/+e/v378+677zJkyBAAjh49ynvvvQfAiBEjPN7r448/5qKLLsJqtbJ69WoeeeQRbDYbffr0Yd68eR41M6IRRqMa2BiAHTWBjaLAsGne25ccg/xvoOcoiEpo064KIUJQZFf1D62h16nZ5Z++rAlwNqg/9zy35jZKXffGZAZbGaz5JfzwMay6Hqb+DQb/or0/iWhHAa9T01nJWhM1XC51yfId/w8MRrjmBRh2vXrROJqrXkS+/48a0IBaYHze7eq08Yj4pr9v5RnI+1z9S0pmYYWszvh72Bn7HFKqbeofaXv/pV7TrvwLjPp1e/dKtKBAfgclqAlFLhd88DvY/qp6ETj7Msjbqi6MpTNATA8orVnWPDwOxt8FGbeBNdr/91IU2PsufHgflJ+AlHPh+lfUKeYi5HTG38PO2OeQ43Kqi5Buf0X9OfMROH+eZxunA4p/UmeHxqVCl95t3k3RNBLUeCEXpjpcLvjg7tqLAKiBy1mXqIV5/TIhspu69s1Hf1KL9wAiE+CCbBh9C5gjGn6PkuOw9h7Yv9bz+Yguapq4X6b340TQ6oy/h52xzyFJUWDjH+DTv6g/D5kKJgsU5am3kqPq7E9N94HQ/1J1JfbUDO8zrUSHIEGNF3Jh8sLlUhfAqjyjBhi+frFdTtj9Fnz8Z3W6OKjBTf9Lod8lcNbP1PFwjaKoWaD/PqzOUjCa1XV0hl0Pb82GYzsAA1z0IFx4vyy6FUIa+z1ctmwZTz75JPn5+QwfPpxnn32WsWPH+jzfG2+8wcMPP8yPP/5I//79efzxx7n88sv11xVFYeHChbz00ksUFRUxYcIEnn/+efr3799ifRYdzGfPwPqHvb9msqozRIuOgOKsfV77g67PhWr22lEB9nJ1nyrtcWRXdYuHtPMCy1aLZpOgxgu5MLUApwN2rlLXlSj5ye0Fg1q81y8Teo2BLU/DoU/Ul1LOVRf9SzpH/dlRpS66lbtS/blfJlz7kmdQpHE5oTQfKk6pgVdVEVQW1T6utqt1PhFdam5uj8Pj1QuV0dRKX4ZoioZ+D9esWcOMGTNYvnw5GRkZLF26lDfeeIP9+/d7Xbphy5YtXHjhheTk5HDllVeyatUqHn/8cbZv365PRHj88cfJycnhlVdeoU+fPjz88MN888037N27l/Dw8Gb3WXRQ+9epBcaxPSC+tzrcHd8borqrf0RVnqmdafX9+jpD740wmNSC5fQL1FWS085Tp5yLViNBjRdyYWpB1XbI26JeNA58BIV76rcJi4CfPaQWGXsLLHauUsfAq6sgLg0uegDKT6qLBRYdrrk/Ai5H8/pqjVWDGy3ICY8FDGoauu4N1BkVxrDam/azwah+DoPJ894Ypv7VZokBa4z62Bqj/gzqoofaX3r2cvWxoxLMkWq78Nia42ruw6xqpkvrj94/BZx29VZdpRZHOu3qvavarU9a32seK07136u6qv6xoB5jMILBUHNfkzVzVatBrMtRc1/zs9Gk9tFkVe/dHyedAwkNZ0Aa+j1s6c1yFUUhJSWFe+65h3vvvRdQ95VLSkri5Zdf5oYbbvDrPyG5dgQ590kSx7arQ1bmSLBEgjmq5j5SvS4d+p96785gUv+gMke6HafdItSAp+7zlij19zNQxjDPc7qftzP/AReXql6DfAjkd1AGEUXgwizQ9yL1dilQfFT9q+fABsjbBslD4fIn1CXRfRlxk9puza/UIa1/zfXezhim1vaEx9dmYrTHJou6IV7lGc9MTsVpcJSrx9tK1FvxkRb7+MKHnz0MF97bpEO1zXLnz5+vP+fPZrl1l3WYNGkS7777LgCHDh0iPz/fY0PduLg4MjIy2Lp1q8+gxmazYbPZ9J+DejNcoQYDqWPVmz+K8uDHT9UA58f/qdeWilPAqVbtZlB7+FSL1TRJUCOaL64nnPsr9RaI5KFw6yZYvwBOfKumiLuk197ie0NsStP+Aqm2q8FMZZEa7GgBj63UMyvhflMUNSPh0jIT1W4/O9WMicupZj+0e6dDzcbYStU1M2ylNT+XAAZ1Sryl5i8z7a++sHA1W2MrqTmuFKpqgq9qW53MiUE9j8GgBnHumRGTRT2XKUytj3JV1/Sturb/RlNtuzCtvUW9GQy1n8s9IwTqOY3m2kyVyaz+rDjVPlbbwGmrfVxtU/+9mqg1NsvV7gPZUBdCbDNcEbj4NPWPshE3qT+XHFevL44KsFd4r8dxv3dUqo9dzgbfxiuXo/Z49/dzVHgWQYcwCWpE+4qIh6ufafnzhlkgLEEWDhQBC7nNcEXz+NqeRrQLmXYihGh3rbFZrnYfyDlB3Qw3NjbW4yaE6BwkqBFCtDv3zXI12ma57pvfutM2y3Xnvllunz59SE5O9mhTUlLC559/7vOcQojOTYafhBAdQktvlmswGLj77rv54x//SP/+/fUp3SkpKUyZMqW9PqYQohVJUCOE6BBaerNcgPvvv5/y8nJuvfVWioqKOP/881m3bp3fa9QIIToXWadGCNFmOuPvYWfssxDBJJDfQampEUIIIURQkKBGCCGEEEFBghohhBBCBAUJaoQQQggRFCSoEUIIIURQkKBGCCGEEEFBghohhBBCBAUJaoQQQggRFCSoEUIIIURQCJltErSFk0tKStq5J0KELu33rzMtZC7XDiHaVyDXjZAJakpLSwFITU1t554IIUpLS4mLi2vvbvhFrh1CdAz+XDdCZu8nl8vFsWPHiImJwWAw+GxXUlJCamoqR44cCfl9XuS7UMn3oGqJ70FRFEpLS0lJSfHYnLIjk2tHYOR7UMn3oGrr60bIZGqMRiO9evXyu31sbGxI/4foTr4LlXwPquZ+D50lQ6ORa0fTyPegku9B1VbXjc7xp5IQQgghRCMkqBFCCCFEUJCgpg6r1crChQuxWq3t3ZV2J9+FSr4HlXwPDZPvRyXfg0q+B1Vbfw8hUygshBBCiOAmmRohhBBCBAUJaoQQQggRFCSoEUIIIURQkKBGCCGEEEFBgpo6li1bRnp6OuHh4WRkZPDFF1+0d5da1SeffMJVV11FSkoKBoOBd9991+N1RVFYsGABPXr0ICIigszMTL7//vv26WwrysnJYcyYMcTExJCYmMiUKVPYv3+/R5uqqirmzp1Lt27diI6OZurUqRQUFLRTj1vH888/z7Bhw/SFssaNG8e///1v/fVQ+A6aSq4d73q8HgrXDrlu1Ooo1w4JatysWbOG7OxsFi5cyPbt2xk+fDiTJk2isLCwvbvWasrLyxk+fDjLli3z+voTTzzBM888w/Lly/n888+Jiopi0qRJVFVVtXFPW9fmzZuZO3cu27ZtY/369TgcDi699FLKy8v1NvPmzeP999/njTfeYPPmzRw7doxrr722HXvd8nr16sWiRYvIzc3lq6++4mc/+xm/+MUv2LNnDxAa30FTyLWjvlC4dsh1o1aHuXYoQjd27Fhl7ty5+s9Op1NJSUlRcnJy2rFXbQdQ3nnnHf1nl8ulJCcnK08++aT+XFFRkWK1WpV//OMf7dDDtlNYWKgAyubNmxVFUT+32WxW3njjDb3Nvn37FEDZunVre3WzTXTp0kX529/+FtLfQWPk2iHXDkWR60Zd7XHtkExNDbvdTm5uLpmZmfpzRqORzMxMtm7d2o49az+HDh0iPz/f4zuJi4sjIyMj6L+T4uJiALp27QpAbm4uDofD47sYOHAgaWlpQftdOJ1OVq9eTXl5OePGjQvJ78Afcu2oL1SvHXLdULXntSNkNrRszMmTJ3E6nSQlJXk8n5SUxLfffttOvWpf+fn5AF6/E+21YORyubj77ruZMGECQ4YMAdTvwmKxEB8f79E2GL+Lb775hnHjxlFVVUV0dDTvvPMOgwcPZufOnSHzHQRCrh31heK1I9SvG9Axrh0S1AhRx9y5c9m9ezeffvppe3elXQwYMICdO3dSXFzMm2++ycyZM9m8eXN7d0uIDi3UrxvQMa4dMvxUIyEhAZPJVK8au6CggOTk5HbqVfvSPncofSdZWVl88MEHfPzxx/Tq1Ut/Pjk5GbvdTlFRkUf7YPwuLBYL/fr1Y9SoUeTk5DB8+HCefvrpkPoOAiHXjvpC7doh1w1VR7h2SFBTw2KxMGrUKDZu3Kg/53K52LhxI+PGjWvHnrWfPn36kJyc7PGdlJSU8Pnnnwfdd6IoCllZWbzzzjt89NFH9OnTx+P1UaNGYTabPb6L/fv3k5eXF3TfRV0ulwubzRbS30FD5NpRX6hcO+S60bB2uXa0aNlxJ7d69WrFarUqL7/8srJ3717l1ltvVeLj45X8/Pz27lqrKS0tVXbs2KHs2LFDAZQlS5YoO3bsUA4fPqwoiqIsWrRIiY+PV/71r38pu3btUn7xi18offr0USorK9u55y3r9ttvV+Li4pRNmzYpx48f128VFRV6m9tuu01JS0tTPvroI+Wrr75Sxo0bp4wbN64de93yHnzwQWXz5s3KoUOHlF27dikPPvigYjAYlP/+97+KooTGd9AUcu0IzWuHXDdqdZRrhwQ1dTz77LNKWlqaYrFYlLFjxyrbtm1r7y61qo8//lgB6t1mzpypKIo6NfPhhx9WkpKSFKvVqlxyySXK/v3727fTrcDbdwAoK1eu1NtUVlYqd9xxh9KlSxclMjJSueaaa5Tjx4+3X6dbwS233KL07t1bsVgsSvfu3ZVLLrlEvygpSmh8B00l147Qu3bIdaNWR7l2GBRFUVo29yOEEEII0fakpkYIIYQQQUGCGiGEEEIEBQlqhBBCCBEUJKgRQgghRFCQoEYIIYQQQUGCGiGEEEIEBQlqhBBCCBEUJKgRQgghRFCQoEYEnU2bNmEwGOptniaEEA2Ra0fnJ0GNEEIIIYKCBDVCCCGECAoS1IgW53K5yMnJoU+fPkRERDB8+HDefPNNoDa9u3btWoYNG0Z4eDjnnXceu3fv9jjHW2+9xTnnnIPVaiU9PZ2nnnrK43WbzcYDDzxAamoqVquVfv368fe//92jTW5uLqNHjyYyMpLx48ezf/9+/bWvv/6aiy++mJiYGGJjYxk1ahRfffVVK30jQgh/yLVDNFuLb5EpQt4f//hHZeDAgcq6deuUgwcPKitXrlSsVquyadMmfWffQYMGKf/973+VXbt2KVdeeaWSnp6u2O12RVEU5auvvlKMRqPy6KOPKvv371dWrlypREREeOx8e/311yupqanK22+/rRw8eFDZsGGDsnr1akVRancPzsjIUDZt2qTs2bNHueCCC5Tx48frx59zzjnKL3/5S2Xfvn3Kd999p/zzn/9Udu7c2abfkxDCk1w7RHNJUCNaVFVVlRIZGals2bLF4/nZs2crN954o37R0C4iiqIop06dUiIiIpQ1a9YoiqIoN910k/Lzn//c4/j77rtPGTx4sKIoirJ//34FUNavX++1D9p7bNiwQX9u7dq1CqBUVlYqiqIoMTExyssvv9z8DyyEaBFy7RAtQYafRIs6cOAAFRUV/PznPyc6Olq/vfrqqxw8eFBvN27cOP1x165dGTBgAPv27QNg3759TJgwweO8EyZM4Pvvv8fpdLJz505MJhMTJ05ssC/Dhg3TH/fo0QOAwsJCALKzs/nNb35DZmYmixYt8uibEKLtybVDtAQJakSLKisrA2Dt2rXs3LlTv+3du1cfG2+uiIgIv9qZzWb9scFgANQxe4BHHnmEPXv2cMUVV/DRRx8xePBg3nnnnRbpnxAicHLtEC1BghrRogYPHozVaiUvL49+/fp53FJTU/V227Zt0x+fOXOG7777jkGDBgEwaNAgPvvsM4/zfvbZZ5x99tmYTCaGDh2Ky+Vi8+bNzerr2Wefzbx58/jvf//Ltddey8qVK5t1PiFE08m1Q7SEsPbugAguMTEx3HvvvcybNw+Xy8X5559PcXExn332GbGxsfTu3RuARx99lG7dupGUlMT//d//kZCQwJQpUwC45557GDNmDI899hjTp09n69atPPfcc/z1r38FID09nZkzZ3LLLbfwzDPPMHz4cA4fPkxhYSHXX399o32srKzkvvvu47rrrqNPnz789NNPfPnll0ydOrXVvhchRMPk2iFaRHsX9Yjg43K5lKVLlyoDBgxQzGaz0r17d2XSpEnK5s2b9UK8999/XznnnHMUi8WijB07Vvn66689zvHmm28qgwcPVsxms5KWlqY8+eSTHq9XVlYq8+bNU3r06KFYLBalX79+yooVKxRFqS32O3PmjN5+x44dCqAcOnRIsdlsyg033KCkpqYqFotFSUlJUbKysvRCQCFE+5Brh2gug6IoSnsGVSK0bNq0iYsvvpgzZ84QHx/f3t0RQnQScu0Q/pCaGiGEEEIEBQlqhBBCCBEUZPhJCCGEEEFBMjVCCCGECAoS1AghhBAiKEhQI4QQQoigIEGNEEIIIYKCBDVCCCGECAoS1AghhBAiKEhQI4QQQoigIEGNEEIIIYLC/wf8Df3ckddGgAAAAABJRU5ErkJggg==",
|
650 |
+
"text/plain": [
|
651 |
+
"<Figure size 640x480 with 2 Axes>"
|
652 |
+
]
|
653 |
+
},
|
654 |
+
"metadata": {},
|
655 |
+
"output_type": "display_data"
|
656 |
+
}
|
657 |
+
],
|
658 |
+
"source": [
|
659 |
+
"# -------------------------------------------------------\n",
|
660 |
+
"# 6. 実行メイン\n",
|
661 |
+
"# -------------------------------------------------------\n",
|
662 |
+
"\n",
|
663 |
+
"6\n",
|
664 |
+
"# 学習関連ハイパーパラメータ\n",
|
665 |
+
"TRAIN_EPOCHS = 32\n",
|
666 |
+
"TRAIN_BATCH_SIZE = 64\n",
|
667 |
+
"EVAL_BATCH_SIZE = 8\n",
|
668 |
+
"LEARNING_RATE = 4e-5\n",
|
669 |
+
"\n",
|
670 |
+
"\n",
|
671 |
+
"SAVE_DIR = \"./modernbert_jamt_finetune_ckpt_{:0=2}\".format(len(glob.glob(\"./modernbert_jamt_finetune_ckpt_*\")))\n",
|
672 |
+
"SPLIT_RATIO = (0.8, 0.1, 0.1) # train:valid:test = 8:1:1\n",
|
673 |
+
"\n",
|
674 |
+
"\n",
|
675 |
+
"os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"\n",
|
676 |
+
"random.seed(SEED)\n",
|
677 |
+
"np.random.seed(SEED)\n",
|
678 |
+
"torch.manual_seed(SEED)\n",
|
679 |
+
"\n",
|
680 |
+
"print(f\"[Info] Loading CSV from: {CSV_FILE_PATH}\")\n",
|
681 |
+
"df = load_jmtb_data(CSV_FILE_PATH)\n",
|
682 |
+
"print(f\"[Info] CSV loaded: {len(df)} rows.\")\n",
|
683 |
+
"\n",
|
684 |
+
"# Dataset化\n",
|
685 |
+
"dataset_all = create_dataset_from_df(df)\n",
|
686 |
+
"print(\"[Info] Built dataset with columns:\", dataset_all.column_names)\n",
|
687 |
+
"\n",
|
688 |
+
"# train/dev/test split\n",
|
689 |
+
"dataset_dict = split_dataset(dataset_all, split_ratio=SPLIT_RATIO, seed=SEED)\n",
|
690 |
+
"\n",
|
691 |
+
"# 変数をpickle形式で保存する\n",
|
692 |
+
"with open(\"./dataset_dict_float.pkl\", \"wb\") as file:\n",
|
693 |
+
" pickle.dump(dataset_dict, file)\n",
|
694 |
+
"# # pickle形式で保存された変数を読み込む\n",
|
695 |
+
"# with open(\"./dataset_dict_float.pkl\", \"rb\") as file:\n",
|
696 |
+
"# dataset_dict = pickle.load(file)\n",
|
697 |
+
"\n",
|
698 |
+
"\n",
|
699 |
+
"# dataset_dict = DatasetDict.load_from_disk(\"./jmtb_dataset_splits\")\n",
|
700 |
+
"\n",
|
701 |
+
"print(dataset_dict)\n",
|
702 |
+
"\n",
|
703 |
+
"# トークナイザ準備\n",
|
704 |
+
"print(f\"[Info] Loading tokenizer for {MODEL_NAME}\")\n",
|
705 |
+
"tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n",
|
706 |
+
"\n",
|
707 |
+
"def tokenize_fn(examples):\n",
|
708 |
+
" return tokenize_function(examples, tokenizer, max_length=None)\n",
|
709 |
+
"\n",
|
710 |
+
"dataset_dict = dataset_dict.map(tokenize_fn, batched=True)\n",
|
711 |
+
"\n",
|
712 |
+
"# モデルConfigとモデル本体\n",
|
713 |
+
"# num_labels=11クラス分類 (score=0..10)\n",
|
714 |
+
"config = AutoConfig.from_pretrained(\n",
|
715 |
+
" MODEL_NAME,\n",
|
716 |
+
" num_labels=1,\n",
|
717 |
+
" problem_type=\"single_label_regression\"\n",
|
718 |
+
")\n",
|
719 |
+
"# 注意: AutoConfig で problem_type 指定しても、上書きするの��親クラスの forward.\n",
|
720 |
+
"# ここでは主に「情報として入れておく」ため\n",
|
721 |
+
"\n",
|
722 |
+
"tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n",
|
723 |
+
"\n",
|
724 |
+
"model = ModernBertForScoring.from_pretrained(\n",
|
725 |
+
" MODEL_NAME,\n",
|
726 |
+
" config=config\n",
|
727 |
+
")\n",
|
728 |
+
"\n",
|
729 |
+
"\n",
|
730 |
+
"\n",
|
731 |
+
"# 学習データと評価データへ正しく入力されるようにcollator準備\n",
|
732 |
+
"data_collator = DataCollatorWithPadding(tokenizer=tokenizer)\n",
|
733 |
+
"\n",
|
734 |
+
"# Trainer用の引数設定\n",
|
735 |
+
"training_args = TrainingArguments(\n",
|
736 |
+
" output_dir=SAVE_DIR,\n",
|
737 |
+
" num_train_epochs=TRAIN_EPOCHS,\n",
|
738 |
+
" learning_rate=LEARNING_RATE,\n",
|
739 |
+
" per_device_train_batch_size=TRAIN_BATCH_SIZE,\n",
|
740 |
+
" per_device_eval_batch_size=EVAL_BATCH_SIZE,\n",
|
741 |
+
" evaluation_strategy=\"epoch\",\n",
|
742 |
+
" save_strategy=\"epoch\",\n",
|
743 |
+
" logging_strategy=\"epoch\",\n",
|
744 |
+
" load_best_model_at_end=True,\n",
|
745 |
+
" bf16=True, # Ampere以降のGPUでMixed Precision(BF16)学習\n",
|
746 |
+
" bf16_full_eval=True,\n",
|
747 |
+
" report_to=\"none\", # レポート先をOFF(W&Bなど使わない場合)\n",
|
748 |
+
" seed=SEED,\n",
|
749 |
+
" warmup_ratio=0.1,\n",
|
750 |
+
" lr_scheduler_type=\"cosine\",\n",
|
751 |
+
" weight_decay=0.01,\n",
|
752 |
+
" # logging_dir=SAVE_DIR,\n",
|
753 |
+
")\n",
|
754 |
+
"\n",
|
755 |
+
"# Trainer生成\n",
|
756 |
+
"trainer = Trainer(\n",
|
757 |
+
" model=model,\n",
|
758 |
+
" args=training_args,\n",
|
759 |
+
" train_dataset=dataset_dict[\"train\"],\n",
|
760 |
+
" eval_dataset=dataset_dict[\"validation\"],\n",
|
761 |
+
" tokenizer=tokenizer,\n",
|
762 |
+
" data_collator=data_collator,\n",
|
763 |
+
" compute_metrics=compute_metrics_regression, #compute_metrics_classification,\n",
|
764 |
+
")\n",
|
765 |
+
"\n",
|
766 |
+
"print(\"[Info] Starting training ...\")\n",
|
767 |
+
"trainer.train()\n",
|
768 |
+
"\n",
|
769 |
+
"# 学習完了後、テストセットで評価\n",
|
770 |
+
"print(\"[Info] Evaluating on test set ...\")\n",
|
771 |
+
"metrics_test = trainer.evaluate(dataset_dict[\"test\"])\n",
|
772 |
+
"print(\"Test set metrics:\", metrics_test)\n",
|
773 |
+
"\n",
|
774 |
+
"# 終了処理\n",
|
775 |
+
"print(\"[Info] Done. Saving final model ...\")\n",
|
776 |
+
"trainer.save_model(SAVE_DIR)\n",
|
777 |
+
"print(\"[Info] Finished.\")\n",
|
778 |
+
"\n",
|
779 |
+
"\n",
|
780 |
+
"\n",
|
781 |
+
"# ロスなどの結果を別途保存\n",
|
782 |
+
"dir_checkpoints = glob.glob(os.path.join(SAVE_DIR, \"checkpoint-*\", \"trainer_state.json\"))\n",
|
783 |
+
"def atoi(text):\n",
|
784 |
+
" return int(text) if text.isdigit() else text\n",
|
785 |
+
"\n",
|
786 |
+
"def natural_keys(text):\n",
|
787 |
+
" return [ atoi(c) for c in re.split(r'(\\d+)', text) ]\n",
|
788 |
+
"\n",
|
789 |
+
"dir_checkpoints = sorted(dir_checkpoints,key=natural_keys)\n",
|
790 |
+
"\n",
|
791 |
+
"l_data_eval_mae = []\n",
|
792 |
+
"l_data_eval_mse = []\n",
|
793 |
+
"l_data_eval_loss = []\n",
|
794 |
+
"l_data_loss = []\n",
|
795 |
+
"for i_checkpoint in dir_checkpoints:\n",
|
796 |
+
" with open(i_checkpoint, \"r\", encoding=\"utf-8\") as reader:\n",
|
797 |
+
" data_check = json.load(reader)\n",
|
798 |
+
" l_data_eval_mae.append(data_check[\"log_history\"][-1][\"eval_mae\"])\n",
|
799 |
+
" l_data_eval_mse.append(data_check[\"log_history\"][-1][\"eval_mse\"])\n",
|
800 |
+
" l_data_eval_loss.append(data_check[\"log_history\"][-1][\"eval_loss\"])\n",
|
801 |
+
" l_data_loss.append(data_check[\"log_history\"][-2][\"loss\"])\n",
|
802 |
+
"\n",
|
803 |
+
"d_logs = {\n",
|
804 |
+
" \"eval_mae\": l_data_eval_mae,\n",
|
805 |
+
" \"eval_mse\": l_data_eval_mse,\n",
|
806 |
+
" \"eval_loss\": l_data_eval_loss,\n",
|
807 |
+
" \"loss\": l_data_loss,\n",
|
808 |
+
"}\n",
|
809 |
+
"\n",
|
810 |
+
"with open(os.path.join(SAVE_DIR, \"log_epochs.json\"), \"w\", encoding=\"utf-8\") as writer:\n",
|
811 |
+
" json.dump(d_logs, writer, indent=4, ensure_ascii=False)\n",
|
812 |
+
"\n",
|
813 |
+
"# 可視化\n",
|
814 |
+
"fig, ax = plt.subplots(ncols=2)\n",
|
815 |
+
"\n",
|
816 |
+
"ax[0].plot(l_data_eval_mae, label=\"eval_mae\")\n",
|
817 |
+
"ax[0].plot(l_data_eval_mse, label=\"eval_mse\")\n",
|
818 |
+
"ax[1].plot(l_data_eval_loss, label=\"eval_loss\")\n",
|
819 |
+
"ax[1].plot(l_data_loss, label=\"loss\")\n",
|
820 |
+
"\n",
|
821 |
+
"ax[0].set_xlabel(\"epochs\")\n",
|
822 |
+
"ax[1].set_xlabel(\"epochs\")\n",
|
823 |
+
"\n",
|
824 |
+
"ax[0].legend()\n",
|
825 |
+
"ax[1].legend()\n",
|
826 |
+
"\n",
|
827 |
+
"plt.savefig(os.path.join(SAVE_DIR, \"log_epochs.png\"))\n",
|
828 |
+
"plt.show()"
|
829 |
+
]
|
830 |
+
}
|
831 |
+
],
|
832 |
+
"metadata": {
|
833 |
+
"kernelspec": {
|
834 |
+
"display_name": "vllmtest",
|
835 |
+
"language": "python",
|
836 |
+
"name": "python3"
|
837 |
+
},
|
838 |
+
"language_info": {
|
839 |
+
"codemirror_mode": {
|
840 |
+
"name": "ipython",
|
841 |
+
"version": 3
|
842 |
+
},
|
843 |
+
"file_extension": ".py",
|
844 |
+
"mimetype": "text/x-python",
|
845 |
+
"name": "python",
|
846 |
+
"nbconvert_exporter": "python",
|
847 |
+
"pygments_lexer": "ipython3",
|
848 |
+
"version": "3.12.4"
|
849 |
+
}
|
850 |
+
},
|
851 |
+
"nbformat": 4,
|
852 |
+
"nbformat_minor": 2
|
853 |
+
}
|