kurogane commited on
Commit
a46a097
·
verified ·
1 Parent(s): 2495eb9

Upload 5 files

Browse files
.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
+ }