From 3ed38864090ea71d7515acd2c79eafd92a86e35d Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Mon, 24 Apr 2023 21:16:42 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Transcribe_TransformerKoreanChatbot.ipynb | 1725 +++++++++++++++++++++ 1 file changed, 1725 insertions(+) create mode 100644 Transcribe_TransformerKoreanChatbot.ipynb diff --git a/Transcribe_TransformerKoreanChatbot.ipynb b/Transcribe_TransformerKoreanChatbot.ipynb new file mode 100644 index 0000000..b98685a --- /dev/null +++ b/Transcribe_TransformerKoreanChatbot.ipynb @@ -0,0 +1,1725 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "id": "2fe11c0f", + "metadata": { + "id": "2fe11c0f" + }, + "source": [ + "## 필요 라이브러리 import" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bbebe731", + "metadata": { + "id": "bbebe731" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "id": "5cd2132b", + "metadata": { + "id": "5cd2132b" + }, + "source": [ + "TypeError: Unable to convert function return value to a Python type! The signature was\n", + "\t() -> handle\n", + "- tensorflow를 import 할 때, 해당 오류가 발생하는 건 tensorflow 라이브러리 버전이 낮기 때문임.\n", + " - pip install --upgrade tensorflow\n", + " - pip uninstall tensorflow 하고서 pip install tensorflow 하기" + ] + }, + { + "cell_type": "markdown", + "id": "b9c7b06c", + "metadata": { + "id": "b9c7b06c" + }, + "source": [ + "ERROR: Could not install packages due to an OSError: [WinError 5] 액세스가 거부되었습니다: \n", + "- 해당 에러가 cmd 창에서 나타나는 경우, 다음 명령문을 conda install 전에 입력한다.\n", + " - conda config --set ssl_verify false\n", + " - conda install pip tensorflow" + ] + }, + { + "cell_type": "markdown", + "source": [ + "위의 방식대로 했는데도 안 됐음...\n", + "--> 근데 그냥... 코랩으로 돌리면 되는 거였음..." + ], + "metadata": { + "id": "mSVrStdeJrjB" + }, + "id": "mSVrStdeJrjB" + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "92cc660a", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "92cc660a", + "outputId": "d0cb368f-7bd3-4880-beac-acfea6e2db1e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'2.12.0'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 4 + } + ], + "source": [ + "tf.__version__ #2.6.0 이상 버전에서 작업 진행 필요" + ] + }, + { + "cell_type": "markdown", + "id": "6f9aa344", + "metadata": { + "id": "6f9aa344" + }, + "source": [ + "## Positional Encoding 구현" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d833813b", + "metadata": { + "id": "d833813b" + }, + "outputs": [], + "source": [ + "class PositionalEncoding(tf.keras.layers.Layer):\n", + " def __init__(self, position, d_model):\n", + " super(PositionalEncoding, self).__init__()\n", + " self.pos_encoding = self.positional_encoding(position, d_model)\n", + "\n", + " def get_angles(self, position, i, d_model):\n", + " angles = 1 / tf.pow(10000, (2 * (i // 2)) / tf.cast(d_model, tf.float32))\n", + " return position * angles\n", + "\n", + " def positional_encoding(self, position, d_model):\n", + " angle_rads = self.get_angles(\n", + " position=tf.range(position, dtype=tf.float32)[:, tf.newaxis],\n", + " i=tf.range(d_model, dtype=tf.float32)[tf.newaxis, :],\n", + " d_model=d_model)\n", + "\n", + " # 배열의 짝수 인덱스(2i)에는 사인 함수 적용\n", + " sines = tf.math.sin(angle_rads[:, 0::2])\n", + "\n", + " # 배열의 홀수 인덱스(2i+1)에는 코사인 함수 적용\n", + " cosines = tf.math.cos(angle_rads[:, 1::2])\n", + "\n", + " angle_rads = np.zeros(angle_rads.shape)\n", + " angle_rads[:, 0::2] = sines\n", + " angle_rads[:, 1::2] = cosines\n", + " pos_encoding = tf.constant(angle_rads)\n", + " pos_encoding = pos_encoding[tf.newaxis, ...]\n", + "\n", + " print(pos_encoding.shape)\n", + " return tf.cast(pos_encoding, tf.float32)\n", + "\n", + " def call(self, inputs):\n", + " return inputs + self.pos_encoding[:, :tf.shape(inputs)[1], :]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "026d42a0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "026d42a0", + "outputId": "650011ba-be03-4c83-d2fb-7135aea515d1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 50, 128)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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QmvSpIn2+eefa/v27dM+/vhjLTY2VnvkkUfEMhfCeZ84cUL78ccftR9//FEDoM2ePVv78ccfRfVMbc5x0KBBWteuXbXNmzdr3377rda6dWvt1ltv9dYp1UpN511ZWaldd911WtOmTbXt27frfs5VVFSIbfjieZP7LtiJi6Zp2iuvvKIlJSVpVqtV69Gjh7Zp0yZvH1K9AuDytXDhQrFMWVmZdu+992pRUVFacHCw9ve//107fPiw9w76HDl94nKhnveKFSu0Sy65RLPZbFrbtm21N998U/e+0+nUpkyZosXFxWk2m03r37+/tnv3bi8dbf0oLi7WHnjgAS0pKUmz2+3aRRddpD3++OO6/3FdCOf9zTffuPz3PGLECE3TaneOx44d02699VYtNDRUCw8P10aOHKmdOHHCC2dTezWd9759+wx/zn3zzTdiG7543uQ+k6Yp7SeJiIiIGrAL8h4XIiIiujBx4kJEREQ+gxMXIiIi8hmcuBAREZHP4MSFiIiIfAYnLkREROQzOHEhIiIin8GJCxHVyv79+2EymbB9+3ZvHwoR+TFOXIh8xB133AGTyQSTyYTAwEDExcXhqquuwoIFC8Rze+pzX0OHDq3XbRIR1QdOXIh8yKBBg3D48GHs378fq1atwpVXXokHHngA11xzDaqrq719eERE5xwnLkQ+xGazIT4+Hk2aNMGll16Kxx57DJ9++ilWrVqFd999FwBQWFiIu+66C40aNUJ4eDj69euHn376SWxj+vTp6NKlC9544w00a9YMwcHBuOmmm1BUVCTef++99/Dpp5+KKzzr168X6//555+48sorERwcjM6dOyMjI+N8fgmIyM9x4kLk4/r164fOnTvj448/BgDceOONyM/Px6pVq5CZmYlLL70U/fv3R0FBgVhn7969+PDDD7FixQqsXr0aP/74I+69914AwEMPPYSbbrpJXN05fPgwevbsKdZ9/PHH8dBDD2H79u24+OKLceutt/JqDxGdN5y4EF0A2rZti/379+Pbb7/Fli1bsGzZMnTv3h2tW7fGiy++iMjISHz00Udi+fLycixatAhdunRBnz598Morr2Dp0qXIzc1FaGgogoKCxNWd+Ph4WK1Wse5DDz2EIUOG4OKLL8aMGTNw4MAB7N271xunTUR+iBMXoguApmkwmUz46aefUFJSgpiYGISGhorXvn378Mcff4jlk5KS0KRJE/Hn1NRUOJ1O7N69+6z76tSpk8gJCQkAgPz8/Ho8GyIiYwHePgAi8tzOnTvRokULlJSUICEhQXdPyl8iIyPrZV+BgYEim0wmAKj3qiYiIiOcuBD5uHXr1uGXX37BhAkT0LRpU+Tm5iIgIADJycmG62RlZSEnJweJiYkAgE2bNsFsNqNNmzYAAKvVCofDcT4On4ioTjhxIfIhFRUVyM3NhcPhQF5eHlavXo1Zs2bhmmuuwe233w6z2YzU1FQMHToUzz//PC6++GLk5ORg5cqV+Pvf/47u3bsDAOx2O0aMGIEXX3wRxcXFuP/++3HTTTchPj4eAJCcnIwvv/wSu3fvRkxMDCIiIrx52kREAicuRD5k9erVSEhIQEBAAKKiotC5c2fMmzcPI0aMgNl86pa1L774Ao8//jhGjhyJI0eOID4+Hn369EFcXJzYTqtWrXDDDTfg6quvRkFBAa655hq89tpr4v3Ro0dj/fr16N69O0pKSvDNN9/UeAWHiOh8MWmapnn7IIjo/Jk+fTqWL1/O1v1E5JNYVUREREQ+gxMXIiIi8hn8qIiIiIh8Bq+4EBERkc/gxIWIiIh8BicuRERE5DM4cSEiIiKfwYkLERER+QxOXIiIiMhncOJCREREPoMTFyIiIvIZnLgQERGRz/h/EUZqzUoz920AAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ], + "source": [ + "sample_pos_encoding = PositionalEncoding(50, 128)\n", + "\n", + "plt.pcolormesh(sample_pos_encoding.pos_encoding.numpy()[0], cmap='RdBu')\n", + "plt.xlabel('Depth')\n", + "plt.xlim((0, 128))\n", + "plt.ylabel('Position')\n", + "plt.colorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0d531b2b", + "metadata": { + "id": "0d531b2b" + }, + "source": [ + "## Scaled dot product attention" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "efddecf0", + "metadata": { + "id": "efddecf0" + }, + "outputs": [], + "source": [ + "def scaled_dot_product_attention(query, key, value, mask):\n", + " # query 크기 : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " # key 크기 : (batch_size, num_heads, key의 문장 길이, d_model/num_heads)\n", + " # value 크기 : (batch_size, num_heads, value의 문장 길이, d_model/num_heads)\n", + " # padding_mask : (batch_size, 1, 1, key의 문장 길이)\n", + "\n", + " # Q와 K의 곱. 어텐션 스코어 행렬.\n", + " matmul_qk = tf.matmul(query, key, transpose_b=True)\n", + "\n", + " # 스케일링\n", + " # dk의 루트값으로 나눠준다.\n", + " depth = tf.cast(tf.shape(key)[-1], tf.float32)\n", + " logits = matmul_qk / tf.math.sqrt(depth)\n", + "\n", + " # 마스킹. 어텐션 스코어 행렬의 마스킹 할 위치에 매우 작은 음수값을 넣는다.\n", + " # 매우 작은 값이므로 소프트맥스 함수를 지나면 행렬의 해당 위치의 값은 0이 된다.\n", + " if mask is not None:\n", + " logits += (mask * -1e9)\n", + "\n", + " # 소프트맥스 함수는 마지막 차원인 key의 문장 길이 방향으로 수행된다.\n", + " # attention weight : (batch_size, num_heads, query의 문장 길이, key의 문장 길이)\n", + " attention_weights = tf.nn.softmax(logits, axis=-1)\n", + "\n", + " # output : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " output = tf.matmul(attention_weights, value)\n", + "\n", + " return output, attention_weights" + ] + }, + { + "cell_type": "markdown", + "id": "728a5cc3", + "metadata": { + "id": "728a5cc3" + }, + "source": [ + "## Multi Head Attention" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7618539d", + "metadata": { + "id": "7618539d" + }, + "outputs": [], + "source": [ + "class MultiHeadAttention(tf.keras.layers.Layer):\n", + "\n", + " def __init__(self, d_model, num_heads, name=\"multi_head_attention\"):\n", + " super(MultiHeadAttention, self).__init__(name=name)\n", + " self.num_heads = num_heads\n", + " self.d_model = d_model\n", + "\n", + " assert d_model % self.num_heads == 0\n", + "\n", + " # d_model을 num_heads로 나눈 값.\n", + " # 논문 기준 : 64\n", + " self.depth = d_model // self.num_heads\n", + "\n", + " # WQ, WK, WV에 해당하는 밀집층 정의\n", + " self.query_dense = tf.keras.layers.Dense(units=d_model)\n", + " self.key_dense = tf.keras.layers.Dense(units=d_model)\n", + " self.value_dense = tf.keras.layers.Dense(units=d_model)\n", + "\n", + " # WO에 해당하는 밀집층 정의\n", + " self.dense = tf.keras.layers.Dense(units=d_model)\n", + "\n", + " # num_heads 개수만큼 q, k, v를 split하는 함수\n", + " def split_heads(self, inputs, batch_size):\n", + " inputs = tf.reshape(\n", + " inputs, shape=(batch_size, -1, self.num_heads, self.depth))\n", + " return tf.transpose(inputs, perm=[0, 2, 1, 3])\n", + "\n", + " def call(self, inputs):\n", + " query, key, value, mask = inputs['query'], inputs['key'], inputs[\n", + " 'value'], inputs['mask']\n", + " batch_size = tf.shape(query)[0]\n", + "\n", + " # 1. WQ, WK, WV에 해당하는 밀집층 지나기\n", + " # q : (batch_size, query의 문장 길이, d_model)\n", + " # k : (batch_size, key의 문장 길이, d_model)\n", + " # v : (batch_size, value의 문장 길이, d_model)\n", + " # 참고) 인코더(k, v)-디코더(q) 어텐션에서는 query 길이와 key, value의 길이는 다를 수 있다.\n", + " query = self.query_dense(query)\n", + " key = self.key_dense(key)\n", + " value = self.value_dense(value)\n", + "\n", + " # 2. 헤드 나누기\n", + " # q : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " # k : (batch_size, num_heads, key의 문장 길이, d_model/num_heads)\n", + " # v : (batch_size, num_heads, value의 문장 길이, d_model/num_heads)\n", + " query = self.split_heads(query, batch_size)\n", + " key = self.split_heads(key, batch_size)\n", + " value = self.split_heads(value, batch_size)\n", + "\n", + " # 3. 스케일드 닷 프로덕트 어텐션. 앞서 구현한 함수 사용.\n", + " # (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " scaled_attention, _ = scaled_dot_product_attention(query, key, value, mask)\n", + " # (batch_size, query의 문장 길이, num_heads, d_model/num_heads)\n", + " scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3])\n", + "\n", + " # 4. 헤드 연결(concatenate)하기\n", + " # (batch_size, query의 문장 길이, d_model)\n", + " concat_attention = tf.reshape(scaled_attention,\n", + " (batch_size, -1, self.d_model))\n", + "\n", + " # 5. WO에 해당하는 밀집층 지나기\n", + " # (batch_size, query의 문장 길이, d_model)\n", + " outputs = self.dense(concat_attention)\n", + "\n", + " return outputs" + ] + }, + { + "cell_type": "markdown", + "id": "1d31bfe6", + "metadata": { + "id": "1d31bfe6" + }, + "source": [ + "## padding mask 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3d76ee2e", + "metadata": { + "id": "3d76ee2e" + }, + "outputs": [], + "source": [ + "def create_padding_mask(x):\n", + " mask = tf.cast(tf.math.equal(x, 0), tf.float32)\n", + " # (batch_size, 1, 1, key의 문장 길이)\n", + " return mask[:, tf.newaxis, tf.newaxis, :]" + ] + }, + { + "cell_type": "markdown", + "id": "a87d6db3", + "metadata": { + "id": "a87d6db3" + }, + "source": [ + "## encoder" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "75149d08", + "metadata": { + "id": "75149d08" + }, + "outputs": [], + "source": [ + "def encoder_layer(dff, d_model, num_heads, dropout, name=\"encoder_layer\"):\n", + " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", + "\n", + " # 인코더는 패딩 마스크 사용\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name=\"padding_mask\")\n", + "\n", + " # 멀티-헤드 어텐션 (첫번째 서브층 / 셀프 어텐션)\n", + " attention = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention\")({\n", + " 'query': inputs, 'key': inputs, 'value': inputs, # Q = K = V\n", + " 'mask': padding_mask # 패딩 마스크 사용\n", + " })\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " attention = tf.keras.layers.Dropout(rate=dropout)(attention)\n", + " attention = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(inputs + attention)\n", + "\n", + " # 포지션 와이즈 피드 포워드 신경망 (두번째 서브층)\n", + " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention)\n", + " outputs = tf.keras.layers.Dense(units=d_model)(outputs)\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(outputs)\n", + " outputs = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention + outputs)\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, padding_mask], outputs=outputs, name=name)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "edda14f2", + "metadata": { + "id": "edda14f2" + }, + "outputs": [], + "source": [ + "def encoder(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name=\"encoder\"):\n", + " inputs = tf.keras.Input(shape=(None,), name=\"inputs\")\n", + "\n", + " # 인코더는 패딩 마스크 사용\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name=\"padding_mask\")\n", + "\n", + " # 포지셔널 인코딩 + 드롭아웃\n", + " embeddings = tf.keras.layers.Embedding(vocab_size, d_model)(inputs)\n", + " embeddings *= tf.math.sqrt(tf.cast(d_model, tf.float32))\n", + " embeddings = PositionalEncoding(vocab_size, d_model)(embeddings)\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(embeddings)\n", + "\n", + " # 인코더를 num_layers개 쌓기\n", + " for i in range(num_layers):\n", + " outputs = encoder_layer(dff=dff, d_model=d_model, num_heads=num_heads,\n", + " dropout=dropout, name=\"encoder_layer_{}\".format(i),\n", + " )([outputs, padding_mask])\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, padding_mask], outputs=outputs, name=name)" + ] + }, + { + "cell_type": "markdown", + "id": "3277dd47", + "metadata": { + "id": "3277dd47" + }, + "source": [ + "## decoder" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "fed9cc2c", + "metadata": { + "id": "fed9cc2c" + }, + "outputs": [], + "source": [ + "# 디코더의 첫번째 서브층(sublayer)에서 미래 토큰을 Mask하는 함수\n", + "def create_look_ahead_mask(x):\n", + " seq_len = tf.shape(x)[1]\n", + " look_ahead_mask = 1 - tf.linalg.band_part(tf.ones((seq_len, seq_len)), -1, 0)\n", + " padding_mask = create_padding_mask(x) # 패딩 마스크도 포함\n", + " return tf.maximum(look_ahead_mask, padding_mask)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e9ba8f4b", + "metadata": { + "id": "e9ba8f4b" + }, + "outputs": [], + "source": [ + "def decoder_layer(dff, d_model, num_heads, dropout, name=\"decoder_layer\"):\n", + " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", + " enc_outputs = tf.keras.Input(shape=(None, d_model), name=\"encoder_outputs\")\n", + "\n", + " # 디코더는 룩어헤드 마스크(첫번째 서브층)와 패딩 마스크(두번째 서브층) 둘 다 사용.\n", + " look_ahead_mask = tf.keras.Input(\n", + " shape=(1, None, None), name=\"look_ahead_mask\")\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name='padding_mask')\n", + "\n", + " # 멀티-헤드 어텐션 (첫번째 서브층 / 마스크드 셀프 어텐션)\n", + " attention1 = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention_1\")(inputs={\n", + " 'query': inputs, 'key': inputs, 'value': inputs, # Q = K = V\n", + " 'mask': look_ahead_mask # 룩어헤드 마스크\n", + " })\n", + "\n", + " # 잔차 연결과 층 정규화\n", + " attention1 = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention1 + inputs)\n", + "\n", + " # 멀티-헤드 어텐션 (두번째 서브층 / 디코더-인코더 어텐션)\n", + " attention2 = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention_2\")(inputs={\n", + " 'query': attention1, 'key': enc_outputs, 'value': enc_outputs, # Q != K = V\n", + " 'mask': padding_mask # 패딩 마스크\n", + " })\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " attention2 = tf.keras.layers.Dropout(rate=dropout)(attention2)\n", + " attention2 = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention2 + attention1)\n", + "\n", + " # 포지션 와이즈 피드 포워드 신경망 (세번째 서브층)\n", + " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention2)\n", + " outputs = tf.keras.layers.Dense(units=d_model)(outputs)\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(outputs)\n", + " outputs = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(outputs + attention2)\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, enc_outputs, look_ahead_mask, padding_mask],\n", + " outputs=outputs,\n", + " name=name)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "66f05031", + "metadata": { + "id": "66f05031" + }, + "outputs": [], + "source": [ + "def decoder(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name='decoder'):\n", + " inputs = tf.keras.Input(shape=(None,), name='inputs')\n", + " enc_outputs = tf.keras.Input(shape=(None, d_model), name='encoder_outputs')\n", + "\n", + " # 디코더는 룩어헤드 마스크(첫번째 서브층)와 패딩 마스크(두번째 서브층) 둘 다 사용.\n", + " look_ahead_mask = tf.keras.Input(\n", + " shape=(1, None, None), name='look_ahead_mask')\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name='padding_mask')\n", + "\n", + " # 포지셔널 인코딩 + 드롭아웃\n", + " embeddings = tf.keras.layers.Embedding(vocab_size, d_model)(inputs)\n", + " embeddings *= tf.math.sqrt(tf.cast(d_model, tf.float32))\n", + " embeddings = PositionalEncoding(vocab_size, d_model)(embeddings)\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(embeddings)\n", + "\n", + " # 디코더를 num_layers개 쌓기\n", + " for i in range(num_layers):\n", + " outputs = decoder_layer(dff=dff, d_model=d_model, num_heads=num_heads,\n", + " dropout=dropout, name='decoder_layer_{}'.format(i),\n", + " )(inputs=[outputs, enc_outputs, look_ahead_mask, padding_mask])\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, enc_outputs, look_ahead_mask, padding_mask],\n", + " outputs=outputs,\n", + " name=name)\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "2e5d5fc8", + "metadata": { + "id": "2e5d5fc8" + }, + "source": [ + "## Transformer 구현" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "dcc9c225", + "metadata": { + "id": "dcc9c225" + }, + "outputs": [], + "source": [ + "def transformer(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name=\"transformer\"):\n", + "\n", + " # 인코더의 입력\n", + " inputs = tf.keras.Input(shape=(None,), name=\"inputs\")\n", + "\n", + " # 디코더의 입력\n", + " dec_inputs = tf.keras.Input(shape=(None,), name=\"dec_inputs\")\n", + "\n", + " # 인코더의 패딩 마스크\n", + " enc_padding_mask = tf.keras.layers.Lambda(\n", + " create_padding_mask, output_shape=(1, 1, None),\n", + " name='enc_padding_mask')(inputs)\n", + "\n", + " # 디코더의 룩어헤드 마스크(첫번째 서브층)\n", + " look_ahead_mask = tf.keras.layers.Lambda(\n", + " create_look_ahead_mask, output_shape=(1, None, None),\n", + " name='look_ahead_mask')(dec_inputs)\n", + "\n", + " # 디코더의 패딩 마스크(두번째 서브층)\n", + " dec_padding_mask = tf.keras.layers.Lambda(\n", + " create_padding_mask, output_shape=(1, 1, None),\n", + " name='dec_padding_mask')(inputs)\n", + "\n", + " # 인코더의 출력은 enc_outputs. 디코더로 전달된다.\n", + " enc_outputs = encoder(vocab_size=vocab_size, num_layers=num_layers, dff=dff,\n", + " d_model=d_model, num_heads=num_heads, dropout=dropout,\n", + " )(inputs=[inputs, enc_padding_mask]) # 인코더의 입력은 입력 문장과 패딩 마스크\n", + "\n", + " # 디코더의 출력은 dec_outputs. 출력층으로 전달된다.\n", + " dec_outputs = decoder(vocab_size=vocab_size, num_layers=num_layers, dff=dff,\n", + " d_model=d_model, num_heads=num_heads, dropout=dropout,\n", + " )(inputs=[dec_inputs, enc_outputs, look_ahead_mask, dec_padding_mask])\n", + "\n", + " # 다음 단어 예측을 위한 출력층\n", + " outputs = tf.keras.layers.Dense(units=vocab_size, name=\"outputs\")(dec_outputs)\n", + "\n", + " return tf.keras.Model(inputs=[inputs, dec_inputs], outputs=outputs, name=name)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "157eba42", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "id": "157eba42", + "outputId": "52e4255a-815c-473f-9279-eaabddba93f7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 9000, 128)\n", + "(1, 9000, 128)\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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knrnnXdWrlz51VdfNTQ0MJ0FAAAAACTB4AIAACivwMDAt2/fnjhxgukgAAAAACAJBhcAAEB59e3bd968eREREUwHAQAAAABJMLgAAABKbdWqVQ8ePLhy5QrTQQAAAACgQxhcUDfLli3T1dVlsViZmZmSXzp37py+vv5PP/3ERMzu27lzp76+frs7KA8q2ktycunSpZCQkKSkJBsbGxaLxWKxWs0ROHXqVF1dXU1NzWHDht27d09hwRiJdPr06d27d4tEIhm2Ce1ycnJ69913v/nmG6aDAACAspNQCfeQutaEarZf/v7+rL8sXLiw5UuoY1tqW8empKSIu87ExKR7zWJwQd0cPXr022+/leYliqIUFUqWQkJC/vnPfypscyraS/KwZcuWqKioDRs2eHt7P3361NbW1tjYOC4u7uzZs+J1Ll68mJCQMGvWrOzsbCcnJ4VlYySSp6cnl8t1d3cvLy+XYbPQrsDAwNTU1KdPnzIdBAAAlJqESriH1LUmVL/9MjIySktLy8nJiYmJES9EHdtK2zp29uzZBQUFV69e9fDw6HazGFzovWbOnFlRUTFr1iymgyg1efdSXV2dq6urnBqXoV27dp08efLUqVO6urrihVFRURoaGgKBoKKigsFsLSk4UmBg4MiRIz08PJqamhSwud7My8vL0tKyZZUAAACgSOpaE6rffvF4vOnTp9vb22tra9NLUMe2q1Udy2KxLC0t3dzcBg0a1O02MbighlgsVjdekh5FUQkJCUeOHOl5UxATE1NUVMR0ik7k5eVt3rx569atXC635XJXV9egoKCXL1+uWbOGqWytKD5SWFhYZmbmvn37FLO5XovNZi9YsCAuLk79/sECAACyJZNyV/FUoibsBsb3C3WsBDKvYzG40AUikSg0NNTa2prH440YMSI+Pp4QEh0draOjw+fzU1NTZ8yYoaenZ2Vl1XLWtGPHjo0dO5bL5ero6AwYMGD79u0SNhEVFcXlcs3MzPz9/fv27cvlcl1dXTMyMuhXr1275uDgoK+vz+VyHR0dL1y4QC+nKGrPnj2DBw/W1tbW19dfu3atuMGOXrp+/bq1tTWLxTpw4ECneyESib788svBgwfzeDwTE5OBAwd++eWX8+bNk7Aj+/bt09HR0dDQGDNmjLm5OYfD0dHRcXJycnNz69evH5fLNTAw+OKLL8Trd7RrV65c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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "small_transformer = transformer(\n", + " vocab_size = 9000,\n", + " num_layers = 4,\n", + " dff = 512,\n", + " d_model = 128,\n", + " num_heads = 4,\n", + " dropout = 0.3,\n", + " name=\"small_transformer\")\n", + "\n", + "tf.keras.utils.plot_model(\n", + " small_transformer, to_file='small_transformer.png', show_shapes=True)" + ] + }, + { + "cell_type": "markdown", + "id": "6f6a3a83", + "metadata": { + "id": "6f6a3a83" + }, + "source": [ + "## 손실함수" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "87a3d5ec", + "metadata": { + "id": "87a3d5ec" + }, + "outputs": [], + "source": [ + "def loss_function(y_true, y_pred):\n", + " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1))\n", + "\n", + " loss = tf.keras.losses.SparseCategoricalCrossentropy(\n", + " from_logits=True, reduction='none')(y_true, y_pred)\n", + "\n", + " mask = tf.cast(tf.not_equal(y_true, 0), tf.float32)\n", + " loss = tf.multiply(loss, mask)\n", + "\n", + " return tf.reduce_mean(loss)" + ] + }, + { + "cell_type": "markdown", + "id": "8a831e8a", + "metadata": { + "id": "8a831e8a" + }, + "source": [ + "## custom schedule" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2f74e232", + "metadata": { + "id": "2f74e232" + }, + "outputs": [], + "source": [ + "class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):\n", + "\n", + " def __init__(self, d_model, warmup_steps=4000):\n", + " super(CustomSchedule, self).__init__()\n", + " self.d_model = d_model\n", + " self.d_model = tf.cast(self.d_model, tf.float32)\n", + " self.warmup_steps = warmup_steps\n", + "\n", + " def __call__(self, step):\n", + " arg1 = tf.math.rsqrt(step)\n", + " arg2 = step * (self.warmup_steps**-1.5)\n", + "\n", + " return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4fb94965", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 467 + }, + "id": "4fb94965", + "outputId": "27bd8827-3790-446e-e14b-d287a3b1d71b" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0.5, 0, 'Train Step')" + ] + }, + "metadata": {}, + "execution_count": 19 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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kydL+3NzczFy5Ejcdddd2LNnD3788UcUFhbioYcesql+zUlaUsEOd/9ZDOwQCpkMOKwtRb6+6voHEBER3cyEjXbu3Ck2bdokhBAiPz9fJCUlicDAQHHLLbeInJwcm841YMAAMWXKFOmzyWQSkZGRIi0trd74Rx99VIwYMcJqW3x8vHjqqaeEEEKYzWah0WjEokWLpP0lJSVCqVSKL774QgghxMGDBwUAsXPnTinmhx9+EDKZTJw9e1YIIcTatWuFt7e3MJlMUsy3334rZDKZMBqNja6fTqcTAIROp2v0MU018p2tInrGevHTAa1dz/tA3Xm/yDpl1/MSERG5qqa23zb3VPXr1w933nkngNrhv/T0dOj1emRnZ6N3796NPo/RaER2djYSExOlbXK5HImJicjMzKz3mMzMTKt4AEhKSpLic3NzodVqrWLUajXi4+OlmMzMTAQHB6Nfv35STGJiIuRyObKysgAAffv2hVwuxyeffAKTyQSdTof//Oc/SExMhI/Pte+CMxgM0Ov1Vq/mIi2p4GWfJRUs7uocBgDYdLj+3kMiIiKqZbcJOLt378Z9993X6PjCwkKYTCaEh4dbbQ8PD4dWq633GK1W22C85f16MWFhYVb7vb29ERISIsXExMTgp59+wqxZs6BUKhEcHIwzZ87gyy+/bLBOaWlpUKvV0isqKqrBeHtyxJwqALirS+3vauuxQhhqrn6QNhEREdWyqQX+8ccf8cILL2DWrFk4ceIEAODw4cNITk5G//79pUfZuDutVotJkyZh/Pjx2LlzJ3755RcoFAr85S9/gRDimsfNnDkTOp1OejVl4n5TWdapsteSChbdI4PQKlCJCqMJO3K5tAIREdG1NHrxz48++giTJk1CSEgILl68iA8//BCvv/46nnvuOYwaNQr79+9H165dG33h0NBQeHl5IT8/32p7fn4+NBpNvcdoNJoG4y3v+fn5iIiIsIqxDE1qNJqrJsLX1NSguLhYOn7p0qVQq9VYuHChFPPZZ58hKioKWVlZuPXWW+stn1KphFKpvF7VHcLogInqACCXy3Bn51b4ctcZbD58AYNjW9n1/ERERJ6i0d0ab731Fv7973+jsLAQX375JQoLC/Huu+/ijz/+wLJly2xKqABAoVCgb9++yMjIkLaZzWZkZGQgISGh3mMSEhKs4gFg48aNUnxMTAw0Go1V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I1bb3fW727x5c73/TY4fP14IUXub+Jw5c0R4eLhQKpVi6NChV9W9qKhIjBkzRgQEBIigoCAxYcIEUVpaahWzd+9eMWjQIKFUKkXr1q3FggULrirLl19+KTp16iQUCoXo3r27+P777632N6YsttQvNzf3mv8mLWuPZWdni/j4eKFWq4VKpRJdu3YV//rXv6wSEmfW73p1rKioEPfcc49o1aqV8PHxEdHR0WLSpElXJeDu+h1avP/++8LX11eUlJRcdbyrf4fXaxeEcK2/nY0py/XI6ipORERERDeAc6qIiIiI7IBJFREREZEdMKkiIiIisgMmVURERER2wKSKiIiIyA6YVBERERHZAZMqIiIiIjtgUkVERERkB0yqiIgAtGvXDm+++aazi0FEboxJFRG5FZlM1uDrH//4R5POu3PnTkyePPmGypabm4u//vWviIyMhEqlQps2bTBy5EgcPnwYAHDy5EnIZDLpgdRE5Fm8nV0AIiJbnD9/Xvp5zZo1SE1NxZEjR6RtAQEB0s9CCJhMJnh7X/9PXatWrW6oXNXV1bj77rvRuXNnfP3114iIiMCZM2fwww8/oKSk5IbOTUTugT1VRORWNBqN9FKr1ZDJZNLnw4cPIzAwED/88AP69u0LpVKJrVu34vjx4xg5ciTCw8MREBCA/v374+eff7Y675XDfzKZDB9++CEefPBB+Pn5ITY2Ft9+++01y3XgwAEcP34c7777Lm699VZER0fjtttuw/z583HrrbcCAGJiYgAAffr0gUwmwx133CEd/+GHH6Jr165QqVTo0qUL3n33XWmfpYdr9erVGDhwIFQqFXr06IFffvnFDr9RIrIXJlVE5HFefvllLFiwAIcOHULPnj1RVlaG4cOHIyMjAzk5ORg2bBjuv/9+5OXlNXieV155BY8++ij27duH4cOHY+zYsSguLq43tlWrVpDL5fjqq69gMpnqjdmxYwcA4Oeff8b58+fx9ddfAwA+//xzpKam4tVXX8WhQ4fwr3/9C3PmzMHKlSutjn/xxRcxffp05OTkICEhAffffz+Kiops/fUQkaMIIiI39cknnwi1Wi193rx5swAg1q1bd91ju3fvLt5++23pc3R0tHjjjTekzwDE7Nmzpc9lZWUCgPjhhx+uec533nlH+Pn5icDAQHHnnXeKefPmiePHj0v7c3NzBQCRk5NjdVyHDh3EqlWrrLb985//FAkJCVbHLViwQNpfXV0t2rRpI/79739ft65E1DzYU0VEHqdfv35Wn8vKyvDCCy+ga9euCA4ORkBAAA4dOnTdnqqePXtKP/v7+yMoKAgFBQXXjJ8yZQq0Wi0+//xzJCQkYO3atejevTs2btx4zWPKy8tx/PhxTJw4EQEBAdJr/vz5OH78uFVsQkKC9LO3tzf69euHQ4cONVgHImo+nKhORB7H39/f6vMLL7yAjRs3YvHixejYsSN8fX3xl7/8BUajscHz+Pj4WH2WyWQwm80NHhMYGIj7778f999/P+bPn4+kpCTMnz8fd999d73xZWVlAIAPPvgA8fHxVvu8vLwavBYRuRb2VBGRx9u2bRsef/xxPPjgg4iLi4NGo8HJkycdfl2ZTIYuXbqgvLwcAKBQKADAas5VeHg4IiMjceLECXTs2NHqZZnYbvH7779LP9fU1CA7Oxtdu3Z1eD2IqHHYU0VEHi82NhZff/017r//fshkMsyZM+e6PU622rNnD+bOnYvHHnsM3bp1g0KhwC+//IKPP/4YM2bMAACEhYXB19cX6enpaNOmDVQqFdRqNV555RU8//zzUKvVGDZsGAwGA3bt2oWLFy8iJSVFusbSpUsRGxuLrl274o033sDFixfxxBNP2LUeRNR0TKqIyOO9/vrreOKJJzBw4ECEhoZixowZ0Ov1dr1GmzZt0K5dO7zyyivSEgiWz3/7298A1M6DWrJkCebNm4fU1FQMHjwYW7ZswZNPPgk/Pz8sWrQIL774Ivz9/REXF4dp06ZZXWPBggVYsGAB9uzZg44dO+Lbb79FaGioXetBRE0nE0IIZxeCiIiu7eTJk4iJiUFOTg569+7t7OIQ0TVwThURERGRHTCpIiIiIrIDDv8RERER2QF7qoiIiIjsgEkVERERkR0wqSIiIiKyAyZVRERERHbApIqIiIjIDphUEREREdkBkyoiIiIiO2BSRURERGQH/x9J7OoaV4icwwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ], + "source": [ + "sample_learning_rate = CustomSchedule(d_model=128)\n", + "\n", + "plt.plot(sample_learning_rate(tf.range(200000, dtype=tf.float32)))\n", + "plt.ylabel(\"Learning Rate\")\n", + "plt.xlabel(\"Train Step\")" + ] + }, + { + "cell_type": "markdown", + "id": "926cf6fb", + "metadata": { + "id": "926cf6fb" + }, + "source": [ + "## 챗봇 구현(에러 발생...)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "679eb7b4", + "metadata": { + "id": "679eb7b4" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import urllib.request\n", + "import tensorflow_datasets as tfds\n", + "import tensorflow as tf\n", + "import time\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "0812f07a", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "0812f07a", + "outputId": "d36dd8e2-823e-4774-993f-08447534bc7c" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " Q A label\n", + "0 12시 땡! 하루가 또 가네요. 0\n", + "1 1지망 학교 떨어졌어 위로해 드립니다. 0\n", + "2 3박4일 놀러가고 싶다 여행은 언제나 좋죠. 0\n", + "3 3박4일 정도 놀러가고 싶다 여행은 언제나 좋죠. 0\n", + "4 PPL 심하네 눈살이 찌푸려지죠. 0" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
QAlabel
012시 땡!하루가 또 가네요.0
11지망 학교 떨어졌어위로해 드립니다.0
23박4일 놀러가고 싶다여행은 언제나 좋죠.0
33박4일 정도 놀러가고 싶다여행은 언제나 좋죠.0
4PPL 심하네눈살이 찌푸려지죠.0
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 21 + } + ], + "source": [ + "urllib.request.urlretrieve(\"https://raw.githubusercontent.com/songys/Chatbot_data/master/ChatbotData.csv\", filename=\"ChatBotData.csv\")\n", + "\n", + "train_data = pd.read_csv('ChatBotData.csv')\n", + "train_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "d1f50783", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "d1f50783", + "outputId": "3fb447e3-5256-4e68-d67f-4a17b93e4ad0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "챗봇 샘플의 개수 : 11823\n" + ] + } + ], + "source": [ + "print('챗봇 샘플의 개수 :', len(train_data))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "26b363cf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "26b363cf", + "outputId": "dcc3b194-f8f8-4743-d49b-3370dc2148c5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Q 0\n", + "A 0\n", + "label 0\n", + "dtype: int64\n" + ] + } + ], + "source": [ + "print(train_data.isnull().sum())" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "1102ec24", + "metadata": { + "id": "1102ec24" + }, + "outputs": [], + "source": [ + "questions = []\n", + "for sentence in train_data['Q']:\n", + " # 구두점에 대해서 띄어쓰기\n", + " # ex) 12시 땡! -> 12시 땡 !\n", + " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", + " sentence = sentence.strip()\n", + " questions.append(sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "3f52fe1a", + "metadata": { + "id": "3f52fe1a" + }, + "outputs": [], + "source": [ + "answers = []\n", + "for sentence in train_data['A']:\n", + " # 구두점에 대해서 띄어쓰기\n", + " # ex) 12시 땡! -> 12시 땡 !\n", + " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", + " sentence = sentence.strip()\n", + " answers.append(sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3ae1ec7c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3ae1ec7c", + "outputId": "dd7b75ea-6988-4c9f-d1ff-9a8d15c0a65f" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "11823" + ] + }, + "metadata": {}, + "execution_count": 26 + } + ], + "source": [ + "len(questions)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "f35b2147", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f35b2147", + "outputId": "fdf61d35-8214-475a-b13c-ee23564caa2b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['12시 땡 !', '1지망 학교 떨어졌어', '3박4일 놀러가고 싶다', '3박4일 정도 놀러가고 싶다', 'PPL 심하네']\n", + "['하루가 또 가네요 .', '위로해 드립니다 .', '여행은 언제나 좋죠 .', '여행은 언제나 좋죠 .', '눈살이 찌푸려지죠 .']\n" + ] + } + ], + "source": [ + "print(questions[:5])\n", + "print(answers[:5])" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "b235a60b", + "metadata": { + "id": "b235a60b" + }, + "outputs": [], + "source": [ + "# 서브워드텍스트인코더를 사용하여 질문과 답변을 모두 포함한 단어 집합(Vocabulary) 생성\n", + "tokenizer = tfds.deprecated.text.SubwordTextEncoder.build_from_corpus(\n", + " questions + answers, target_vocab_size=2**13)\n", + "\n", + "# 시작 토큰과 종료 토큰에 대한 정수 부여.\n", + "START_TOKEN, END_TOKEN = [tokenizer.vocab_size], [tokenizer.vocab_size + 1]\n", + "\n", + "# 시작 토큰과 종료 토큰을 고려하여 단어 집합의 크기를 + 2\n", + "VOCAB_SIZE = tokenizer.vocab_size + 2" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "ec13eac8", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ec13eac8", + "outputId": "926a89b4-ff93-4952-9ad5-1c5d983e383d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "시작 토큰 번호 : [8178]\n", + "종료 토큰 번호 : [8179]\n", + "단어 집합의 크기 : 8180\n" + ] + } + ], + "source": [ + "print('시작 토큰 번호 :',START_TOKEN)\n", + "print('종료 토큰 번호 :',END_TOKEN)\n", + "print('단어 집합의 크기 :',VOCAB_SIZE)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "119e6ab7", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "119e6ab7", + "outputId": "8ab5a0da-1f00-4d2c-a0f9-069bb6828d51" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Tokenized sample question: [5766, 611, 3509, 141, 685, 3747, 849]\n" + ] + } + ], + "source": [ + "# 서브워드텍스트인코더 토크나이저의 .encode()를 사용하여 텍스트 시퀀스를 정수 시퀀스로 변환.\n", + "print('Tokenized sample question: {}'.format(tokenizer.encode(questions[20])))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "76c5cea6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "76c5cea6", + "outputId": "73c22222-1501-4885-f7b1-62e37fcc25d2" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "정수 인코딩 후의 문장 [5766, 611, 3509, 141, 685, 3747, 849]\n", + "기존 문장: 가스비 비싼데 감기 걸리겠어\n" + ] + } + ], + "source": [ + "# 서브워드텍스트인코더 토크나이저의 .encode()와 decode() 테스트해보기\n", + "\n", + "# 임의의 입력 문장을 sample_string에 저장\n", + "sample_string = questions[20]\n", + "\n", + "# encode() : 텍스트 시퀀스 --> 정수 시퀀스\n", + "tokenized_string = tokenizer.encode(sample_string)\n", + "print ('정수 인코딩 후의 문장 {}'.format(tokenized_string))\n", + "\n", + "# decode() : 정수 시퀀스 --> 텍스트 시퀀스\n", + "original_string = tokenizer.decode(tokenized_string)\n", + "print ('기존 문장: {}'.format(original_string))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "292f4b8e", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "292f4b8e", + "outputId": "26aa3f5b-f03a-4134-cd23-9e43e982bdf6" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "5766 ----> 가스\n", + "611 ----> 비 \n", + "3509 ----> 비싼\n", + "141 ----> 데 \n", + "685 ----> 감기 \n", + "3747 ----> 걸리\n", + "849 ----> 겠어\n" + ] + } + ], + "source": [ + "# 각 정수는 각 단어와 어떻게 mapping되는지 병렬로 출력\n", + "# 서브워드텍스트인코더는 의미있는 단위의 서브워드로 토크나이징한다. 띄어쓰기 단위 X 형태소 분석 단위 X\n", + "for ts in tokenized_string:\n", + " print ('{} ----> {}'.format(ts, tokenizer.decode([ts])))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "ba9b3992", + "metadata": { + "id": "ba9b3992" + }, + "outputs": [], + "source": [ + "\n", + "# 최대 길이를 40으로 정의\n", + "MAX_LENGTH = 40\n", + "\n", + "# 토큰화 / 정수 인코딩 / 시작 토큰과 종료 토큰 추가 / 패딩\n", + "def tokenize_and_filter(inputs, outputs):\n", + " tokenized_inputs, tokenized_outputs = [], []\n", + " \n", + " for (sentence1, sentence2) in zip(inputs, outputs):\n", + " # encode(토큰화 + 정수 인코딩), 시작 토큰과 종료 토큰 추가\n", + " sentence1 = START_TOKEN + tokenizer.encode(sentence1) + END_TOKEN\n", + " sentence2 = START_TOKEN + tokenizer.encode(sentence2) + END_TOKEN\n", + "\n", + " tokenized_inputs.append(sentence1)\n", + " tokenized_outputs.append(sentence2)\n", + " \n", + " # 패딩\n", + " tokenized_inputs = tf.keras.preprocessing.sequence.pad_sequences(\n", + " tokenized_inputs, maxlen=MAX_LENGTH, padding='post')\n", + " tokenized_outputs = tf.keras.preprocessing.sequence.pad_sequences(\n", + " tokenized_outputs, maxlen=MAX_LENGTH, padding='post')\n", + " \n", + " return tokenized_inputs, tokenized_outputs" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "264dbae5", + "metadata": { + "id": "264dbae5" + }, + "outputs": [], + "source": [ + "questions, answers = tokenize_and_filter(questions, answers)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "f44c01b2", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f44c01b2", + "outputId": "470ab03e-9da2-439f-ac4d-52b9afd92815" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "질문 데이터의 크기(shape) : (11823, 40)\n", + "답변 데이터의 크기(shape) : (11823, 40)\n" + ] + } + ], + "source": [ + "print('질문 데이터의 크기(shape) :', questions.shape)\n", + "print('답변 데이터의 크기(shape) :', answers.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "f20ba0f6", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f20ba0f6", + "outputId": "c1de030a-f585-4ce0-eed9-ff1bc0559b68" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[8178 7915 4207 3060 41 8179 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0]\n" + ] + } + ], + "source": [ + "# 0번째 샘플을 임의로 출력\n", + "print(questions[0])\n", + "print(answers[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "1d8e9818", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1d8e9818", + "outputId": "b6333449-c130-4f54-e2ac-07093f999d61" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "단어 집합의 크기(Vocab size): 8180\n", + "전체 샘플의 수(Number of samples): 11823\n" + ] + } + ], + "source": [ + "print('단어 집합의 크기(Vocab size): {}'.format(VOCAB_SIZE))\n", + "print('전체 샘플의 수(Number of samples): {}'.format(len(questions)))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e011f216", + "metadata": { + "id": "e011f216" + }, + "outputs": [], + "source": [ + "# 텐서플로우 dataset을 이용하여 셔플(shuffle)을 수행하되, 배치 크기로 데이터를 묶는다.\n", + "# 또한 이 과정에서 교사 강요(teacher forcing)을 사용하기 위해서 디코더의 입력과 실제값 시퀀스를 구성한다.\n", + "BATCH_SIZE = 64\n", + "BUFFER_SIZE = 20000\n", + "\n", + "# 디코더의 실제값 시퀀스에서는 시작 토큰을 제거해야 한다.\n", + "dataset = tf.data.Dataset.from_tensor_slices((\n", + " {\n", + " 'inputs': questions,\n", + " 'dec_inputs': answers[:, :-1] # 디코더의 입력. 마지막 패딩 토큰이 제거된다.\n", + " },\n", + " {\n", + " 'outputs': answers[:, 1:] # 맨 처음 토큰이 제거된다. 다시 말해 시작 토큰이 제거된다.\n", + " },\n", + "))\n", + "\n", + "dataset = dataset.cache()\n", + "dataset = dataset.shuffle(BUFFER_SIZE)\n", + "dataset = dataset.batch(BATCH_SIZE)\n", + "dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "3eee07a4", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3eee07a4", + "outputId": "e9093523-8ecb-4b7c-cb9f-dc57708b14ce" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0]]\n", + "[[3844 74 7894 1 8179 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0]]\n" + ] + } + ], + "source": [ + "# 임의의 샘플에 대해서 [:, :-1]과 [:, 1:]이 어떤 의미를 가지는지 테스트해본다.\n", + "print(answers[0]) # 기존 샘플\n", + "print(answers[:1][:, :-1]) # 마지막 패딩 토큰 제거하면서 길이가 39가 된다.\n", + "print(answers[:1][:, 1:]) # 맨 처음 토큰이 제거된다. 다시 말해 시작 토큰이 제거된다. 길이는 역시 39가 된다." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "47989253", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "47989253", + "outputId": "1e92bb30-e13d-48d5-bbe7-d91fba438727" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 8180, 256)\n", + "(1, 8180, 256)\n" + ] + } + ], + "source": [ + "tf.keras.backend.clear_session()\n", + "\n", + "# Hyper-parameters\n", + "NUM_LAYERS = 2\n", + "D_MODEL = 256\n", + "NUM_HEADS = 8\n", + "DFF = 512\n", + "DROPOUT = 0.1\n", + "\n", + "model = transformer(\n", + " vocab_size=VOCAB_SIZE,\n", + " num_layers=NUM_LAYERS,\n", + " dff=DFF,\n", + " d_model=D_MODEL,\n", + " num_heads=NUM_HEADS,\n", + " dropout=DROPOUT)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "1a89e01d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 470 + }, + "id": "1a89e01d", + "outputId": "058dcfe2-f019-41cf-a0df-e1f4a616251f" + }, + "outputs": [ + { + "output_type": "error", + "ename": "InvalidArgumentError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mInvalidArgumentError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mlearning_rate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCustomSchedule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mD_MODEL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m optimizer = tf.keras.optimizers.Adam(\n\u001b[0m\u001b[1;32m 6\u001b[0m learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9)\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/keras/optimizers/adam.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, learning_rate, beta_1, beta_2, epsilon, amsgrad, weight_decay, clipnorm, clipvalue, global_clipnorm, use_ema, ema_momentum, ema_overwrite_frequency, jit_compile, name, **kwargs)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 115\u001b[0m )\n\u001b[0;32m--> 116\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_learning_rate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_build_learning_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlearning_rate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 117\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta_1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta_2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer.py\u001b[0m in \u001b[0;36m_build_learning_rate\u001b[0;34m(self, learning_rate)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;31m# Create a variable to hold the current learning rate.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m current_learning_rate = tf.convert_to_tensor(\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0mlearning_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miterations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m )\n\u001b[1;32m 386\u001b[0m self._current_learning_rate = tf.Variable(\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, step)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0marg1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrsqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0marg2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarmup_steps\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1.5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/tensorflow/python/util/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 153\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_tb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 154\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 155\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mfiltered_tb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/tensorflow/python/framework/ops.py\u001b[0m in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m 7260\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mraise_from_not_ok_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7261\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\" name: \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7262\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_status_to_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;31m# pylint: disable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7264\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mInvalidArgumentError\u001b[0m: Value for attr 'T' of int64 is not in the list of allowed values: bfloat16, half, float, double, complex64, complex128\n\t; NodeDef: {{node Rsqrt}}; Op y:T; attr=T:type,allowed=[DT_BFLOAT16, DT_HALF, DT_FLOAT, DT_DOUBLE, DT_COMPLEX64, DT_COMPLEX128]> [Op:Rsqrt]" + ] + } + ], + "source": [ + "MAX_LENGTH = 40\n", + "\n", + "learning_rate = CustomSchedule(D_MODEL)\n", + "\n", + "optimizer = tf.keras.optimizers.Adam(\n", + " learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9)\n", + "\n", + "def accuracy(y_true, y_pred):\n", + " # ensure labels have shape (batch_size, MAX_LENGTH - 1)\n", + " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1))\n", + " return tf.keras.metrics.sparse_categorical_accuracy(y_true, y_pred)\n", + "\n", + "model.compile(optimizer=optimizer, loss=loss_function, metrics=[accuracy])\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68491949", + "metadata": { + "id": "68491949" + }, + "outputs": [], + "source": [ + "EPOCHS = 50\n", + "\n", + "model.fit(dataset, epochs=EPOCHS)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f576ef8", + "metadata": { + "id": "5f576ef8" + }, + "outputs": [], + "source": [ + "def evaluate(sentence):\n", + " sentence = preprocess_sentence(sentence)\n", + "\n", + " sentence = tf.expand_dims(\n", + " START_TOKEN + tokenizer.encode(sentence) + END_TOKEN, axis=0)\n", + "\n", + " output = tf.expand_dims(START_TOKEN, 0)\n", + "\n", + " # 디코더의 예측 시작\n", + " for i in range(MAX_LENGTH):\n", + " predictions = model(inputs=[sentence, output], training=False)\n", + "\n", + " # 현재(마지막) 시점의 예측 단어를 받아온다.\n", + " predictions = predictions[:, -1:, :]\n", + " predicted_id = tf.cast(tf.argmax(predictions, axis=-1), tf.int32)\n", + "\n", + " # 만약 마지막 시점의 예측 단어가 종료 토큰이라면 예측을 중단\n", + " if tf.equal(predicted_id, END_TOKEN[0]):\n", + " break\n", + "\n", + " # 마지막 시점의 예측 단어를 출력에 연결한다.\n", + " # 이는 for문을 통해서 디코더의 입력으로 사용될 예정이다.\n", + " output = tf.concat([output, predicted_id], axis=-1)\n", + "\n", + " return tf.squeeze(output, axis=0)\n", + "\n", + "\n", + "def predict(sentence):\n", + " prediction = evaluate(sentence)\n", + "\n", + " predicted_sentence = tokenizer.decode(\n", + " [i for i in prediction if i < tokenizer.vocab_size])\n", + "\n", + " print('Input: {}'.format(sentence))\n", + " print('Output: {}'.format(predicted_sentence))\n", + "\n", + " return predicted_sentence" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "542ff26e", + "metadata": { + "id": "542ff26e" + }, + "outputs": [], + "source": [ + "def preprocess_sentence(sentence):\n", + " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", + " sentence = sentence.strip()\n", + " return sentence" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb3fbe78", + "metadata": { + "id": "cb3fbe78" + }, + "outputs": [], + "source": [ + "output = predict('영화 볼래?')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc6e462e", + "metadata": { + "id": "bc6e462e" + }, + "outputs": [], + "source": [ + "output = predict(\"고민이 있어\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59117715", + "metadata": { + "id": "59117715" + }, + "outputs": [], + "source": [ + "output = predict(\"너무 화가나\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b9eeaf7", + "metadata": { + "id": "4b9eeaf7" + }, + "outputs": [], + "source": [ + "output = predict(\"게임하고싶은데 할래?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3782229", + "metadata": { + "id": "f3782229" + }, + "outputs": [], + "source": [ + "output = predict(\"나 너 좋아하는 것 같아\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffb0a0d3", + "metadata": { + "id": "ffb0a0d3" + }, + "outputs": [], + "source": [ + "output = predict(\"딥 러닝 자연어 처리를 잘 하고 싶어\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "colab": { + "provenance": [], + "collapsed_sections": [ + "926cf6fb" + ], + "include_colab_link": true + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file From 7bb054e461db49f2688735f6135c3f593d6c3787 Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Wed, 26 Apr 2023 11:17:53 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Transcribe_TransformerKoreanChatbot.ipynb | 1173 ++++----------------- 1 file changed, 213 insertions(+), 960 deletions(-) diff --git a/Transcribe_TransformerKoreanChatbot.ipynb b/Transcribe_TransformerKoreanChatbot.ipynb index b98685a..2748a8f 100644 --- a/Transcribe_TransformerKoreanChatbot.ipynb +++ b/Transcribe_TransformerKoreanChatbot.ipynb @@ -10,6 +10,20 @@ "\"Open" ] }, + { + "cell_type": "markdown", + "source": [ + "## Transformer를 사용하는 데 쓰이는 라이브러리\n", + "- tensorflow(아래 구현 코드에서 확인 가능)\n", + "- pytorch\n", + "- huggingface transformers\n", + "- fairseq" + ], + "metadata": { + "id": "DXRgJAGiD0-Z" + }, + "id": "DXRgJAGiD0-Z" + }, { "cell_type": "markdown", "id": "2fe11c0f", @@ -22,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "bbebe731", "metadata": { "id": "bbebe731" @@ -74,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "92cc660a", "metadata": { "colab": { @@ -113,29 +127,51 @@ "## Positional Encoding 구현" ] }, + { + "cell_type": "markdown", + "source": [ + "Tensorflow 및 Keras에서 Positional Encoding 레이어를 정의하는 내용.\n", + "- transformer의 입력 시퀀스에 위치 인코딩을 추가해주는 역할\n", + " - 위치 인코딩 : 입력 시퀀스의 토큰 위치에 대한 정보를 모델에 제공하기 위해 사용되며, 이는 시퀀스의 순서와 문맥을 이해하는 데 중요함." + ], + "metadata": { + "id": "5mPnbVw6T50X" + }, + "id": "5mPnbVw6T50X" + }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "d833813b", "metadata": { "id": "d833813b" }, "outputs": [], "source": [ - "class PositionalEncoding(tf.keras.layers.Layer):\n", - " def __init__(self, position, d_model):\n", + "class PositionalEncoding(tf.keras.layers.Layer): #tf.keras.layers.Layer를 상속받음\n", + " def __init__(self, position, d_model): \n", + " #position:입력시퀀스의 최대길이, d_model:입력 임베딩의 차원\n", " super(PositionalEncoding, self).__init__()\n", " self.pos_encoding = self.positional_encoding(position, d_model)\n", "\n", " def get_angles(self, position, i, d_model):\n", + " #모든 위치, 임베딩 차원에 대한 각도 배열 반환.\n", + " # i : 각도의 인덱스\n", + " ## 짝수면 2로 나뉘어져서 지수가 0 -> sin함수 쓸 때 사용되는 각도 생성\n", + " ## 홀수면 지수가 1 -> cos함수 쓸 때 사용되는 각도 생성\n", " angles = 1 / tf.pow(10000, (2 * (i // 2)) / tf.cast(d_model, tf.float32))\n", " return position * angles\n", + " # tf.pow : x^y\n", + " # tf.cast:배열의 데이터타입을 바꿔줌. 여기선 d_model을 float32형태로 변화.\n", "\n", " def positional_encoding(self, position, d_model):\n", + " \n", + " #get_angles 함수 : 인코딩할 단어 위치(position), 임베딩 차원(d_model),\n", + " #인덱스(i)에 따라 각도(angles) 계산함\n", " angle_rads = self.get_angles(\n", " position=tf.range(position, dtype=tf.float32)[:, tf.newaxis],\n", " i=tf.range(d_model, dtype=tf.float32)[tf.newaxis, :],\n", - " d_model=d_model)\n", + " d_model=d_model) \n", "\n", " # 배열의 짝수 인덱스(2i)에는 사인 함수 적용\n", " sines = tf.math.sin(angle_rads[:, 0::2])\n", @@ -143,22 +179,41 @@ " # 배열의 홀수 인덱스(2i+1)에는 코사인 함수 적용\n", " cosines = tf.math.cos(angle_rads[:, 1::2])\n", "\n", - " angle_rads = np.zeros(angle_rads.shape)\n", + " angle_rads = np.zeros(angle_rads.shape) \n", + " #계산된 sines와 cosines를 이용해 각도 배열(angle_rads) 만듦\n", " angle_rads[:, 0::2] = sines\n", " angle_rads[:, 1::2] = cosines\n", " pos_encoding = tf.constant(angle_rads)\n", + " #angle_rads 기반으로 pos_encoding 배열을 만듦\n", + " #이 배열은 angle_rads를 그대로 복사한 다음에, tf.newaxis로 차원을 추가하고\n", " pos_encoding = pos_encoding[tf.newaxis, ...]\n", "\n", " print(pos_encoding.shape)\n", + " #tf.cast를 이용해 float32형태로 변경함\n", " return tf.cast(pos_encoding, tf.float32)\n", + " #해당 배열의 모양은 (1=배치차원, position, d_model)임.\n", + " \n", + " '''\n", + " 딥러닝 모델 학습 시, 데이터셋은 일반적으로 미니배치(minibatch) 단위로 처리됨\n", + " 전체 데이터셋이 아닌 일부 데이터(ex. 32개의 이미지)를 한번에 모델에 입력하고, 그 출력을 이용해 모델을 학습시킴\n", + " 이렇게 모델에 입력되는 데이터의 묶음을 미니 배치라고 하며, 미니배치 단위로 \n", + " 처리하는 건 GPU를 비롯한 하드웨어의 병렬 처리 기능을 활용해 연산 속도를 높일 수 있음.\n", "\n", - " def call(self, inputs):\n", - " return inputs + self.pos_encoding[:, :tf.shape(inputs)[1], :]" + " 배치 차원 = 미니 배치의 크기\n", + " 배열은 1개의 미니배치를 처리함.\n", + " '''\n", + "\n", + " def call(self, inputs): \n", + " #input sequence에 tensor 추가되고, \n", + " #브로드캐스팅을 사용해 위치 인코딩이 시퀀스의 올바른 부분에 추가되도록 보장함.\n", + " ## 브로드캐스팅 : NumPy 및 TensorFlow와 같은 배열/텐서 연산에서 자동으로 배열/텐서의 크기를 조정해 연산이 가능하도록 하는 기능\n", + " return inputs + self.pos_encoding[:, :tf.shape(inputs)[1], :]\n", + " ##self는 pos_encoding의 첫번째 차원인 배치 차원과 동일함." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "026d42a0", "metadata": { "colab": { @@ -189,6 +244,13 @@ ], "source": [ "sample_pos_encoding = PositionalEncoding(50, 128)\n", + "#아까 만든 클래스를 사용해서 생성한 sample_pos_encoding 배열을 시각화함.\n", + "\n", + "#pcolormesh : 2차원 배열을 시각화할 때 사용하며, 배열 값에 따라 색상을 적용해서 이미지 생성함.\n", + "\n", + "#sample_pos_encoding은 tensor 객체이므로, \n", + "#numpy 메소드를 사용해서 tensor를 numpy 배열로 변환한 다음\n", + "#[0]을 사용해서 (batch 차원, position, d_model)에서 인덱스 0인 batch 차원을 없앤 채로 반환함.\n", "\n", "plt.pcolormesh(sample_pos_encoding.pos_encoding.numpy()[0], cmap='RdBu')\n", "plt.xlabel('Depth')\n", @@ -210,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "efddecf0", "metadata": { "id": "efddecf0" @@ -223,8 +285,9 @@ " # value 크기 : (batch_size, num_heads, value의 문장 길이, d_model/num_heads)\n", " # padding_mask : (batch_size, 1, 1, key의 문장 길이)\n", "\n", - " # Q와 K의 곱. 어텐션 스코어 행렬.\n", - " matmul_qk = tf.matmul(query, key, transpose_b=True)\n", + " # Q와 K의 곱. 어텐션 스코어 행렬. \n", + " matmul_qk = tf.matmul(query, key, transpose_b=True) \n", + " #'key'의 transpose를 사용해 key와 query의 dot product를 계산\n", "\n", " # 스케일링\n", " # dk의 루트값으로 나눠준다.\n", @@ -258,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "7618539d", "metadata": { "id": "7618539d" @@ -272,7 +335,8 @@ " self.num_heads = num_heads\n", " self.d_model = d_model\n", "\n", - " assert d_model % self.num_heads == 0\n", + " assert d_model % self.num_heads == 0 \n", + " #d_model을 num_heads로 나눈 값이 정확하게 나누어 떨어지는지 확인하는 용도\n", "\n", " # d_model을 num_heads로 나눈 값.\n", " # 논문 기준 : 64\n", @@ -293,6 +357,17 @@ " return tf.transpose(inputs, perm=[0, 2, 1, 3])\n", "\n", " def call(self, inputs):\n", + " '''\n", + " 1. query, key, value를 각각 Dense 레이어를 통과시켜서 출력값을 얻습니다.\n", + " 2. 각 head로 나눠진 query, key, value를 scaled_dot_product_attention() 함수에 입력값으로 넣어 어텐션을 수행합니다.\n", + " 3. 어텐션의 결과를 다시 transpose() 함수를 이용해 축을 변환합니다.\n", + " 4. 각 head를 다시 연결(concatenate)하여 최종 결과를 얻습니다.\n", + " 5. 결과값을 dense 레이어를 통과시켜 최종 출력값을 구합니다.\n", + " \n", + " query, key, value가 multi-heads 수만큼 나뉘어서 어텐션을 계산\n", + " 각 head는 서로 다른 부분을 학습하기 위해서 존재하며, 이를 통해 모델이 더욱 효과적으로 특징을 추출함\n", + " 출력값으로는 각 단어의 위치와 상관없이 모든 단어가 attention을 받은 정보가 담긴 벡터를 반환함\n", + " '''\n", " query, key, value, mask = inputs['query'], inputs['key'], inputs[\n", " 'value'], inputs['mask']\n", " batch_size = tf.shape(query)[0]\n", @@ -344,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "3d76ee2e", "metadata": { "id": "3d76ee2e" @@ -352,8 +427,11 @@ "outputs": [], "source": [ "def create_padding_mask(x):\n", + "#입력으로 들어온 'x' tensor에서 값이 0인 위치에 1을, 그 외의 위치에 0을 가지는 텐서를 생성하는 함수\n", " mask = tf.cast(tf.math.equal(x, 0), tf.float32)\n", " # (batch_size, 1, 1, key의 문장 길이)\n", + " ## 입력으로 (batch_size, seq_len) 크기의 텐서 x가 주어졌다면, \n", + " ## 이 함수는 (batch_size, 1, 1, seq_len) 크기의 텐서를 반환\n", " return mask[:, tf.newaxis, tf.newaxis, :]" ] }, @@ -369,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "75149d08", "metadata": { "id": "75149d08" @@ -377,6 +455,30 @@ "outputs": [], "source": [ "def encoder_layer(dff, d_model, num_heads, dropout, name=\"encoder_layer\"):\n", + " '''\n", + " dff : feedforward network의 hidden layer에 있는 뉴런 수를 나타내는 정수\n", + " d_model : 모델의 차원을 나타내는 정수. 즉, 임베딩 크기\n", + " num_heads : attention head 개수를 나타내는 정수\n", + " dropout : 드롭아웃 비율을 나타내는 실수\n", + " name : 레이어 이름을 나타내는 문자열\n", + " '''\n", + "\n", + " '''\n", + " 간단히 말하자면\n", + " 1. 입력 데이터(inputs)와 패딩 마스크(padding_mask)를 받고\n", + " 2. 멀티 헤드 어텐션을 수행한 뒤\n", + " 3. 드롭아웃을 적용하고 잔차 연결(residual connection)과 \n", + " 층 정규화(layer normalization)를 수행함\n", + " 4. 포지션 와이즈 피드 포워드 신경망을 수행하는데, \n", + " 이때 입력으로 받은 어텐션 출력(attention)을 사용하고\n", + " 5. 드롭아웃을 적용하고 잔차 연결과 층 정규화를 수행함\n", + "\n", + " return에선 \n", + " - 입력 데이터(inputs)와 패딩 마스크(padding_mask)를 입력으로 받음\n", + " - 출력으로는 두번째 서브층의 입력으로 사용될 어텐션 출력(attention)에 \n", + " 두번째 서브층을 수행한 결과를 더한 결과\n", + " 를 반환하는 tf.keras.Model 객체를 생성\n", + " '''\n", " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", "\n", " # 인코더는 패딩 마스크 사용\n", @@ -395,14 +497,19 @@ " epsilon=1e-6)(inputs + attention)\n", "\n", " # 포지션 와이즈 피드 포워드 신경망 (두번째 서브층)\n", - " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention)\n", - " outputs = tf.keras.layers.Dense(units=d_model)(outputs)\n", + " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention) #ReLU와\n", + " outputs = tf.keras.layers.Dense(units=d_model)(outputs) \n", + " #선형활성화 함수가 있는 두 개의 고밀도 레이어로 구성됨\n", "\n", " # 드롭아웃 + 잔차 연결과 층 정규화\n", " outputs = tf.keras.layers.Dropout(rate=dropout)(outputs)\n", " outputs = tf.keras.layers.LayerNormalization(\n", - " epsilon=1e-6)(attention + outputs)\n", + " epsilon=1e-6)(attention + outputs) \n", + " #attention tensor에 드롭아웃 적용된 출력텐서를 더함\n", + " #그리고 레이어 정규화를 적용해 다른 잔차 연결을 얻음\n", "\n", + " #최종 출력은 output tensor, 출력 텐서를 출력으로 하는 tf.keras.Model 객체를 반환\n", + " #모델 이름은 name\n", " return tf.keras.Model(\n", " inputs=[inputs, padding_mask], outputs=outputs, name=name)\n", " " @@ -410,7 +517,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "edda14f2", "metadata": { "id": "edda14f2" @@ -420,25 +527,33 @@ "def encoder(vocab_size, num_layers, dff,\n", " d_model, num_heads, dropout,\n", " name=\"encoder\"):\n", + " '''\n", + " 다수의 self attention과 feedfoward 신경망으로 구성된 인코더를 구현하는 함수\n", + " '''\n", " inputs = tf.keras.Input(shape=(None,), name=\"inputs\")\n", "\n", " # 인코더는 패딩 마스크 사용\n", " padding_mask = tf.keras.Input(shape=(1, 1, None), name=\"padding_mask\")\n", - "\n", + " #입력문장을 받아들이고 입력 문장에 대한 패딩마스크를 입력으로 받음\n", + " #그리고 입력 문장의 임베딩을 구성한 뒤, positional encoding을 적용함 \n", " # 포지셔널 인코딩 + 드롭아웃\n", " embeddings = tf.keras.layers.Embedding(vocab_size, d_model)(inputs)\n", " embeddings *= tf.math.sqrt(tf.cast(d_model, tf.float32))\n", + " #이때 임베딩 차원 수와 포지셔널 인코딩 차원 수가 같도록 조정해줌\n", " embeddings = PositionalEncoding(vocab_size, d_model)(embeddings)\n", + " #마지막으로 드롭아웃을 적용함.\n", " outputs = tf.keras.layers.Dropout(rate=dropout)(embeddings)\n", "\n", - " # 인코더를 num_layers개 쌓기\n", + " # 인코더 층을 num_layers개 쌓기\n", " for i in range(num_layers):\n", " outputs = encoder_layer(dff=dff, d_model=d_model, num_heads=num_heads,\n", " dropout=dropout, name=\"encoder_layer_{}\".format(i),\n", " )([outputs, padding_mask])\n", + " #encoder_layer 함수를 for문 만큼 사용\n", "\n", " return tf.keras.Model(\n", - " inputs=[inputs, padding_mask], outputs=outputs, name=name)" + " inputs=[inputs, padding_mask], outputs=outputs, name=name)\n", + " #tf.keras.Model 객체를 반환하는데, 반환되는 모델명은 name으로 지정됨." ] }, { @@ -453,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "fed9cc2c", "metadata": { "id": "fed9cc2c" @@ -462,15 +577,33 @@ "source": [ "# 디코더의 첫번째 서브층(sublayer)에서 미래 토큰을 Mask하는 함수\n", "def create_look_ahead_mask(x):\n", + " '''\n", + " 디코더는 현재 위치의 이전 토큰들을 이용해 다음 토큰을 예측하므로, \n", + " 현재 위치 이후에 등장하는 토큰들은 모두 가려주어야 함\n", + " '''\n", " seq_len = tf.shape(x)[1]\n", + " #x 텐서의 shape을 이용해 seq_len을 구함\n", " look_ahead_mask = 1 - tf.linalg.band_part(tf.ones((seq_len, seq_len)), -1, 0)\n", + " #tf.linalg.band_part() : seq_len 크기의 전체 1ㄹ로 구성된 정방행렬 만듦\n", " padding_mask = create_padding_mask(x) # 패딩 마스크도 포함\n", - " return tf.maximum(look_ahead_mask, padding_mask)" + " return tf.maximum(look_ahead_mask, padding_mask)\n", + "'''tf.maximum() 함수: element-wise maximum(각 element 별로 큰 값을 선택하는 함수)\n", + "이전에 만든 패딩 마스크와 조합해 현재 위치의 이후 위치들을 모두 가려주는 마스크를 만들고 반환함.\n", + "\n", + "tf.maximum(look_ahead_mask, padding_mask): element-wise maximum(각 element 별로 큰 값을 선택하는 함수)\n", + "\n", + "- look_ahead_mask : 미래 토큰을 Masking 하는데 사용되는 마스크\n", + "- padding_mask : 패딩 토큰을 Masking 하는데 사용되는 마스크\n", + "\n", + "두 마스크를 maximum 함수에 적용해서 \n", + "\"각 위치에서 패딩토큰과 미래토큰 중 하나가 존재하는 경우에는 해당 위치를 마스킹하도록 결정\"\n", + "-> 이렇게 결합된 마스크는 패딩 및 미래 토큰 모두를 마스킹하는 마스크를 생성함.\n", + "'''" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "e9ba8f4b", "metadata": { "id": "e9ba8f4b" @@ -478,19 +611,28 @@ "outputs": [], "source": [ "def decoder_layer(dff, d_model, num_heads, dropout, name=\"decoder_layer\"):\n", + " #디코더의 sublayer를 구성하는 함수\n", " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", " enc_outputs = tf.keras.Input(shape=(None, d_model), name=\"encoder_outputs\")\n", "\n", " # 디코더는 룩어헤드 마스크(첫번째 서브층)와 패딩 마스크(두번째 서브층) 둘 다 사용.\n", " look_ahead_mask = tf.keras.Input(\n", - " shape=(1, None, None), name=\"look_ahead_mask\")\n", + " shape=(1, None, None), name=\"look_ahead_mask\") #미래토큰을 masking 하도록 사용\n", " padding_mask = tf.keras.Input(shape=(1, 1, None), name='padding_mask')\n", + " # 패딩된 부분을 masking하도록 padding_mask를 사용함.\n", + "\n", + " \n", "\n", " # 멀티-헤드 어텐션 (첫번째 서브층 / 마스크드 셀프 어텐션)\n", " attention1 = MultiHeadAttention(\n", " d_model, num_heads, name=\"attention_1\")(inputs={\n", " 'query': inputs, 'key': inputs, 'value': inputs, # Q = K = V\n", " 'mask': look_ahead_mask # 룩어헤드 마스크\n", + " #look_ahed_mask랑 padding mask 모두 사용하려면\n", + " #look_ahed_mask 함수 내 tf.maximum 함수를 사용해 둘 중 더 큰 값을 선택함.\n", + " \n", + " #그러면 디코더의 첫번째 sublayer에선 미래 정보를 참조 못하고, \n", + " #두번째 sublayer에선 패딩된 부분을 참조하지 못하게 함.\n", " })\n", "\n", " # 잔차 연결과 층 정규화\n", @@ -526,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "66f05031", "metadata": { "id": "66f05031" @@ -575,7 +717,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "dcc9c225", "metadata": { "id": "dcc9c225" @@ -625,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "157eba42", "metadata": { "colab": { @@ -677,12 +819,14 @@ "id": "6f6a3a83" }, "source": [ - "## 손실함수" + "## 손실함수\n", + "- seq2seq에서 사용되는 손실함수\n", + "- 인코더에서 출력된 context vector를 decoder에 입력하고, 디코더에서 이를 기반으로 출력된 문장을 실제 정답 문장과 비교해서 손실을 계산함." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "87a3d5ec", "metadata": { "id": "87a3d5ec" @@ -690,14 +834,25 @@ "outputs": [], "source": [ "def loss_function(y_true, y_pred):\n", - " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1))\n", - "\n", + " #y_true : 실제 정답 문장\n", + " #y_pred : 디코더에서 출력된 모델의 예측값\n", + " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1)) \n", + " '''\n", + " MAX_LENGTH -1의 형태로 reshape하는 이유는 \n", + " 디코더에서 사용되는 'start token'을 제외한 모든 토큰을 포함하기 위함.\n", + " '''\n", " loss = tf.keras.losses.SparseCategoricalCrossentropy(\n", " from_logits=True, reduction='none')(y_true, y_pred)\n", + " #SparseCategoricalCrossentropy : y_true와 y_pred 간의 손실 계산\n", + " #from_logits=True : y_pred가 확률이 아니라 logit값이므로 softmax함수를 거치지 않게끔 함.\n", + " #reduction=none : 배치 단위의 데이터의 평균 대신 각각의 샘플에 대한 손실값을 반환함.\n", "\n", " mask = tf.cast(tf.not_equal(y_true, 0), tf.float32)\n", + " #y_true가 패딩 토큰인 경우에 대한 손실을 제외하고자 마스크를 적용\n", + " #패딩토큰에 해당하는 부분은 mask 변수를 사용해 0으로 설정함.\n", " loss = tf.multiply(loss, mask)\n", - "\n", + " #손실값과 마스크를 곱해 마스크가 적용된 손실을 계산하고, \n", + " #이를 평균 내어 반환함.\n", " return tf.reduce_mean(loss)" ] }, @@ -708,12 +863,15 @@ "id": "8a831e8a" }, "source": [ - "## custom schedule" + "## custom schedule\n", + "- tf.keras.optimizers.schedules.LearningRateSchedule를 상속\n", + "- 낮은 학습률로 시작하여 점차적으로 학습률을 높여 다시 감소하기 시작하는 지점까지 학습률을 높이도록 설계됨\n", + " - 신경망 훈련에서 일반적으로 사용되는 방식" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "2f74e232", "metadata": { "id": "2f74e232" @@ -723,21 +881,33 @@ "class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):\n", "\n", " def __init__(self, d_model, warmup_steps=4000):\n", + " '''모델의 차원 크기(`d_model`)와 워밍업 단계 수(`warmup_steps`)를 포함하여 \n", + " 스케줄의 하이퍼파라미터를 초기화함\n", + " '''\n", " super(CustomSchedule, self).__init__()\n", " self.d_model = d_model\n", " self.d_model = tf.cast(self.d_model, tf.float32)\n", " self.warmup_steps = warmup_steps\n", + " \n", "\n", " def __call__(self, step):\n", + " '''d_model` 매개 변수는 `__call__` 메서드 내부의 나누기 연산이 \n", + " 정수를 반환하도록 하기 위해 정수로 캐스팅됨.\n", + " '''\n", + " #현재 훈련 단계를 나타내는 `step` 매개 변수를 받음\n", + " #이 메서드는 현재 단계에서 학습률을 계산하는 데 사용되는 두 개의 인수인 `arg1`과 `arg2`를 계산\n", " arg1 = tf.math.rsqrt(step)\n", + " #'arg1'은 스텝 수의 역제곱근으로 계산\n", " arg2 = step * (self.warmup_steps**-1.5)\n", - "\n", - " return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2)" + " #'arg2'는 스텝 수에 'warmup_steps'의 역제곱근을 `-1.5`의 거듭제곱으로 곱한 값으로 계산\n", + " \n", + " return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2)\n", + " #학습률은 `d_model`의 역제곱근에 `arg1`과 `arg2`의 최소값을 곱한 값으로 계산" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "4fb94965", "metadata": { "colab": { @@ -771,927 +941,13 @@ ], "source": [ "sample_learning_rate = CustomSchedule(d_model=128)\n", + "#각 단어를 모델에서 128차원의 벡터로 표현하도록 함\n", "\n", "plt.plot(sample_learning_rate(tf.range(200000, dtype=tf.float32)))\n", + "#training step이 200000번임.\n", "plt.ylabel(\"Learning Rate\")\n", "plt.xlabel(\"Train Step\")" ] - }, - { - "cell_type": "markdown", - "id": "926cf6fb", - "metadata": { - "id": "926cf6fb" - }, - "source": [ - "## 챗봇 구현(에러 발생...)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "679eb7b4", - "metadata": { - "id": "679eb7b4" - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import urllib.request\n", - "import tensorflow_datasets as tfds\n", - "import tensorflow as tf\n", - "import time\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "0812f07a", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 206 - }, - "id": "0812f07a", - "outputId": "d36dd8e2-823e-4774-993f-08447534bc7c" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Q A label\n", - "0 12시 땡! 하루가 또 가네요. 0\n", - "1 1지망 학교 떨어졌어 위로해 드립니다. 0\n", - "2 3박4일 놀러가고 싶다 여행은 언제나 좋죠. 0\n", - "3 3박4일 정도 놀러가고 싶다 여행은 언제나 좋죠. 0\n", - "4 PPL 심하네 눈살이 찌푸려지죠. 0" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
QAlabel
012시 땡!하루가 또 가네요.0
11지망 학교 떨어졌어위로해 드립니다.0
23박4일 놀러가고 싶다여행은 언제나 좋죠.0
33박4일 정도 놀러가고 싶다여행은 언제나 좋죠.0
4PPL 심하네눈살이 찌푸려지죠.0
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 21 - } - ], - "source": [ - "urllib.request.urlretrieve(\"https://raw.githubusercontent.com/songys/Chatbot_data/master/ChatbotData.csv\", filename=\"ChatBotData.csv\")\n", - "\n", - "train_data = pd.read_csv('ChatBotData.csv')\n", - "train_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "d1f50783", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "d1f50783", - "outputId": "3fb447e3-5256-4e68-d67f-4a17b93e4ad0" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "챗봇 샘플의 개수 : 11823\n" - ] - } - ], - "source": [ - "print('챗봇 샘플의 개수 :', len(train_data))" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "26b363cf", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "26b363cf", - "outputId": "dcc3b194-f8f8-4743-d49b-3370dc2148c5" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Q 0\n", - "A 0\n", - "label 0\n", - "dtype: int64\n" - ] - } - ], - "source": [ - "print(train_data.isnull().sum())" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "1102ec24", - "metadata": { - "id": "1102ec24" - }, - "outputs": [], - "source": [ - "questions = []\n", - "for sentence in train_data['Q']:\n", - " # 구두점에 대해서 띄어쓰기\n", - " # ex) 12시 땡! -> 12시 땡 !\n", - " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", - " sentence = sentence.strip()\n", - " questions.append(sentence)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "3f52fe1a", - "metadata": { - "id": "3f52fe1a" - }, - "outputs": [], - "source": [ - "answers = []\n", - "for sentence in train_data['A']:\n", - " # 구두점에 대해서 띄어쓰기\n", - " # ex) 12시 땡! -> 12시 땡 !\n", - " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", - " sentence = sentence.strip()\n", - " answers.append(sentence)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3ae1ec7c", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "3ae1ec7c", - "outputId": "dd7b75ea-6988-4c9f-d1ff-9a8d15c0a65f" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "11823" - ] - }, - "metadata": {}, - "execution_count": 26 - } - ], - "source": [ - "len(questions)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "f35b2147", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "f35b2147", - "outputId": "fdf61d35-8214-475a-b13c-ee23564caa2b" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "['12시 땡 !', '1지망 학교 떨어졌어', '3박4일 놀러가고 싶다', '3박4일 정도 놀러가고 싶다', 'PPL 심하네']\n", - "['하루가 또 가네요 .', '위로해 드립니다 .', '여행은 언제나 좋죠 .', '여행은 언제나 좋죠 .', '눈살이 찌푸려지죠 .']\n" - ] - } - ], - "source": [ - "print(questions[:5])\n", - "print(answers[:5])" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "b235a60b", - "metadata": { - "id": "b235a60b" - }, - "outputs": [], - "source": [ - "# 서브워드텍스트인코더를 사용하여 질문과 답변을 모두 포함한 단어 집합(Vocabulary) 생성\n", - "tokenizer = tfds.deprecated.text.SubwordTextEncoder.build_from_corpus(\n", - " questions + answers, target_vocab_size=2**13)\n", - "\n", - "# 시작 토큰과 종료 토큰에 대한 정수 부여.\n", - "START_TOKEN, END_TOKEN = [tokenizer.vocab_size], [tokenizer.vocab_size + 1]\n", - "\n", - "# 시작 토큰과 종료 토큰을 고려하여 단어 집합의 크기를 + 2\n", - "VOCAB_SIZE = tokenizer.vocab_size + 2" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "ec13eac8", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ec13eac8", - "outputId": "926a89b4-ff93-4952-9ad5-1c5d983e383d" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "시작 토큰 번호 : [8178]\n", - "종료 토큰 번호 : [8179]\n", - "단어 집합의 크기 : 8180\n" - ] - } - ], - "source": [ - "print('시작 토큰 번호 :',START_TOKEN)\n", - "print('종료 토큰 번호 :',END_TOKEN)\n", - "print('단어 집합의 크기 :',VOCAB_SIZE)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "119e6ab7", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "119e6ab7", - "outputId": "8ab5a0da-1f00-4d2c-a0f9-069bb6828d51" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Tokenized sample question: [5766, 611, 3509, 141, 685, 3747, 849]\n" - ] - } - ], - "source": [ - "# 서브워드텍스트인코더 토크나이저의 .encode()를 사용하여 텍스트 시퀀스를 정수 시퀀스로 변환.\n", - "print('Tokenized sample question: {}'.format(tokenizer.encode(questions[20])))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "76c5cea6", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "76c5cea6", - "outputId": "73c22222-1501-4885-f7b1-62e37fcc25d2" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "정수 인코딩 후의 문장 [5766, 611, 3509, 141, 685, 3747, 849]\n", - "기존 문장: 가스비 비싼데 감기 걸리겠어\n" - ] - } - ], - "source": [ - "# 서브워드텍스트인코더 토크나이저의 .encode()와 decode() 테스트해보기\n", - "\n", - "# 임의의 입력 문장을 sample_string에 저장\n", - "sample_string = questions[20]\n", - "\n", - "# encode() : 텍스트 시퀀스 --> 정수 시퀀스\n", - "tokenized_string = tokenizer.encode(sample_string)\n", - "print ('정수 인코딩 후의 문장 {}'.format(tokenized_string))\n", - "\n", - "# decode() : 정수 시퀀스 --> 텍스트 시퀀스\n", - "original_string = tokenizer.decode(tokenized_string)\n", - "print ('기존 문장: {}'.format(original_string))" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "292f4b8e", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "292f4b8e", - "outputId": "26aa3f5b-f03a-4134-cd23-9e43e982bdf6" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "5766 ----> 가스\n", - "611 ----> 비 \n", - "3509 ----> 비싼\n", - "141 ----> 데 \n", - "685 ----> 감기 \n", - "3747 ----> 걸리\n", - "849 ----> 겠어\n" - ] - } - ], - "source": [ - "# 각 정수는 각 단어와 어떻게 mapping되는지 병렬로 출력\n", - "# 서브워드텍스트인코더는 의미있는 단위의 서브워드로 토크나이징한다. 띄어쓰기 단위 X 형태소 분석 단위 X\n", - "for ts in tokenized_string:\n", - " print ('{} ----> {}'.format(ts, tokenizer.decode([ts])))" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "ba9b3992", - "metadata": { - "id": "ba9b3992" - }, - "outputs": [], - "source": [ - "\n", - "# 최대 길이를 40으로 정의\n", - "MAX_LENGTH = 40\n", - "\n", - "# 토큰화 / 정수 인코딩 / 시작 토큰과 종료 토큰 추가 / 패딩\n", - "def tokenize_and_filter(inputs, outputs):\n", - " tokenized_inputs, tokenized_outputs = [], []\n", - " \n", - " for (sentence1, sentence2) in zip(inputs, outputs):\n", - " # encode(토큰화 + 정수 인코딩), 시작 토큰과 종료 토큰 추가\n", - " sentence1 = START_TOKEN + tokenizer.encode(sentence1) + END_TOKEN\n", - " sentence2 = START_TOKEN + tokenizer.encode(sentence2) + END_TOKEN\n", - "\n", - " tokenized_inputs.append(sentence1)\n", - " tokenized_outputs.append(sentence2)\n", - " \n", - " # 패딩\n", - " tokenized_inputs = tf.keras.preprocessing.sequence.pad_sequences(\n", - " tokenized_inputs, maxlen=MAX_LENGTH, padding='post')\n", - " tokenized_outputs = tf.keras.preprocessing.sequence.pad_sequences(\n", - " tokenized_outputs, maxlen=MAX_LENGTH, padding='post')\n", - " \n", - " return tokenized_inputs, tokenized_outputs" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "264dbae5", - "metadata": { - "id": "264dbae5" - }, - "outputs": [], - "source": [ - "questions, answers = tokenize_and_filter(questions, answers)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "f44c01b2", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "f44c01b2", - "outputId": "470ab03e-9da2-439f-ac4d-52b9afd92815" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "질문 데이터의 크기(shape) : (11823, 40)\n", - "답변 데이터의 크기(shape) : (11823, 40)\n" - ] - } - ], - "source": [ - "print('질문 데이터의 크기(shape) :', questions.shape)\n", - "print('답변 데이터의 크기(shape) :', answers.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "f20ba0f6", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "f20ba0f6", - "outputId": "c1de030a-f585-4ce0-eed9-ff1bc0559b68" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[8178 7915 4207 3060 41 8179 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0]\n", - "[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0]\n" - ] - } - ], - "source": [ - "# 0번째 샘플을 임의로 출력\n", - "print(questions[0])\n", - "print(answers[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "1d8e9818", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "1d8e9818", - "outputId": "b6333449-c130-4f54-e2ac-07093f999d61" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "단어 집합의 크기(Vocab size): 8180\n", - "전체 샘플의 수(Number of samples): 11823\n" - ] - } - ], - "source": [ - "print('단어 집합의 크기(Vocab size): {}'.format(VOCAB_SIZE))\n", - "print('전체 샘플의 수(Number of samples): {}'.format(len(questions)))" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "e011f216", - "metadata": { - "id": "e011f216" - }, - "outputs": [], - "source": [ - "# 텐서플로우 dataset을 이용하여 셔플(shuffle)을 수행하되, 배치 크기로 데이터를 묶는다.\n", - "# 또한 이 과정에서 교사 강요(teacher forcing)을 사용하기 위해서 디코더의 입력과 실제값 시퀀스를 구성한다.\n", - "BATCH_SIZE = 64\n", - "BUFFER_SIZE = 20000\n", - "\n", - "# 디코더의 실제값 시퀀스에서는 시작 토큰을 제거해야 한다.\n", - "dataset = tf.data.Dataset.from_tensor_slices((\n", - " {\n", - " 'inputs': questions,\n", - " 'dec_inputs': answers[:, :-1] # 디코더의 입력. 마지막 패딩 토큰이 제거된다.\n", - " },\n", - " {\n", - " 'outputs': answers[:, 1:] # 맨 처음 토큰이 제거된다. 다시 말해 시작 토큰이 제거된다.\n", - " },\n", - "))\n", - "\n", - "dataset = dataset.cache()\n", - "dataset = dataset.shuffle(BUFFER_SIZE)\n", - "dataset = dataset.batch(BATCH_SIZE)\n", - "dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "3eee07a4", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "3eee07a4", - "outputId": "e9093523-8ecb-4b7c-cb9f-dc57708b14ce" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0]\n", - "[[8178 3844 74 7894 1 8179 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0]]\n", - "[[3844 74 7894 1 8179 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0]]\n" - ] - } - ], - "source": [ - "# 임의의 샘플에 대해서 [:, :-1]과 [:, 1:]이 어떤 의미를 가지는지 테스트해본다.\n", - "print(answers[0]) # 기존 샘플\n", - "print(answers[:1][:, :-1]) # 마지막 패딩 토큰 제거하면서 길이가 39가 된다.\n", - "print(answers[:1][:, 1:]) # 맨 처음 토큰이 제거된다. 다시 말해 시작 토큰이 제거된다. 길이는 역시 39가 된다." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "47989253", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "47989253", - "outputId": "1e92bb30-e13d-48d5-bbe7-d91fba438727" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "(1, 8180, 256)\n", - "(1, 8180, 256)\n" - ] - } - ], - "source": [ - "tf.keras.backend.clear_session()\n", - "\n", - "# Hyper-parameters\n", - "NUM_LAYERS = 2\n", - "D_MODEL = 256\n", - "NUM_HEADS = 8\n", - "DFF = 512\n", - "DROPOUT = 0.1\n", - "\n", - "model = transformer(\n", - " vocab_size=VOCAB_SIZE,\n", - " num_layers=NUM_LAYERS,\n", - " dff=DFF,\n", - " d_model=D_MODEL,\n", - " num_heads=NUM_HEADS,\n", - " dropout=DROPOUT)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "1a89e01d", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 470 - }, - "id": "1a89e01d", - "outputId": "058dcfe2-f019-41cf-a0df-e1f4a616251f" - }, - "outputs": [ - { - "output_type": "error", - "ename": "InvalidArgumentError", - "evalue": "ignored", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mInvalidArgumentError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mlearning_rate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCustomSchedule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mD_MODEL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m optimizer = tf.keras.optimizers.Adam(\n\u001b[0m\u001b[1;32m 6\u001b[0m learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9)\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/keras/optimizers/adam.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, learning_rate, beta_1, beta_2, epsilon, amsgrad, weight_decay, clipnorm, clipvalue, global_clipnorm, use_ema, ema_momentum, ema_overwrite_frequency, jit_compile, name, **kwargs)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 115\u001b[0m )\n\u001b[0;32m--> 116\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_learning_rate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_build_learning_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlearning_rate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 117\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta_1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbeta_2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta_2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer.py\u001b[0m in \u001b[0;36m_build_learning_rate\u001b[0;34m(self, learning_rate)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;31m# Create a variable to hold the current learning rate.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m current_learning_rate = tf.convert_to_tensor(\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0mlearning_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miterations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m )\n\u001b[1;32m 386\u001b[0m self._current_learning_rate = tf.Variable(\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, step)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0marg1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrsqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0marg2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarmup_steps\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1.5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/tensorflow/python/util/traceback_utils.py\u001b[0m in \u001b[0;36merror_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 152\u001b[0m \u001b[0mfiltered_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_process_traceback_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 153\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiltered_tb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 154\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 155\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mfiltered_tb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/dist-packages/tensorflow/python/framework/ops.py\u001b[0m in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m 7260\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mraise_from_not_ok_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7261\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\" name: \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7262\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_status_to_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;31m# pylint: disable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7264\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mInvalidArgumentError\u001b[0m: Value for attr 'T' of int64 is not in the list of allowed values: bfloat16, half, float, double, complex64, complex128\n\t; NodeDef: {{node Rsqrt}}; Op y:T; attr=T:type,allowed=[DT_BFLOAT16, DT_HALF, DT_FLOAT, DT_DOUBLE, DT_COMPLEX64, DT_COMPLEX128]> [Op:Rsqrt]" - ] - } - ], - "source": [ - "MAX_LENGTH = 40\n", - "\n", - "learning_rate = CustomSchedule(D_MODEL)\n", - "\n", - "optimizer = tf.keras.optimizers.Adam(\n", - " learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9)\n", - "\n", - "def accuracy(y_true, y_pred):\n", - " # ensure labels have shape (batch_size, MAX_LENGTH - 1)\n", - " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1))\n", - " return tf.keras.metrics.sparse_categorical_accuracy(y_true, y_pred)\n", - "\n", - "model.compile(optimizer=optimizer, loss=loss_function, metrics=[accuracy])\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68491949", - "metadata": { - "id": "68491949" - }, - "outputs": [], - "source": [ - "EPOCHS = 50\n", - "\n", - "model.fit(dataset, epochs=EPOCHS)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5f576ef8", - "metadata": { - "id": "5f576ef8" - }, - "outputs": [], - "source": [ - "def evaluate(sentence):\n", - " sentence = preprocess_sentence(sentence)\n", - "\n", - " sentence = tf.expand_dims(\n", - " START_TOKEN + tokenizer.encode(sentence) + END_TOKEN, axis=0)\n", - "\n", - " output = tf.expand_dims(START_TOKEN, 0)\n", - "\n", - " # 디코더의 예측 시작\n", - " for i in range(MAX_LENGTH):\n", - " predictions = model(inputs=[sentence, output], training=False)\n", - "\n", - " # 현재(마지막) 시점의 예측 단어를 받아온다.\n", - " predictions = predictions[:, -1:, :]\n", - " predicted_id = tf.cast(tf.argmax(predictions, axis=-1), tf.int32)\n", - "\n", - " # 만약 마지막 시점의 예측 단어가 종료 토큰이라면 예측을 중단\n", - " if tf.equal(predicted_id, END_TOKEN[0]):\n", - " break\n", - "\n", - " # 마지막 시점의 예측 단어를 출력에 연결한다.\n", - " # 이는 for문을 통해서 디코더의 입력으로 사용될 예정이다.\n", - " output = tf.concat([output, predicted_id], axis=-1)\n", - "\n", - " return tf.squeeze(output, axis=0)\n", - "\n", - "\n", - "def predict(sentence):\n", - " prediction = evaluate(sentence)\n", - "\n", - " predicted_sentence = tokenizer.decode(\n", - " [i for i in prediction if i < tokenizer.vocab_size])\n", - "\n", - " print('Input: {}'.format(sentence))\n", - " print('Output: {}'.format(predicted_sentence))\n", - "\n", - " return predicted_sentence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "542ff26e", - "metadata": { - "id": "542ff26e" - }, - "outputs": [], - "source": [ - "def preprocess_sentence(sentence):\n", - " sentence = re.sub(r\"([?.!,])\", r\" \\1 \", sentence)\n", - " sentence = sentence.strip()\n", - " return sentence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cb3fbe78", - "metadata": { - "id": "cb3fbe78" - }, - "outputs": [], - "source": [ - "output = predict('영화 볼래?')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bc6e462e", - "metadata": { - "id": "bc6e462e" - }, - "outputs": [], - "source": [ - "output = predict(\"고민이 있어\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59117715", - "metadata": { - "id": "59117715" - }, - "outputs": [], - "source": [ - "output = predict(\"너무 화가나\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4b9eeaf7", - "metadata": { - "id": "4b9eeaf7" - }, - "outputs": [], - "source": [ - "output = predict(\"게임하고싶은데 할래?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f3782229", - "metadata": { - "id": "f3782229" - }, - "outputs": [], - "source": [ - "output = predict(\"나 너 좋아하는 것 같아\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ffb0a0d3", - "metadata": { - "id": "ffb0a0d3" - }, - "outputs": [], - "source": [ - "output = predict(\"딥 러닝 자연어 처리를 잘 하고 싶어\")" - ] } ], "metadata": { @@ -1714,9 +970,6 @@ }, "colab": { "provenance": [], - "collapsed_sections": [ - "926cf6fb" - ], "include_colab_link": true } }, From d42722a8b43fec42454644b7b65590faf1849750 Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Wed, 26 Apr 2023 11:25:05 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Transcribe_TransformerKoreanChatbot.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Transcribe_TransformerKoreanChatbot.ipynb b/Transcribe_TransformerKoreanChatbot.ipynb index 2748a8f..d32d64c 100644 --- a/Transcribe_TransformerKoreanChatbot.ipynb +++ b/Transcribe_TransformerKoreanChatbot.ipynb @@ -14,10 +14,14 @@ "cell_type": "markdown", "source": [ "## Transformer를 사용하는 데 쓰이는 라이브러리\n", + "- transformer에 기반하는 다른 모델을 사용할 수 있는 라이브러리가 많았고, transformer 기능을 구현하는 코드를 통해서 짚어보기로 함.\n", "- tensorflow(아래 구현 코드에서 확인 가능)\n", "- pytorch\n", + " - https://pytorch.kr/hub/huggingface_pytorch-transformers/\n", "- huggingface transformers\n", - "- fairseq" + " - https://github.com/huggingface/transformers/blob/main/README_ko.md\n", + "- fairseq\n", + " - https://cloud.google.com/tpu/docs/tutorials/transformer-pytorch?hl=ko" ], "metadata": { "id": "DXRgJAGiD0-Z" From f1b5fcc8b85da178281ee2b693df6aca29499346 Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Wed, 26 Apr 2023 12:39:44 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\235\230_\354\202\254\353\263\270.ipynb" | 1004 +++++++++++++++++ 1 file changed, 1004 insertions(+) create mode 100644 "Transcribe_TransformerKoreanChatbot_ipynb\354\235\230_\354\202\254\353\263\270.ipynb" diff --git "a/Transcribe_TransformerKoreanChatbot_ipynb\354\235\230_\354\202\254\353\263\270.ipynb" "b/Transcribe_TransformerKoreanChatbot_ipynb\354\235\230_\354\202\254\353\263\270.ipynb" new file mode 100644 index 0000000..a1b9935 --- /dev/null +++ "b/Transcribe_TransformerKoreanChatbot_ipynb\354\235\230_\354\202\254\353\263\270.ipynb" @@ -0,0 +1,1004 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Transformer를 사용하는 데 쓰이는 라이브러리\n", + "- transformer에 기반하는 다른 모델을 사용할 수 있는 라이브러리가 많았고, transformer 기능을 구현하는 코드를 통해서 짚어보기로 함.\n", + "- tensorflow(아래 구현 코드에서 확인 가능)\n", + "- pytorch\n", + " - https://pytorch.kr/hub/huggingface_pytorch-transformers/\n", + "- huggingface transformers\n", + " - https://github.com/huggingface/transformers/blob/main/README_ko.md\n", + "- fairseq\n", + " - https://cloud.google.com/tpu/docs/tutorials/transformer-pytorch?hl=ko" + ], + "metadata": { + "id": "DXRgJAGiD0-Z" + }, + "id": "DXRgJAGiD0-Z" + }, + { + "cell_type": "markdown", + "id": "2fe11c0f", + "metadata": { + "id": "2fe11c0f" + }, + "source": [ + "## 필요 라이브러리 import" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bbebe731", + "metadata": { + "id": "bbebe731" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "id": "5cd2132b", + "metadata": { + "id": "5cd2132b" + }, + "source": [ + "TypeError: Unable to convert function return value to a Python type! The signature was\n", + "\t() -> handle\n", + "- tensorflow를 import 할 때, 해당 오류가 발생하는 건 tensorflow 라이브러리 버전이 낮기 때문임.\n", + " - pip install --upgrade tensorflow\n", + " - pip uninstall tensorflow 하고서 pip install tensorflow 하기" + ] + }, + { + "cell_type": "markdown", + "id": "b9c7b06c", + "metadata": { + "id": "b9c7b06c" + }, + "source": [ + "ERROR: Could not install packages due to an OSError: [WinError 5] 액세스가 거부되었습니다: \n", + "- 해당 에러가 cmd 창에서 나타나는 경우, 다음 명령문을 conda install 전에 입력한다.\n", + " - conda config --set ssl_verify false\n", + " - conda install pip tensorflow" + ] + }, + { + "cell_type": "markdown", + "source": [ + "위의 방식대로 했는데도 안 됐음...\n", + "--> 근데 그냥... 코랩으로 돌리면 되는 거였음..." + ], + "metadata": { + "id": "mSVrStdeJrjB" + }, + "id": "mSVrStdeJrjB" + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92cc660a", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "92cc660a", + "outputId": "d0cb368f-7bd3-4880-beac-acfea6e2db1e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'2.12.0'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 4 + } + ], + "source": [ + "tf.__version__ #2.6.0 이상 버전에서 작업 진행 필요" + ] + }, + { + "cell_type": "markdown", + "id": "6f9aa344", + "metadata": { + "id": "6f9aa344" + }, + "source": [ + "## Positional Encoding 구현" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Tensorflow 및 Keras에서 Positional Encoding 레이어를 정의하는 내용.\n", + "- transformer의 입력 시퀀스에 위치 인코딩을 추가해주는 역할\n", + " - 위치 인코딩 : 입력 시퀀스의 토큰 위치에 대한 정보를 모델에 제공하기 위해 사용되며, 이는 시퀀스의 순서와 문맥을 이해하는 데 중요함." + ], + "metadata": { + "id": "5mPnbVw6T50X" + }, + "id": "5mPnbVw6T50X" + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d833813b", + "metadata": { + "id": "d833813b" + }, + "outputs": [], + "source": [ + "class PositionalEncoding(tf.keras.layers.Layer): #tf.keras.layers.Layer를 상속받음\n", + " def __init__(self, position, d_model): \n", + " #position:입력시퀀스의 최대길이, d_model:입력 임베딩의 차원\n", + " super(PositionalEncoding, self).__init__()\n", + " self.pos_encoding = self.positional_encoding(position, d_model)\n", + "\n", + " def get_angles(self, position, i, d_model):\n", + " #모든 위치, 임베딩 차원에 대한 각도 배열 반환.\n", + " # i : 각도의 인덱스\n", + " ## 짝수면 2로 나뉘어져서 지수가 0 -> sin함수 쓸 때 사용되는 각도 생성\n", + " ## 홀수면 지수가 1 -> cos함수 쓸 때 사용되는 각도 생성\n", + " angles = 1 / tf.pow(10000, (2 * (i // 2)) / tf.cast(d_model, tf.float32))\n", + " return position * angles\n", + " # tf.pow : x^y\n", + " # tf.cast:배열의 데이터타입을 바꿔줌. 여기선 d_model을 float32형태로 변화.\n", + "\n", + " def positional_encoding(self, position, d_model):\n", + " \n", + " #get_angles 함수 : 인코딩할 단어 위치(position), 임베딩 차원(d_model),\n", + " #인덱스(i)에 따라 각도(angles) 계산함\n", + " angle_rads = self.get_angles(\n", + " position=tf.range(position, dtype=tf.float32)[:, tf.newaxis],\n", + " i=tf.range(d_model, dtype=tf.float32)[tf.newaxis, :],\n", + " d_model=d_model) \n", + "\n", + " # 배열의 짝수 인덱스(2i)에는 사인 함수 적용\n", + " sines = tf.math.sin(angle_rads[:, 0::2])\n", + "\n", + " # 배열의 홀수 인덱스(2i+1)에는 코사인 함수 적용\n", + " cosines = tf.math.cos(angle_rads[:, 1::2])\n", + "\n", + " angle_rads = np.zeros(angle_rads.shape) \n", + " #계산된 sines와 cosines를 이용해 각도 배열(angle_rads) 만듦\n", + " angle_rads[:, 0::2] = sines\n", + " angle_rads[:, 1::2] = cosines\n", + " pos_encoding = tf.constant(angle_rads)\n", + " #angle_rads 기반으로 pos_encoding 배열을 만듦\n", + " #이 배열은 angle_rads를 그대로 복사한 다음에, tf.newaxis로 차원을 추가하고\n", + " pos_encoding = pos_encoding[tf.newaxis, ...]\n", + "\n", + " print(pos_encoding.shape)\n", + " #tf.cast를 이용해 float32형태로 변경함\n", + " return tf.cast(pos_encoding, tf.float32)\n", + " #해당 배열의 모양은 (1=배치차원, position, d_model)임.\n", + " \n", + " '''\n", + " 딥러닝 모델 학습 시, 데이터셋은 일반적으로 미니배치(minibatch) 단위로 처리됨\n", + " 전체 데이터셋이 아닌 일부 데이터(ex. 32개의 이미지)를 한번에 모델에 입력하고, 그 출력을 이용해 모델을 학습시킴\n", + " 이렇게 모델에 입력되는 데이터의 묶음을 미니 배치라고 하며, 미니배치 단위로 \n", + " 처리하는 건 GPU를 비롯한 하드웨어의 병렬 처리 기능을 활용해 연산 속도를 높일 수 있음.\n", + "\n", + " 배치 차원 = 미니 배치의 크기\n", + " 배열은 1개의 미니배치를 처리함.\n", + " '''\n", + "\n", + " def call(self, inputs): \n", + " #input sequence에 tensor 추가되고, \n", + " #브로드캐스팅을 사용해 위치 인코딩이 시퀀스의 올바른 부분에 추가되도록 보장함.\n", + " ## 브로드캐스팅 : NumPy 및 TensorFlow와 같은 배열/텐서 연산에서 자동으로 배열/텐서의 크기를 조정해 연산이 가능하도록 하는 기능\n", + " return inputs + self.pos_encoding[:, :tf.shape(inputs)[1], :]\n", + " ##self는 pos_encoding의 첫번째 차원인 배치 차원과 동일함." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "026d42a0", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "026d42a0", + "outputId": "650011ba-be03-4c83-d2fb-7135aea515d1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 50, 128)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAG2CAYAAABYlw1sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB8iElEQVR4nO3deXhTVf4/8HeSNkn3FboApQjIJpsgtcAgQmURF0bGbXBERPiqoAIuiMrqgisgWsUNlBEGxVEUERRBYNSyWERFAUGBFkpboLSlpWtyf3/w85xzIbe0SSENeb+eJ49vTu5aSj29uZ/PNWmapoGIiIjIB5i9fQBEREREtcWJCxEREfkMTlyIiIjIZ3DiQkRERD6DExciIiLyGZy4EBERkc/gxIWIiIh8BicuRERE5DM4cSEiIiKfwYkLERER+QyvTlymT58Ok8mke7Vt21a8X15ejrFjxyImJgahoaEYNmwY8vLyvHjEREREvmnjxo249tprkZiYCJPJhOXLl591nfXr1+PSSy+FzWZDq1at8O67756xTHp6OpKTk2G325GSkoItW7bU/8ErvH7FpUOHDjh8+LB4ffvtt+K9CRMmYMWKFVi2bBk2bNiAnJwc3HDDDV48WiIiIt9UWlqKzp07Iz09vVbL79u3D0OGDMGVV16J7du3Y/z48bjrrrvw5ZdfimU++OADTJw4EdOmTcO2bdvQuXNnDBw4EPn5+efqNGDy5kMWp0+fjuXLl2P79u1nvFdUVIRGjRphyZIl+Mc//gEA2LVrF9q1a4eMjAxcfvnl5/loiYiILgwmkwmffPIJhg4darjMpEmTsHLlSuzYsUOM3XLLLSgsLMTq1asBACkpKbjsssvw6quvAgCcTieaNWuG++67D48++ug5OfaAc7LVOtizZw8SExNht9uRmpqKWbNmISkpCZmZmaiqqkJaWppYtm3btkhKSqpx4lJRUYGKigrxZ6fTiYKCAsTExMBkMp3z8yEiIt+laRpOnDiBxMREmM3n7kOJ8vJyVFZWerwdTdPO+H+bzWaDzWbzeNsZGRm6/wcDwMCBAzF+/HgAQGVlJTIzMzF58mTxvtlsRlpaGjIyMjzevxGvTlxSUlLw7rvvok2bNjh8+DBmzJiBv/3tb9ixYwdyc3NhtVoRGRmpWycuLg65ubmG25w1axZmzJhxjo+ciIguZNnZ2WjatOk52XZ5eTmCwqKB6jKPtxUaGoqSkhLd2LRp0zB9+nSPt52bm4u4uDjdWFxcHIqLi1FWVobjx4/D4XC4XGbXrl0e79+IVycugwcPFrlTp05ISUlB8+bN8eGHHyIoKMitbU6ePBkTJ04Ufy4qKkJSUhLutjSDzWTG5d+tEe99ldJf5KcObxX5645XiPzvx17RbX9AR/kX9PQzS0Ru3bunyI8vnSry+n2FIvf8/muRb7/nOZFzXr5a5M+Hypnrkide1Z/bVReL/J9L/ibyurvltiJig0UeP/8Rkd+dLM/jmR9mi/zH1/tFnnPP83JfS6bo9n1brNzf23PvFznSFijy3+96VuRvOxyS4055X9LV708XeeSu70Ree6n8mv9z2hDdvsuOFYn81fzv5XI75N/lpGZ9RO609guR86++TuTVE14SeebKp0W+I0ke3+bLs3T77rDcIfLh+cNEbnzn+yIf+Epu96JrnhB55buPizzs/vkiP/7YP0WePf8bkfsM7Kzb97bMwyLHJISJXFleJXL5yWqRGzWRy2TtOiJyj9RmIm/88ieRb7pRXrVc/O+1un1PHCe/J1948UORZ025TeRHprwjcvpzY0S+50H5fbs4fYLIt4yR31+fLZCXkK8dKf8uAODr9+X3Xv9/Thf5fx/MFPlvN8t/Y5uWPSlyyrDHRN76yTMiX/Z3Of7j8lkid7lO/hsBgF9WvCByx2sfFvnXz+V4h2vk+K6VcrztEDm++4sXRW5z9UMi71klx1sPluM1vffHajnecpAc//NL5ftu4INnHd+vfJ8mD5DjNb2nfm83r8V49hr5s6XZVRPPOu7OOkbjB7+W403Tzj5u9J7mqILjtw8RFhaGc6WyshKoLkNA+5sAS+DZVzDiqELJbx8iOzsb4eHhYrg+rrY0ZF7/qEgVGRmJiy++GHv37sVVV12FyspKFBYW6q665OXlIT4+3nAbRpfIbCYzbCYzgkPlN6NVuTdZ/UsPNltEDgwK0W0nKESubwqQ+wmwy+VCLHJ9m0nuQ923yWKV+w6V69a079AweYxWZbsWm5ysqMdhtK1Qa6DLZYzOAdCfq3oeIfZAZRl5Tuo+zE55fOpxq+djN8n9hQXp//4CbHK7Qcpy6t+Z+nep/h3Z1a+TwfmZA+1y33b9vk0WOTFQ/550f3/KcajjIcr5qV8/9fjMgXKCbg0K1e3b6O/VATlxsTiqXC5jtpa63K66P1uwOi6/BgBg132fy/eCQl1//wcbjIfoxtWvjet/C4D++0J9r67jYUbjBn9fNb13rscB4++jcz3Ofbt+73zcWmAKtJ+x37rQ/v/P7/DwcN251Jf4+PgzKnnz8vIQHh6OoKAgWCwWWCwWl8vU9P9pT3m9qkhVUlKCP/74AwkJCejWrRsCAwOxdq38TXD37t3IyspCamqqF4+SiIjIcyazxePXuZSamqr7fzAArFmzRvw/2Gq1olu3brplnE4n1q5de07/P+3VKy4PPfQQrr32WjRv3hw5OTmYNm0aLBYLbr31VkRERGDUqFGYOHEioqOjER4ejvvuuw+pqamsKCIiIp/n8eRDq9u6JSUl2Lt3r/jzvn37sH37dkRHRyMpKQmTJ0/GoUOHsGjRIgDA3XffjVdffRWPPPII7rzzTqxbtw4ffvghVq5cKbYxceJEjBgxAt27d0ePHj0wd+5clJaWYuTIke6f11l4deJy8OBB3HrrrTh27BgaNWqE3r17Y9OmTWjUqBEAYM6cOTCbzRg2bBgqKiowcOBAvPbaa948ZCIiIp/0ww8/4MorrxR//ut+0BEjRuDdd9/F4cOHkZUl7/Nr0aIFVq5ciQkTJuDll19G06ZN8fbbb2PgwIFimZtvvhlHjhzB1KlTkZubiy5dumD16tVn3LBbn7w6cVm6dGmN79vtdqSnp9e6WQ4REZGvMJk8vOLirNu6ffv2RU2t21x1xe3bty9+/PHHGrc7btw4jBs3rk7H4okGdXMuERGRvzBZzDBZPPmoqEHdpnre+M3E5W9NwxFitiB+yggxdtfgliJvukyW035zRFZkfHZtlH5D+btFfLjoqMg/f/G5yFe8PUnkFX1kvtqWLbLmlGW2v8fJe3a+O3ZS5EfSZPkzALy9+YDIXcNl5cbRrgkib/zyZ5F/KZKN+K7v2kTkJrYuIn/64U6R87Nl2XHjjo11+7aVxYqcmV0o8p3dZZ+D6nLZS6Bw33GRQzvLapdKp5ztRwfJf7DRVplLD8mvKwCEJclLjiXVTrmtANcl88dPyqZOQRb5D7uyTFYI2ZSvn6NC9lIIDNFvU3MWimyyut5fpUOek/rbU4VyrOp4WaX8uzcrlTaVyvKn1pFVDQ6HfM+sVDtoTs3l8k5l3GLQRMtiVrfjqPV7rpjrWIFR0/K12VZtjqk+a0J8qXel2Y1j9aHTI/KfiQsREVFDYvbw5lztHFcVNVScuBAREXmBx1VFfjpx8c8PyIiIiMgn8YoLERGRF/CKi3s4cSEiIvICk9kMkydPoD6HT69uyPzzrImIiMgn+c0VlzbfrEZYWDhmxV4ixh458ovICxt3FHn039uI/HUf+SRfANCUstQe970s8taPPhZ5Y2PZmXBwM/ngq18fl0+0bdzhVpEf+/w3keOV0trLgwt1+777e9nRcFSqLG+O7y6f/vvpm/KJ1XkVsvz31hbRIoeE9VOW+bfIRTn75DZTW+n2HbIrSeRtB2Sp82O9m8CV4oPFIkf0D3a5TJTybDFdOXTuMd1ysd07iKyWQ5dU6suH/5JfLMvAL7LIQs9K5ethDZEPgXRWy/LpwHD9sWpOeSxOo3JotSRZ6clQrhyrOVCerFoOrS5fcVo5tEUp5VbLns0BrseNSpiNxq267RiXQ6v0pdiu9+FUxt0pzTVitC1fKlX2oUOl84AfFbnHbyYuREREDcmpj4o8mbj454cmnLgQERF5gcct/03+ecXFP6drRERE5JN4xYWIiMgbLBaPnlWk1fEhixcKTlyIiIi8wNObcz36mMmH8aMiIiIi8hl+c8Wlz+jXYQq04483ZHlzh/v+I/J3D18hctgTr4s8P7y94TY/vydF5KuUJw+Pf2OzyJtn3Sjy3FHvyeUXyLLsVZ9sEnlSmHxqceF/XtXtL2eHLK1uN1KWXLdJjhC5qlQ+4VmprEaySZYwVzfvJnKZslDZsRyRI7p00e07qjBSHofyFOmAgv0iq7P/gmPyicuNYl2XQ1uKc0UOjpalxicOl+iXi5FPvy5Xyn/Vcmil6hkFpbK8uZNS8lullEPbIuTX2ZlXJbcTEqnbt1ryqwW6Pg/16dBm5Wtwskope67F06HV8VPruH46tDUgwGDcdXmz0bhRyTMAWAxqjC0Gqxg90dl4O8b7PtflzefjtzV3ysDrs3ScfAOvuLjHbyYuREREDYnZbNH9slP3DfjnxIUfFREREZHP4BUXIiIiL/C0AZ1HzznyYZy4EBEReQHvcXGPf07XiIiIyCfxigsREZEX8IqLezhxISIi8gJOXNzjNxMXW0QszIFBGB86WIwVZv9b5J+nPCfylKfXi/x6nyTddvJ2HxM5Z/xwkd998l2RO1/9oMilU+aKnF32tshPpLUS+f0XXhO5V++mIv/09re6fZdaO4psTZsusmnP/0S2WGU/lGir/KZ2/rRW5L0dhsntKM0jKpUeMAHtL9ftO2ZXgch/7sgT2XHwd7lOUKjIueWyX0i7BNl/plTZn9rHJSRO9kgpzSvV7TsgNl7kMqVvSXGF0qtE2W5WSYXIoWofl/JyuXyYXWTnIdn3xRQsj/V0WqDs/aL+wFD7uKjjFcqx6sarXY9XK+MAYAmQ5+RU3jMHy3FN6Wuj9mXR9WsxGYyryzv0PWTMBuuYDZqNGPV3MWLU96UmdV3F6BxqXqdu+zCd66Yz52kf5B2ePmTRxIcsEhERETVsfnPFhYiIqCExefiQRU/W9WWcuBAREXkB+7i4xz/PmoiIiHwSr7gQERF5AauK3MOJCxERkRdw4uIev5m4ZL56C8LDwxHda6wYm/3aFJFHjH9d5NIj2SJf+t0q3XbMmStEntL/MZGnXTVf5KCoOJEfXLFT5P7RslS5yc6VIqtlxB3uvl7k526ep9u3pZNcf3tZmNzWik9EjmjaVuSL964T+fCa9SJ/G9ZP5FilZFotGS2Lvki3724tZP7lm60iV/5ZIrJVKSU+XiW31TpOnt9etTz54B8ih8aFiFyw57hu3wiLlftTyn+PnpRlzGo59IlSOR6knJ+jokwuHy3351TLfcMiYUQLlCXbtSqHVkqYLQFWkcuUr41F+Xo4HPpyaLUM1qmct1qSrI7blG2p5c0WoxLmGmp/jcqb61piXJvlTx83o27lv3UtYSYi3+Y3ExciIqKGxGw2GfZGqt0G/HPWzokLERGRF5jMJpg8mHx4sq4vY1URERER+QxecSEiIvICk8nk0SMd/PVxELziQkRE5AWm/3+Pi7svdz8qSk9PR3JyMux2O1JSUrBlyxbDZfv27SsmWOpryJAhYpk77rjjjPcHDRrk1rHVBq+4EBEReYHJ5OE9Lm5ccfnggw8wceJEzJ8/HykpKZg7dy4GDhyI3bt3o3Hjxmcs//HHH6OyUlZqHjt2DJ07d8aNN96oW27QoEFYuHCh+LPNZsO54jcTly869EGw2YJrn5Nf2Fsz5VOZp9tiRL64/w0iX/Hi97rtjLumt8hqCe4X494TueeMt0Re88l3Ij83oa/IP8+SyyRd9oDcwYABIuaWz9btOyr5EpHf2nRA5NtW/CRykwGynLp1niwjzlq/R+Sv2sinMg8LlWW6ZqVk94/j8gnLAHBpUqTI84/Lp0Mf33lU5KCo7iKXKKXALaNkGfFhi1IOfXi/yCHxcvtF5XIcABwh8u9GqTzGMYNy6IqyapFt4fIfj6NSlkPbImWJtrNKbsccLMvMT+cMtLscr9Q9BVqe30ml7Fktky6rVEqVla+H44ynQytfK+VJ2GZlHU07+9Oh1TJpp9HToU8vSda9p5R116ZMWleK7Xp5o/GGyscO94Lmp5+O1JvZs2dj9OjRGDlyJABg/vz5WLlyJRYsWIBHH330jOWjo6N1f166dCmCg4PPmLjYbDbEx8efuwNX8N8jERGRF/xVVeTJCwCKi4t1r4qKCpf7q6ysRGZmJtLS0sSY2WxGWloaMjIyanXM77zzDm655RaEhIToxtevX4/GjRujTZs2uOeee3Ds2DE3vypnx4kLERGRF5hNJo9fANCsWTNERESI16xZs1zu7+jRo3A4HIiLi9ONx8XFITc31+U6qi1btmDHjh246667dOODBg3CokWLsHbtWjz33HPYsGEDBg8eDIfj7E0q3eE3HxURERFdiLKzsxEeLjuXn6v7S9555x107NgRPXr00I3fcsstInfs2BGdOnVCy5YtsX79evTv37/ej4NXXIiIiLygvj4qCg8P172MJi6xsbGwWCzIy8vTjefl5Z31/pTS0lIsXboUo0aNOut5XXTRRYiNjcXevXtr+ZWoG05ciIiIvKC+Ji61ZbVa0a1bN6xdu1aMOZ1OrF27FqmpqTWuu2zZMlRUVOC22247634OHjyIY8eOISEhoU7HV1ucuBAREfmJiRMn4q233sJ7772HnTt34p577kFpaamoMrr99tsxefLkM9Z75513MHToUMTExOjGS0pK8PDDD2PTpk3Yv38/1q5di+uvvx6tWrXCwIEDz8k58B4XIiIiL/D0IYuaG+vefPPNOHLkCKZOnYrc3Fx06dIFq1evFjfsZmVlwWzWX9PYvXs3vv32W3z11VdnbM9iseDnn3/Ge++9h8LCQiQmJmLAgAF48sknz9m9Nn4zcTlwshp2kxPv2b4UY1PGfCTyZ3t/EPmiKNmvI6nvfbrtTN7dS+T/jesp8nMv/U/kfw/vInLCG2+LHPOu7MuyaNZlIt85qb3I/9mRL3K8Xf/X06JrG7nvjCyRu+4uELn3o01Ebm5uK/IX8+Tx/bFXlqk1byNnz3a77Puy+WCRbt+9k6JEriyV7xX8niNySCP5GWmZ0tukWYT85o22yn4mJ7Lk56yhTRrJbVbq70R3BkfBlSNKHxe78g+tsqxKZGtooMjVSh8Xa7jsLaM5S0U2h8gb3E5XqTSRUfuyqP1a1F44ZQbjldVqfxf5g8epNqmBvsdLhVP2plF/0Km9X4z6stRm/HQWg2YZZoNxo20ZLW80Dhj36TDD9RtGWzLajr+2Sa9PNf39Ue2ZzKdenqzvjnHjxmHcuHEu31u/fv0ZY23atNH1jFIFBQXhyy+/dPneucKPioiIiMhn+M0VFyIiooaED1l0DycuREREXmA2w8N7XOrxYHwIJy5ERERe4E5J8+nr+yM/na8RERGRL+IVFyIiIi8wmTy84sJ7XC5sE7cuQnhYKO5vcb0YS2ssn24Z88xokY+cKBc5KVX/MKmsjM9FDnptvsid3+4mcuWrD4sc3vRikZ/bJMt/c07Kkt3ZPZqK3O+lb0V+prX+ceJxfS8S+bGpC0X+vUQ+CfTWS2U5dONY+YyIP2bJTolH9h0UuUkvuc2QrCSRv91zRLfvf3ZsLLKzWpYhF+yRpdiRHeTXU63sbRwsv80a2WQZcYlSDp3Yp4vIRVWyxBcATlS7/seZWyj/nuIDlNLhMlk6bFdK2x0VshzaFhkmsuYsljkwyOW+AKBCKT3Wl0O7Hi9TyrrNgbIc+qQyrpY8q6XNp7allEor7wUo56qWN1sDLC7HjUqVjcqkAX25a222da6uWJ9+XOdaff1/4Hz876SuX3P//F9cw6Y+KNEdmp9OXPhREREREfkMv7niQkRE1KB4eHPuObvU2cBx4kJEROQFrCpyDz8qIiIiIp/BKy5ERERe4OlDFj1Z15dx4kJEROQFbPnvHn5URERERD7Db664pL5+EBZbMBYOkH1Lury/SOT7G/UW2aJMYlflXqXbztBnA2V+JUPkTx+Tyy17+iuRu81aIPKCD7aLPDpIbsf58fMi790s+310HnOFbt/t2zUS+YEj2SKXKU1TukYpK0T0E1HtjVKSt1/kuFtl/5koR6LIv/95XLfvoKKDcOVYTonIjeJCXS5jK5U9YSKiZV+V4oNFIic1kv1nSh36fiZFFUofEeXvJv+E7F/TKkC+UVEme+TYwm0iO47Kvi+WENkjR+0V4rS5PgcAKFe+ziaL2sfFdb8WtY+L2t+lUunJYlZ6sjhOO2+rTf7zdCqPlLca9HEx6stiNG61GP/eYjH4RU7tOeFU92Hwm5/ReE2/KBpd/a7rL5fn47eyul6p99Mr+2TAZD718mR9f+Q3ExciIqKGhPe4uIcTFyIiIi9gObR7GsyFpmeffRYmkwnjx48XY+Xl5Rg7dixiYmIQGhqKYcOGIS8vz3gjREREdEFrEBOXrVu34o033kCnTp104xMmTMCKFSuwbNkybNiwATk5Objhhhu8dJRERET156+qIk9e/sjrE5eSkhIMHz4cb731FqKi5J2lRUVFeOeddzB79mz069cP3bp1w8KFC/H9999j06ZNXjxiIiIiz/11j4snL3/k9YnL2LFjMWTIEKSlpenGMzMzUVVVpRtv27YtkpKSkJGRcfpmhIqKChQXF+teREREdGHw6s25S5cuxbZt27B169Yz3svNzYXVakVkZKRuPC4uDrm5uYbbnDVrFmbMmHHG+IEt38AUYEXxog/EWMqcH0Sed7ksx835Q5YCm2aO0h/z42+JfNl1k0QOWDdb5B2TVoicfqP8+KvDO++KnNarqchbnvtc5GLLJSKH3zhFt29ztrzSZLEGiRxtlaW2+EFua2/7oXJ5ZWJeXiTLk61dbxU5bn+hyPt/y9ft27n/Z5ED7LJk+FBZtciXNImQ+1B+E7Acl6XbIY1DRD5xWJZSB8QniVx2ejl0uVLCq2w3q1iWN0cEKuXGZWUi2yPl18mZWymyOUytG5c05esKnFbGrJRDWwJk2bNaDq0uf1IphzYry1co4xaljNtZrT9vc7Dr92pT3qwbV8unHcoxmVxvBzCuVjAqkzZiduNSdp3Lnms4D9fL1/WIzk+jL3+97O/PTCYPb8710+8Zr11xyc7OxgMPPIDFixfDbreffYVamjx5MoqKisQrOzv77CsRERGdZxazyeOXP/LaxCUzMxP5+fm49NJLERAQgICAAGzYsAHz5s1DQEAA4uLiUFlZicLCQt16eXl5iI+PN9yuzWZDeHi47kVEREQXBq99VNS/f3/88ssvurGRI0eibdu2mDRpEpo1a4bAwECsXbsWw4YNAwDs3r0bWVlZSE1N9cYhExER1Ruzh1dNnH56xcVrE5ewsDBccsklurGQkBDExMSI8VGjRmHixImIjo5GeHg47rvvPqSmpuLyyy/3xiETERHVG08/7uHEpQGaM2cOzGYzhg0bhoqKCgwcOBCvvfaatw+LiIiIvKRBTVzWr1+v+7Pdbkd6ejrS09O9c0BERETnCK+4uKdBTVzOpfdeewjBoWG4fuQzYqyqVD6duPV6+UTnnodkefZDnUbqtjO1wyyRQ+OTRf7X4u0i36mU/Dbd+r7ItjD5ROIuk+V2ZwyW5dsBl8pS4+9LwnT7vmjpEpGjkruLfMmf34h88NMvRF5jk0+8TrTLp1GrJaNFkS1FTm19QOSf1+qb/JXvOiGyPSJW5KOVshy6o1IOvVMpwa3K+l3k8KbynPZ/kyV3ENFYxEqnLDsGgPxS+RRotRz6RKksbw5SSsKry2SZtS1J7s9RpZZDR8IVLTBY92e1vLmiWnM5rpZDq2XSZbpx10+BNumetqw/b7UkWX3PZlDebPQD0HC8xic0uy4xNipvrk1Jsm47qPsP3PPxM9rrja1I8IdKX05c3OM3ExciIqKGJMAMBHgw+dD8dKbtp6dNREREvohXXIiIiLyAHxW5hxMXIiIiL/C0j4vDTycu/KiIiIiIfAavuBAREXmBxWSGxez+9QOLyT+vPfjnWRMREXmZtx6ymJ6ejuTkZNjtdqSkpGDLli2Gy7777runnmKtvE5/MLKmaZg6dSoSEhIQFBSEtLQ07Nmzx61jqw2/ueKSMH0MQgMD0KzbWDF2UbtGIl/+4OciDx7UVuSuYTbddhY+8rHIYz/6TOSXX5D9Wj56dYTI3z+6UOR2/3ha5CNd5POWCiqnity4Qy+Rn1sj+58AwAMf/iiPfdRtIrc52UTkvavkOp+1PCTyhEj5jRZgl71ifsk/KfLlybLPzJxjObp9H/05T+SQRgNELqmWPUnaxsr+NbmBss9J+YE/RA5Pkv1ajlb8KbIjLE5mfTsT5Kv9Wixyrl12QhmPkufnqCwT2RYpz1XtI2Ix6OPiCND/g1T7tZQr52oOkH1xKnTjSh+XSmV/ynE7lOXV/i5VFfr+J2ZlHafS+0X9YaWek9rfxel03d9F10tFNy63D9Tc40Wso+sh43oZo/GaenTUtceL0bZM/tAI5Bwz6ttDvuuDDz7AxIkTMX/+fKSkpGDu3LkYOHAgdu/ejcaNG7tcJzw8HLt37xZ/Pv3f1vPPP4958+bhvffeQ4sWLTBlyhQMHDgQv/322xmTnPrAKy5ERERe4I0rLrNnz8bo0aMxcuRItG/fHvPnz0dwcDAWLFhguI7JZEJ8fLx4xcXJXzQ1TcPcuXPxxBNP4Prrr0enTp2waNEi5OTkYPny5e58Wc6KExciIiIvON8Tl8rKSmRmZiItLU2Mmc1mpKWlISMjw3C9kpISNG/eHM2aNcP111+PX3/9Vby3b98+5Obm6rYZERGBlJSUGrfpCU5ciIiIfFhxcbHuVVFR4XK5o0ePwuFw6K6YAEBcXBxyc3NdrtOmTRssWLAAn376Kd5//304nU707NkTBw8eBACxXl226SlOXIiIiLzAYjJ5/AKAZs2aISIiQrxmzZp1lj3XXmpqKm6//XZ06dIFV1xxBT7++GM0atQIb7zxRr3to6785uZcIiKihsTTBnR/3WCfnZ2N8PBwMW6z2VwuHxsbC4vFgry8PN14Xl4e4uPja7XPwMBAdO3aFXv37gUAsV5eXh4SEhJ02+zSpUutz6UueMWFiIjIC+rrHpfw8HDdy2jiYrVa0a1bN6xdu1aMOZ1OrF27FqmpqS7XOZ3D4cAvv/wiJiktWrRAfHy8bpvFxcXYvHlzrbdZV35zxWXRF3thNZmx46AsdcaRAyKGLdwol921SeSXP5+p285DfSaJPLd1icjPHpcz2P1/e0TkL3bOF/nF2y4V+el1skT4UqVU+XjvFiJ/t+YX3b43ZxeL/K++F4ncurH85lgz7j8iZ+0+KnKz3k1FDi5LFHnDn8dEHnGpLKuuKi3S7fvIjsMiR3SOFblMqV1uGi5LgRvZZBlx0V5Zlh2WJD8HLVDKhSusYTByuLhc5BClvrb8ZJXIdqUcuqpM/r3YI+V2NWehyKbgCJf7UkueAX05dElltevxCjmuL4dWx+VxV1cppc3q+VTL8wH0pdJOp/w6WwPkvrValD1ble3olq+h1NWoDNbot0Oj5WtTTqseU03qqzDX1yp86/oLuY+dHp1nEydOxIgRI9C9e3f06NEDc+fORWlpKUaOHAkAuP3229GkSRPxcdPMmTNx+eWXo1WrVigsLMQLL7yAAwcO4K677gJwquJo/PjxeOqpp9C6dWtRDp2YmIihQ4eek3Pwm4kLERFRQxJgNiHgPD+r6Oabb8aRI0cwdepU5ObmokuXLli9erW4uTYrKwtmpZvv8ePHMXr0aOTm5iIqKgrdunXD999/j/bt24tlHnnkEZSWlmLMmDEoLCxE7969sXr16nPSwwXgxIWIiMgrPH06tLvrjhs3DuPGjXP53vr163V/njNnDubMmVPj9kwmE2bOnImZM2fWuFx94T0uRERE5DN4xYWIiMgLvHXFxddx4kJEROQFFpOHExdfu9O8nvCjIiIiIvIZvOJCRETkBfXVgM7f+M3EZeorNyM8yIY5F18rxizK3/kjH30mcvqry0V+9mRn3XaG90sWef3Qe0VuPWCqyCPf3CxyT0323+h5crvIt30h+76Mv1GWlXXrf7HIvdL1T+vMKZd9Qe5uK3uphMQPEzm7bJHIBft+E7n50K4iR26X+1i3Qz5L4tHLomCkYE+ByDGDQl0uE22Wz8doFBwoctF+ea6NenUXuVjpmXK83LiXx8GCMpE7KD1JKspk35MgpY+Lo0Qub4uW/Vo0p+xZ47SFuNxXWbWm+7PJInumnKySx2gOlP1aSpS/F3X8pNKnRu3X4lTOW+3v4nDoe8gY9V+p67jRD8ZAg74vp6/jVN4z+jlZ10vWNf28bYhXv42O1+hQ/fT/J1RHvMfFPfyoiIiIiHyG31xxISIiakh4xcU9nLgQERF5gcXs2eTD4qefmXDiQkRE5AW84uIeP52vERERkS/iFRciIiIv4BUX9/jNxGWS/VpYg0LR1/ZfMXaoTJaxPlLwkcgXTR8h8v0Pv67bzuQP3hP5vsZ9RJ773xSRr7v9SZGfah0t8o+PPCNy3pHWIrf+zyMia8iW+bQS1SClfjt6/3fyPJr1FNmhVPOWHpHbCu/7L5Hjj1eKnLu/UGTzge0iW6xBun1nF8lS547J8pzUPgIBx/bL/TUNE7lwf5HIgQnJIpcoZcGFSjm09bR/jIeKZHlzz0DX5dB2pRzaWSjHzRExImvOPXIZmzw+k1mWPFecVpJsVt47oZQ3mwNk2XNZLcYtBmXPgTb5T1Atkwb05c3Oavl3ZrWcvexZc8jxQLPr5WvqAWE2qEmua9lzfZY2q8ekOw/D5eu+D1NDrMWmCxb7uLiHHxURERGRz/CbKy5EREQNicVk8uh5Q/76rCJOXIiIiLzAbDIZfixb2/X9ET8qIiIiIp/BKy5EREReYIH+mXnurO+POHEhIiLyArPZ5FFlkL9WFfnNxGXZvDdhslgxP/sHMWbaslzkqQOmiDxtsSxpfcCs/zTtzi/zRe4fLUuG++R/I7erPFG493OytPq5m+fJZTq1FTnT2kbkJu89JnJU8iW6fXfe/63IOUv/I/KqoXL9RLtaXitLaEubXipyz/Z/ivzuph9FLt9RIrI9Qj59GtA/mfrS5pEi71VKdqv37RA5Mlk+lTnr24Mim2KbilymlAUfPiHLrYNO+xXkWFG5yBHK+VWVyjJre4Lcn2OPPG+1HFql2eQTrtVy6PLTng6tK2+uUsub5fiJimplXPl6qE+TVs7JoZQ9WwLUpzDr921Tn/bsMCh7Nng6tMroNzqj8mJ31jEuVXa9oZo+mr+Qfxaz3JrIc34zcSEiImpIWFXkHk5ciIiIvIBVRe7hxIWIiMgLzCbPbs69kD9WrQnLoYmIiMhn8IoLERGRF7CqyD2cuBAREXkB73FxDz8qIiIiIp/hN1dcrr3nTgQGhaL1/y0TY30Hyj4p/cNsIs+74y2RH/9ilW47T81YIPKbC+8RecNdz4nc6V/Pi5zfK0Xk3PLZIsd3vlLkyZ/9KvJDCzeJ3Prum3T77oIkkX/7cLvIS+MOyPVjg0UOsMteJVtzZI+WK1vLHi3pR7JFzttyWOTQuEG6fRdUyt4c18aFi3wsUPZAKdu7S+SI5DiRj3y1T2RHRILMStuSQydkr5Ygi34+XXZC9mUJirKLXF2u9J2JkcfkrJLLW8Ii4YojQG5H7eNSWqnvZ2IOCBT5RGW1Mq70d1HWsSjHru/XIserKtT+LnLcqfS1AfR9WdTeKGp/F6dBHxddLxVd3xflmGrspaKso+sh43p5o3GjXwiN+rvUxGhbde2Nwt/WzuTN39z99KIBgFP/Bj3qnOunXzu/mbgQERE1JPyoyD385YOIiIh8Bq+4EBEReYHFbNI9wsOd9f0RJy5ERERewI+K3MOPioiIiMhn8IoLERGRF7CqyD1+M3F5NeBrhAfa0SxPlnZ+OOc7kRf+9JHIU1teJ/I0x/e67UyvLBN5/cU3i/z5blnqvOiuHiKP++8vIo9oHCKybXAbkT94f53IGw8Wizx+kFwGAC6+6CqRP/tivsj7dsgy5pYDLxI59FiyPL5f80R+pG8LkatKi0TOzTwkckyfxrp9Vzpl7XJypCwFjrfLUuLjv8vS6uh2zUU+opT/ngyQJdqqg8fl1zU8QH8h8GSJUg4dGySPvUyWQwc3jhLZWS3PFaExLvdXppQqq+XQaskzoC97Lil3XQ59orxKGZfHXl0l9xGglI2Xl8rlLbrSZqU+HIDFrLxXLb8GRmXPFl3ZsxwPNLu+sFrTZeZAg5+IRuvU5pK1ekw1qa+fxb52Fb2utyv42OmRCyYPPyqqayuAC4XfTFyIiIgaEt6c6x7e40JERORH0tPTkZycDLvdjpSUFGzZssVw2bfeegt/+9vfEBUVhaioKKSlpZ2x/B133AGTyaR7DRo0yGCLnuPEhYiIyAvMOPURodsvN/b5wQcfYOLEiZg2bRq2bduGzp07Y+DAgcjPz3e5/Pr163Hrrbfim2++QUZGBpo1a4YBAwbg0KFDuuUGDRqEw4cPi9d//vMfN46udjhxISIi8gKLyeTxq65mz56N0aNHY+TIkWjfvj3mz5+P4OBgLFiwwOXyixcvxr333osuXbqgbdu2ePvtt+F0OrF27VrdcjabDfHx8eIVFRXlcnv1gRMXIiIiH1ZcXKx7VVRUuFyusrISmZmZSEtLE2NmsxlpaWnIyMio1b5OnjyJqqoqREdH68bXr1+Pxo0bo02bNrjnnntw7Ngx90/oLDhxISIi8oK/GtB58gKAZs2aISIiQrxmzZrlcn9Hjx6Fw+FAXFycbjwuLg65ubm1OuZJkyYhMTFRN/kZNGgQFi1ahLVr1+K5557Dhg0bMHjwYDgctaskrCtWFREREXmBxWz8ZPXarg8A2dnZCA8PF+M2m83DI3Pt2WefxdKlS7F+/XrY7XYxfsstt4jcsWNHdOrUCS1btsT69evRv3//ej8Ov5m4TBvzPqwmM7bkyr4qQ59dL/LfFsnZ5sfT5d3QC254Rred3s+8I/I9L8r1R9sDRU5c+7LIGSvkl3jh43K7vfvJfiuvz5wjckGlnKFe01x+YwCAqdntIueUvyry8T9/Ern5+H4iN94o9/HdT7LXS2wP19/U+XsL5DncFulyGQAILz8qcnyjYHnsu+XXMHGQPI7jVfKcjpYpfUeUj2cPHDspcs9A/b/k8lLZwyQ4Vu7PUSB7vwRGyuPVnDkiO+1hLs+hVOmxYrLIHisllfrfEMyBBn1clPEyZR21X0u1ct5Wm/w+cDjkvoOscnm1VwtQ934tVoOfgOrXWdffxaL2kNGft9Fn50bjRh+1G1VrutN+4nxcHjY83jouT3Q+hYeH6yYuRmJjY2GxWJCXl6cbz8vLQ3x8fI3rvvjii3j22Wfx9ddfo1OnTjUue9FFFyE2NhZ79+49JxMXflRERETkBaeqgzz5qKhu+7NarejWrZvuxtq/brRNTU01XO/555/Hk08+idWrV6N79+5n3c/Bgwdx7NgxJCQk1O0Aa8lvrrgQERE1JGY3K4PU9etq4sSJGDFiBLp3744ePXpg7ty5KC0txciRIwEAt99+O5o0aSLuk3nuuecwdepULFmyBMnJyeJemNDQUISGhqKkpAQzZszAsGHDEB8fjz/++AOPPPIIWrVqhYEDB7p9bjXx6hWX119/HZ06dRKXuVJTU7Fq1Srxfnl5OcaOHYuYmBiEhoZi2LBhZ1ziIiIi8kX1dXNuXdx888148cUXMXXqVHTp0gXbt2/H6tWrxQ27WVlZOHxY3lrw+uuvo7KyEv/4xz+QkJAgXi+++CIAwGKx4Oeff8Z1112Hiy++GKNGjUK3bt3wv//975zda+PVKy5NmzbFs88+i9atW0PTNLz33nu4/vrr8eOPP6JDhw6YMGECVq5ciWXLliEiIgLjxo3DDTfcgO++++7sGyciIqIzjBs3DuPGjXP53vr163V/3r9/f43bCgoKwpdffllPR1Y7Xp24XHvttbo/P/3003j99dexadMmNG3aFO+88w6WLFmCfv1O3ei5cOFCtGvXDps2bcLll1/ujUMmIiKqF/VVVeRvGsw9Lg6HA8uWLUNpaSlSU1ORmZmJqqoqXa1427ZtkZSUhIyMDMOJS0VFha75TnFxscvliIiIvMndj3vU9f2R1ycuv/zyC1JTU1FeXo7Q0FB88sknaN++PbZv3w6r1YpIpcwVOHujnFmzZmHGjBlnjA9Pa4HQwAAcuFKW6W7bsk7ksN4PiLzvkxdE/n3KF7rtfDZCloGFvSVLo2++s6vInz+wROTiJnKCFTz6NZHNGxaJbI9oJHKzIFlWXb1SLg8AP/S4W+RQpVS27Lj8egSkymXaHJWfU275Zqfc7i9ZItvCZPfDvXuqRO7VOla376NKTa3p4G8iR7WIFPn4n4UiByZdLHJJtSz/zVdKm63KLfF7C2Q5dLRSIgwAFaUlIoc0luXNjtxykS1RjZU15PFpSjm0ySy3W6YckyVAKXmukCXPp793QimHDrDKz24rlHJoS4A8J6eyD3Ow63GjkmdAX96sK3tW11EaPKk/xNTlzQalB5YafuYZ/UA0HDcoGHar7NngPIyXr9v2Tefhh/352AeRv/L6haY2bdpg+/bt2Lx5M+655x6MGDECv/3229lXNDB58mQUFRWJV3Z2dj0eLRERUf0wmTx/+SOvX3GxWq1o1aoVAKBbt27YunUrXn75Zdx8882orKxEYWGh7qrL2Rrl2Gy2c3YnMxERUX0xw2R4tbK26/sjr19xOZ3T6URFRQW6deuGwMBAXaOc3bt3Iysrq8ZGOURERHTh8uoVl8mTJ2Pw4MFISkrCiRMnsGTJEqxfvx5ffvklIiIiMGrUKEycOBHR0dEIDw/Hfffdh9TUVFYUERGRz/P04x5+VOQF+fn5uP3223H48GFERESgU6dO+PLLL3HVVVcBAObMmQOz2Yxhw4ahoqICAwcOxGuvvXaWrRIRETV8p1r+e7a+P/LqxOWdd96p8X273Y709HSkp6efpyMiIiKihszrN+eeL0XPL0R1aBhWt08RY1Udeoucep98ovNNjy8X+X/j5TIA8PtdN4uclHqXyM1myTLrF9O7iBzZ6xKRn/hqr8j/mP2+yC1SHxX5b2X/E3l7ur4b4RtV8rkPgyPkDchmpWT39+pIkYd2kbcwff3+pyIf/e6IyKFxnUXOU0qBr24epdt3hlV+q1T+/qPIUa1lKffvW2X5tSOqmVzeqYmcVSRLmNWS7uJCZTxK/1TsqtIikYNayOOqrpBPh9aXQ0tOm0E5tPJ0aHOALEE/cfrToQ1Kpc1KqXKlMq4+HbqqwvVTo9WnQ9uUr4Gzyvjp0E6jcmjd057VMmK5j0CDp0nryo4dpz0dWrn7Tf9katfjdXU+flNscDfw+TF//UjjbPhRkXv8ZuJCRETUkLCqyD2cuBAREXmDp71Y/HPewqupRERE5Dt4xYWIiMgLWFXkHk5ciIiIvMAEzz7t8dN5Cz8qIiIiIt/h1hWX0tJSPPvss1i7di3y8/PhVEovAeDPP/+sl4MjIiK6UJlNJsMnrtd2fX/k1sTlrrvuwoYNG/Cvf/0LCQkJPvEI91vveRGmABuOr3tGjD3Ud7LI3/w9VOSgJZtELntJ3/zuvWZdRH5nVx+Rx395QORLI2UfkuPXyz4wyz76QeTILTki3/t8B5G7tEkT+bVx/9Hte+vmgyJP6pcscmiZzP/dIXupjLi0iTyP47kiH/p+n8gxna8XuaRaTkDbxQbr9p0VJL9Vjm7/XeTotnLfueXbRC4Pkf1dVPsLToocHiB7m5wsrhA5pHGIbp1KpY9LcGPZx0VzFopsjoh1ub+T1bKHjNqTpai82uV4cXmVbn2LNUjkEuW9AKs89mqlJ4xFaXRSXi2Xtyi9VxzK19mqfA1O74tiM+jXYtTHxWLw79Doh5ulhg/IjdYxGleHdb1iDC5m1/QTw+jHidHPGR/48SO4c09CfZ2ev/5PriEzwcM+LvV2JL7FrYnLqlWrsHLlSvTq1au+j4eIiIjIkFsTl6ioKERHR9f3sRAREfkNMzy70dRfb1J167yffPJJTJ06FSdPnjz7wkRERHQGk8nk8csfuXXF5aWXXsIff/yBuLg4JCcnIzAwUPf+tm3bDNYkIiIicp9bE5ehQ4fW82EQERH5Fzagc49bE5dp06bV93EQERH5FT4d2j0edc7NzMzEzp07AQAdOnRA165d6+WgzoUmXf4Giy0Y/b4PF2MfTB0g8tvdbhO594y3RB4y9SvddkYqpaiX/SCX+8cS+aWcOXWwXP96Werc4uX5Iuco5biT2keIbLr4XpH337lIt+/8nVtFvvh+eexxG1uJ/MXmbJEfu8T1LUw5v+SL3OTvUS6Xia06pvtzQowsCz6yQ5Zlx/WXJeFHK2UZ7JGT8vwsyj+uP4+Uipxilcd38oRSDh2nL4d2FJSJbGssy56d1fI8nEERcOWkUqpsssjS46IK5fhs8tyKTurLoc2BslT6hPJ3FhColkMrpco2+X3gcKhlz/JcndWVZx0//T1dObTF9d9roPLrl7p8oLK8Ux2v4dc1o9Jqox+URptqiD9Ya/ot1egtf/3Nls4t3pzrHrcmLvn5+bjllluwfv16REZGAgAKCwtx5ZVXYunSpWjUyHUPDyIiIiJPuDVhu++++3DixAn8+uuvKCgoQEFBAXbs2IHi4mLcf//99X2MREREFxxWFbnHrSsuq1evxtdff4127dqJsfbt2yM9PR0DBgyoYU0iIiICeHOuu9y64uJ0Os8ogQaAwMDAM55bRERERFRf3Jq49OvXDw888ABycuTzdg4dOoQJEyagf//+9XZwREREFzKTBy9/5dbE5dVXX0VxcTGSk5PRsmVLtGzZEi1atEBxcTFeeeWV+j5GIiKiC85fHxV58vJHbt3j0qxZM2zbtg1ff/01du3aBQBo164d0tLSzrImERERkfvc7uNiMplw1VVX4aqrrqrP4zlnNk+4GOFhoQi59kUx9r8F00XOniX7kay+uanIIQsX6rYz6lH5Udj7d78nclFyT5Edd8qrTlFfpYscHJMocssQ2R/k5PvPivxd3wkiRwTqL4iVHc8V2XLlRJEvLdkv8rqV8nELVZm7RbZHyBL13b/LfiEDO8aLnKP0DcH+7bp9x7aJEfnobtnjJbCF7FNTUi3vb8oukn1ZgpQ+IrvzS0S+Rul5Ul5cJHJogr4nS1WO7P1iiWmnvPObSM5g2Y/GZJY9VkqUPi6WAPk1L1J6sqjjhaf1cQmw2kQu0/VxkedUrfSvCQ61uhwPsspjclbJr3+Q0g9G7b0CnNbHxSHfMyuVBOo6AQb9XSwGv5UZbaem98wGF6jr2t+lxn27XqXOv12ej4oLf63qoPrhaWWQv37/1XriMm/ePIwZMwZ2ux3z5s2rcVmWRBMREdWMVUXuqfXEZc6cORg+fDjsdjvmzJljuJzJZOLEhYiIiM6JWt+cu2/fPsTExIhs9Przzz/P2cESERFdKDypKPKksig9PR3Jycmw2+1ISUnBli1balx+2bJlaNu2Lex2Ozp27IgvvvhC976maZg6dSoSEhIQFBSEtLQ07Nmzx82jOzu3qopmzpyJkydPnjFeVlaGmTNnenxQREREFzqzyeTxq64++OADTJw4EdOmTcO2bdvQuXNnDBw4EPn5+S6X//7773Hrrbdi1KhR+PHHHzF06FAMHToUO3bsEMs8//zzmDdvHubPn4/NmzcjJCQEAwcORHl5udtfm5q4NXGZMWMGSkpKzhg/efIkZsyY4fFBERERXej+ejq0J6+6mj17NkaPHo2RI0eiffv2mD9/PoKDg7FgwQKXy7/88ssYNGgQHn74YbRr1w5PPvkkLr30Urz66qsATl1tmTt3Lp544glcf/316NSpExYtWoScnBwsX77cg6+OMbcmLpqmubyb+aeffkJ0dLTHB0VERES1U1xcrHtVVFS4XK6yshKZmZm61iVmsxlpaWnIyMhwuU5GRsYZrU4GDhwolt+3bx9yc3N1y0RERCAlJcVwm56qUzl0VFSUKN+6+OKLdZMXh8OBkpIS3H333fV+kPUh/dKbYDdZMGPFSjH2fxNkqXLuhw+IvL7vP0Tu9q/nddup/r8UkbdNv0TkJpddLfJt//5R5Ifm/EfkjnfPFjktVH6muPnFL0V+qUJu58HYEN2+X7GHivztEU3kf3ZvJvLH8xeLnLPmsMgRzQbJ8f/Jst4RybLMeZ1Snlz64ybdvhtdIkvEf/n+oMjVMckiVzrlMf1xXH6UGKqU9Z4oKJPjjYJFrjopy6GD28tjAvTlwwGx8XCl2iq/NmalvPlEhSy1tVjtIhdVVCnjQSKXVMivDQAEKOXK1VXKtpRzqlL2YVZKkp0OWYodbHVd9mxTtuM8rSw4yGCdQKW+WVMesaGWPetKmNXSY6Ws2qB6usb3DMue6/hpe02/Kda1xNOt374uYO58fFBf/LQ6120mTYNJ086+YA3rA6d6q6mmTZuG6dOnn7H80aNH4XA4EBcXpxuPi4sTPdlOl5ub63L53Nxc8f5fY0bL1Lc6TVzmzp0LTdNw5513YsaMGYiIkP02rFYrkpOTkZqaWu8HSUREdMHRnKdenqwPIDs7G+Hh4WLYZrMZrXFBqNPEZcSIEQCAFi1aoGfPni4ftEhERETnT3h4uG7iYiQ2NhYWiwV5eXm68by8PMTHu76aHR8fX+Pyf/03Ly8PCQkJumW6dOlSl9OotVpfZS0uLha5a9euKCsrO+Nztb9eREREVDOT5vT4VRdWqxXdunXD2rVrxZjT6cTatWsNPy1JTU3VLQ8Aa9asEcu3aNEC8fHxumWKi4uxefPmc/YJTK2vuERFReHw4cNo3LgxIiMjXX4O/ddNuw6Hw8UWiIiISKinj4rqYuLEiRgxYgS6d++OHj16YO7cuSgtLcXIkSMBALfffjuaNGmCWbNmAQAeeOABXHHFFXjppZcwZMgQLF26FD/88APefPNNAKfuSRs/fjyeeuoptG7dGi1atMCUKVOQmJiIoUOHun9uNaj1xGXdunWiYuibb745JwdDRERE587NN9+MI0eOYOrUqcjNzUWXLl2wevVqcXNtVlYWzGb5YUzPnj2xZMkSPPHEE3jsscfQunVrLF++HJdcIotTHnnkEZSWlmLMmDEoLCxE7969sXr1atjt9jP2Xx9qPXG54oorXGYiIiJyg6adenmyvhvGjRuHcePGuXxv/fr1Z4zdeOONuPHGGw23ZzKZMHPmzPPWgNatp0OvXr0aoaGh6N27N4BT7YPfeusttG/fHunp6YiKijrLFs6/WJsFQSYL+q5+SozNjugs8uNaP5FP7pJly+vv767bTs/nvhV5Tg/5tOdUpUz6/odfF/mL/YUiv/LPriJ36HOvyIt7yyc97874VeTOd/bQ7Tt6nzzeN77dJ/LCmzuJXFUqy4oPfCMfv5D4jyYiq2XL7WLljHhfiLzZOu8HfWlcs/6XiXyoTH4NCk36ku2/7MmTDQrjlZLikkLZSTE0UZYwVyrHHdpEPskaAJzVh+QfIhq73F+J8iRm9enQBWWy7Fktky5SngJtscly6MKTsvQa0JdDq2XP6njZCbmOVSlhdlTL0mprgPJ06GplefUJ0DU9HVothzYbjFtcl1YHGjweuqayWaP3zAYl10bqszq2vkptz0fFrjsPv2MlsR/ywkdFFwK3WiA8/PDD4ibcX375BRMnTsTVV1+Nffv2YeLEiWdZm4iIiMg9bl1x2bdvH9q3bw8A+O9//4trr70WzzzzDLZt24arr776LGsTERHRqQZ07l818aR5nS9z64qL1WoVD1n8+uuvMWDAAABAdHQ0y6GJiIhq46+Pijx5+SG3rrj07t0bEydORK9evbBlyxZ88MEHAIDff/8dTZs2PcvaRERExHtc3OPWFZdXX30VAQEB+Oijj/D666+jSZNTN36uWrUKgwYNOsvaRERERO5x64pLUlISPv/88zPG58yZ4/EBERER+QVecXGLWxMX4NTToJcvX46dO3cCADp06IDrrrsOFovlLGsSERERNCfg5MSlrtyauOzduxdXX301Dh06hDZt2gAAZs2ahWbNmmHlypVo2bJlvR5kfRj22waEh4djfEgHMfb1oXki97h+kshrLpc9T7Zcpa+S2lHZXuRey98QuXflYZH/70SByEFKD432WfJZDgdaDRC5zCG/+Qr+/EnkxGfH6vbdavkJkTO3HBTZ2vGIyAF22Rvlt99kb5ReneXDr6qVJhP2nJ9FTmgdLXLeT/rHkbe8R/agOVop+5PklMh+KFZluzsPy5u0u9jlZLa0+KTI4U3lQ8Gq95aKHNhY//2jObNEdgTJHkFqv5biSvk1DFD6shRVyGNV+7UcK5G9VCxWOV5SLpcHgAClL0t1lexbYg+2uhwPsrru1xKk9H1R+5/olq/S95Ax7tdSt74sFoNxdfunq2vPFKPl1WNSz6Gmz6jr2gPF1eNH3NmOu+sQ0fnl1j0u999/P1q2bIns7Gxs27YN27ZtQ1ZWFlq0aIH777+/vo+RiIjognO+H7J4oXDrisuGDRuwadMm8ewiAIiJicGzzz6LXr161dvBERERXbB4j4tb3LriYrPZcOLEiTPGS0pKYLVaXaxBRERE5Dm3Ji7XXHMNxowZg82bN0PTNGiahk2bNuHuu+/GddddV9/HSEREdOH56yGLnrz8kFsTl3nz5qFVq1bo2bMn7HY77HY7evXqhVatWuHll1+u72MkIiK68LBzrlvqdI+L0+nECy+8gM8++wyVlZUYOnQoRowYAZPJhHbt2qFVq1bn6jiJiIiI6jZxefrppzF9+nSkpaUhKCgIX3zxBSIiIrBgwYJzdXz1psv9/4U5MAgbx/cUYycf/qfITS8bJXKPZ58R+YGIS3XbiRg6TOSHt8nayRtffljk1lc+IvIQsyw33vrwXJHn391c5AHRshz3HWVfu+z6ieCoK2SJ8bgVX4qc9/kxeXxNO4q8/wfZJPCaDnEiZ9jkX3v5D7JEO76bLAPfvEQeNwBoTWUZeJlDXp7cdVSWMUcEygt4eflyPDpGnl9FkSzdDrtEHlPVLyUiB8QlQW+TSM6QGJHVcuiSSqXUNiBQ5ONlslw7QCl7LlLHlVLlCmUcAAJt8r2qCrmPsCg57lDK2YMNyputAfJr46h2Pa6WCwP6smdN6fUQaHZdYqwbd7gun1aXtyjXW0/ftxmu64KNy55dj9cnty4P1xOjkmt/xS9H/eBDFt1Tp58FixYtwmuvvYYvv/wSy5cvx4oVK7B48WI4PWmgQ0RE5I/4UZFb6jRxycrKwtVXy4ZsaWlpMJlMyMnJqfcDIyIiuqBx4uKWOk1cqqurYbfbdWOBgYGoqqoyWIOIiIio/tTpHhdN03DHHXfAZrOJsfLyctx9990ICQkRYx9//HH9HSEREdGFiA3o3FKnicuIESPOGLvtttvq7WCIiIj8hadt+9nyvxYWLlx4ro6DiIiI6KzcelaRLyoryIEpwI7ldz8pxn7v01/kH04MErnfq7L8dqryxGQAuHji9SI/9fRikc3/yxb5tbcvF7nHoLtFnjF4hsjfNJdPgZ7xL/nk5eicziLP3vCHbt8vXdNG5FHH5dOb96zYKXKTITeIXPKRnI1fliifGn0kVJYL5/zvR5HjUy8Red9bmbp9F9tj4cqOHFmi3cgqv51OFJSJrD4FukJ5cnZYkiyHdlbLp2ubouWTrE+nPgXaHCAfL3H0pLzPSn3a89GSCpEDguTXoPCkUpKslIerJc+AvlS67ISyjvrU6Eq57yDla6A+HVotk1ZLj2sshzZ4enOgxWi8bk+NNhoH9OWu+qc6G5RJ12I7+vHa7buhq/OTrOt13z70hSLXnM5TL0/W90N+M3EhIiJqUDxt288+LkREREQNG6+4EBEReQOritzi1Ssus2bNwmWXXYawsDA0btwYQ4cOxe7du3XLlJeXY+zYsYiJiUFoaCiGDRuGvLw8Lx0xERFR/firqsiTlz/y6sRlw4YNGDt2LDZt2oQ1a9agqqoKAwYMQGmpfM7NhAkTsGLFCixbtgwbNmxATk4Obrjhhhq2SkRERBcqr35UtHr1at2f3333XTRu3BiZmZno06cPioqK8M4772DJkiXo168fgFMl2e3atcOmTZtw+eWXu9osERFRw8ePitzSoG7OLSoqAgBER58qQc7MzERVVRXS0tLEMm3btkVSUhIyMjJcbqOiogLFxcW6FxERUYOjaR4+q8g/q4oazM25TqcT48ePR69evXDJJaf6ieTm5sJqtSIyMlK3bFxcHHJzc11s5dR9MzNmzDhjfN0bYxEaFo5LBk8UYxvTWoi8rWdfkbdaZD+TfhuX6baTViD7tTx+XN5rY1UaOvTYv1LkfR2GilxUNVXkI7tkr5jmz0wSud2ncqK1fv2fun2HtDggcoBd9iTZ8ZvsjdKve1ORy5VjCjm4TeRm7WRPloOb5Pkkj75L5KOV+maD+wuVHibKdn/KLhT5NrvsVVJSKD/ui2wRJXLVLnl+1ibtRNacB0V2hDXS7dtklttV+7gE2JR+LUpfFosyfqxEGVf6uxQq44HKcVdVVOv2HRwuH29RXSX7mQQpfVnUfi1BgQbj6vJVctwe4Lq/C6Dvy6K+F6h8/Z3KuMWgr4dRP5ia2oAYtIoxXEftKaLv+2K0vPG+jRj1fjHaltEuatp3Tf1liOqd5gBO+3df5/X9UIO54jJ27Fjs2LEDS5cu9Wg7kydPRlFRkXhlZ2effSUiIiLyCQ3iisu4cePw+eefY+PGjWjaVF4xiI+PR2VlJQoLC3VXXfLy8hAfH+9yWzabTfcQSCIiooZIczqhedD91pN1fZlXr7homoZx48bhk08+wbp169CiRQvd+926dUNgYCDWrl0rxnbv3o2srCykpqae78MlIiKqP06H5y8/5NUrLmPHjsWSJUvw6aefIiwsTNy3EhERgaCgIERERGDUqFGYOHEioqOjER4ejvvuuw+pqamsKCIiIvJDXr3i8vrrr6OoqAh9+/ZFQkKCeH3wwQdimTlz5uCaa67BsGHD0KdPH8THx+Pjjz/24lETERHVgwZ8xaWgoADDhw9HeHg4IiMjMWrUKJSUlNS4/H333Yc2bdogKCgISUlJuP/++0W18F9MJtMZr7re2+rVKy5aLUq57HY70tPTkZ6efh6OiIiI6PzQHA5oDvcnH56sezbDhw/H4cOHRXPYkSNHYsyYMViyZInL5XNycpCTk4MXX3wR7du3x4EDB3D33XcjJycHH330kW7ZhQsXYtCgQeLPp1cOn02DuDn3fDgweAhCLBZc+q/nxVj8/6WIPCtWlkA3GX21yIM/OqzbzkNzJojc/e7ZIt+YsEfkb0bPEfm5+5JFfjA+TOSFSmnuhqpEuf0B8qbjf3yov7KUtUQeS0wr+Zf++5YVIo/o0kTkdUGBIp/43yqRm/ZsKZd5U5Zl92zeReQyh35S+VOeLGOOVkp7N+fKGXijeFmiXX5clquHd08QufqnMpEDE5OVPXwnlwmK1u3bHGAV+XiZLFe2WO0iq+XQgUqpeEGpUsZtk9/ulUrZc0CgWg6t/0GgvqeWQ4fZ5bbU8uZgtexZ+W1ILYfWlTbrSp71N9qpZc+6EmO19NhhtC2lTFq5rqobr6H012xQTGxYemw4Xvfy4gZT6thAmL1Yos3qcP+0c+dOrF69Glu3bkX37t0BAK+88gquvvpqvPjii0hMTDxjnUsuuQT//e9/xZ9btmyJp59+Grfddhuqq6sRECB/ZkZGRhoW2NQGf0YQERF5g9Pp+Qs4o+lqRUWFR4eVkZGByMhIMWkBgLS0NJjNZmzevLnW2ykqKkJ4eLhu0gKcur81NjYWPXr0wIIFC2r16YvKb664EBERNShOp2f3qfz/iUuzZs10w9OmTcP06dPd3mxubi4aN26sGwsICEB0dLRh89fTHT16FE8++STGjBmjG585cyb69euH4OBgfPXVV7j33ntRUlKC+++/v9bHx4kLERGRD8vOzkZ4eLj4s1Evs0cffRTPPfdcjdvauXOnx8dTXFyMIUOGoH379mdMoKZMmSJy165dUVpaihdeeIETFyIiooZOczrOeNRHXdcHgPDwcN3ExciDDz6IO+64o8ZlLrroIsTHxyM/P183Xl1djYKCgrPem3LixAkMGjQIYWFh+OSTTxAYGFjj8ikpKXjyySdRUVFR6+axnLgQERF5gybvU3F7/Tpo1KgRGjVqdNblUlNTUVhYiMzMTHTr1g0AsG7dOjidTqSkpBiuV1xcjIEDB8Jms+Gzzz6D3W43XPYv27dvR1RUVJ063nPiQkRE5AX1dcWlvrVr1w6DBg3C6NGjMX/+fFRVVWHcuHG45ZZbREXRoUOH0L9/fyxatAg9evRAcXExBgwYgJMnT+L9998XNwoDpyZMFosFK1asQF5eHi6//HLY7XasWbMGzzzzDB566KE6HR8nLkRERKSzePFijBs3Dv3794fZbMawYcMwb9488X5VVRV2796NkydPAgC2bdsmKo5atWql29a+ffuQnJyMwMBApKenY8KECdA0Da1atcLs2bMxevToOh2b30xc1v5ZCJvJjA1XFoqxluNlU5wN43uKfN8jA0Tudt0juu20+vO4yCvukZfMQv/5sshvNxss8k+r14t8xbPDRG6yubPIMz79VeQ1Iy8WuapU33Fw18e/yeN48F6RK9+XpWQdw2RPkfxY2Stm/5eZIre54zqR/5izUeTDjmAY2bpfnndXpYdJ4ZFSkaMuihS5vOiIyBGtmovsrJb9brRo+UBN1fFy/W8R5kDZxyVP6ctiscnzO1Isy/8CgmQfl2MlcjxQ7eOi9INRx0uL9WWEQcq5VlfK94KsSh+X6kpl3OJy3BogOw+ovyXZLa7HASBQec9p0PtFt7zZdXcDi0HzFXX49H0b9mVxPVxn7vQHMewhU8fl3VHXbbH9CdWKp91vz2Hn3OjoaMNmcwCQnJysK2Pu27fvWcuaBw0apGs85y6/mbgQERE1KE4P73Hh06GJiIiIGjZecSEiIvKChvysooaMExciIiJvqKfOuf6GHxURERGRz+AVFyIiIm9owFVFDZnfTFymfTEd4SHBmHLFw2KsoMf1Iu95Yq7IbebeJ3LsxX1027nygCwfPvroHSK/deMzIjcLki2OS/L2i1z591dF/mdclsjpry4XuSzya5HDElrq9r1p5waRR19xkcg71BLcLStEbt4nSeQ/v5bH0WG2PKeCSvncil/yZWlzRKD+YtymA7Ic+roI2eGw5KhsCx3VJkHkyo3FIgcmySeMas5dIjvCZetoc4AseS48rRw6wCrLnvNLlfJmuyx7zj+hjstujSeU8mlbkPx2ryivEjmyUYjI1ZX6fYcp5dDOKqXsOdB12bNaDq1+/mxU9hxQQzm0zeL6gqha9qyuY1ZqjHXjBsW5NZUkG5X/Gu+jjtsx3jVM7tRK18G53r4v4pfEOzSnE5oHH/d4sq4v40dFRERE5DP85ooLERFRg8KPitzCiQsREZE3aB5OXDROXIiIiOg84T0u7uE9LkREROQzeMWFiIjIG9iAzi1+M3EZ8n0MAuwhmJocKcbiZo0T+dYH5ot859r/ibx410u67Vw+SpY6zxg8Q+R/F30r8oYxl4k8L0fmR1buFvmla9qIPOvR30X+8fWdIrcYMl237yOr3pLbahMjskUpTz742ZciJw2U+/7kI1mGnBrRQmSH8jDPTfsLRE60y/MEgGOHS0SObh0tctnxXDk+QD4F2vH1YZHN8XJ/qiKH/PZTy6EPl+if0Bxgl+XKh4vKRQ4MiRA5v1iO25RjLy+VZc/qU6DLC8rk8sp4VYUsbQaAUGVbjkq5jlom7ajF06FtAUqZtPLDxh5gfNFTfQq0Wlpt+HRog3GTwVOgjcqkAeOnGxs+NdrgDV8rs/XmU6DNvvbFIs/x5ly38KMiIiIi8hl+c8WFiIioIeFDFt3DiQsREZE3OJ2e3afip/e48KMiIiIi8hm84kJEROQNvDnXLZy4EBEReYHmdJzxcNW6ru+P+FERERER+Qy/ueLy4/KPYLJY0fr7DWLs8k+fE/lpc5DIycGyd0fb/8peLQDw6aDJIltM8r28HRtFbvLtGyJfs/IPkVcsk71eXglcK3JwTKLI330ve8iMelX2egGA/bPkPNP24wqR2/ytmch7V+0RucWDj8rjq1go8k95pSKHKn1EMvYcFXlCqOyrAgBFefK9RpckiFyx9bjI9lYpImvOgyJXR8njM5llP5OCcqU3SVCoyIdP6Pu46N4rlP1arMGyv0tBsVzHGiS/rSvKZB+X8Gj5d3ysolrkULUnS4Xs1QIAoUqPF7Uvi7qOs0qOhwSq/Vrk+dmUr7O6nUClcYjztN+eAs1yHXVbRuMWgz4gFoNfT4zGAX1PEX3vF6PljbflilHfl5q2ZbSG4fLsi0INHFv+u8dvJi5EREQNiebUoDk8mbhoZ1/oAsSJCxERkRdoDqdnExcP1vVlvMeFiIiIfAavuBAREXkB73FxDycuREREXsCPitzDj4qIiIjIZ/jNFZcpz4yHPSQM3W+bI8buXLtE5GU7N4vca78sT54x5Cnddv79SzeR1//fZSK/kyvzvSv2ivzCEFnS/O6seSL/8PwukVsOmCpy9tr3RR7XMU6379WRdpGz/vORXP/6VLnM6sUiXxbbVuRK5e7zdUrZc6JS1rs6q0jkRh1idfsuPZIlcmy/ViJXbzwssiWpnbLGVyIVQx63xSpLkg8qJcwBdlnanHX8pG7f1rBokQ8XyXJlm12WrZeVyBJjW5AcP1Egl7cr41UVcvnIYFn67ajUl0OHqaXSShlzkFWWPavlzbYAtRxa/jZkD3D9O4JaJn36A9MCLa7LeY3G1epffQmzwfIuR8/cln787PtWNcTfjOpaug3U/LWq2769V6LN6vCGh1dc3OM3ExciIqKGRHM44OTToeusIf5CREREROQSr7gQERF5gaZ5WFWk8aMiIiIiOk94j4t7+FERERER+QxecSEiIvICXnFxD6+4EBEReYHm1ET3XPde5+4hiwUFBRg+fDjCw8MRGRmJUaNGoaSkpMZ1+vbtC5PJpHvdfffdumWysrIwZMgQBAcHo3Hjxnj44YdRXV1dp2PzmysuQ796HmE2K+ZG9RJjl0XJ/iJJc8eKnH7zLJHDT+u/kbdjo8iRGxeIPPp72eck/dXlIs8u/a/IYQktRV6zboPID86/ROQdz8s+ILbvZJ8ZAOg4SK6/6+OdIic/Ok3k7LJ3Rc44eELkiEB5Hv/7LU/kR2NkX5Xjh3JEjrs0Sbfv8o2y94u97RUia86DIlfHJItsDpC9UfJL5TdlYFCoyFlKTxZrSITIB4/re6lYg2WPl2NF5fI4QmRflvKTSl+WRsryh+XXIDJYLu+okPsItcl/BmpPFgAIVfq4OKvkeyGBar8WWZKo9mXR9XexKOPK8oFmpY+L87Q+LgbvWQwaclgMfg0xGld7ipy+b6PfaIx6oBgtb9T3paZeKkZvGa1jtA9/xS+H73A6nHB6cNXEk3XPZvjw4Th8+DDWrFmDqqoqjBw5EmPGjMGSJUtqXG/06NGYOXOm+HNwcLDIDocDQ4YMQXx8PL7//nscPnwYt99+OwIDA/HMM8/U+tj8ZuJCREREZ7dz506sXr0aW7duRffu3QEAr7zyCq6++mq8+OKLSExMNFw3ODgY8fHxLt/76quv8Ntvv+Hrr79GXFwcunTpgieffBKTJk3C9OnTYbVaXa53On5URERE5AV/3ePiyQsAiouLda+Kioqz7LlmGRkZiIyMFJMWAEhLS4PZbMbmzZtrWBNYvHgxYmNjcckll2Dy5Mk4eVJ2Qs/IyEDHjh0RFye7wg8cOBDFxcX49ddfa318vOJCRETkBfV1c26zZs1049OmTcP06dPd3m5ubi4aN26sGwsICEB0dDRyc3MN1/vnP/+J5s2bIzExET///DMmTZqE3bt34+OPPxbbVSctAMSfa9ru6ThxISIi8mHZ2dkIDw8Xf7bZbC6Xe/TRR/Hcc8/VuK2dO3fW+H5NxowZI3LHjh2RkJCA/v37448//kDLli1rWLNuOHEhIiLygvrqnBseHq6buBh58MEHcccdd9S4zEUXXYT4+Hjk5+frxqurq1FQUGB4/4orKSkpAIC9e/eiZcuWiI+Px5YtW3TL5OWdKhapy3Y5cSEiIvKC893HpVGjRmjUqNFZl0tNTUVhYSEyMzPRrVs3AMC6devgdDrFZKQ2tm/fDgBISEgQ23366aeRn58vPopas2YNwsPD0b59+1pv128mLnNe/g5WmLG37A0xFlA8QOT74vqKvHTXQpFzFtyp286738sv7nXpm0Ref+dFIs86+LvIG56Qs8uuj88X+ciqt0Se0lzeIx3dVM6ad772gW7f7e7+h8j/+VBe7utg15cu/+WzXw6L3D1E3q29fH+hyAnd5Cy39Igs6W58Qwfdtqq/2iWyObmT8s5KkY5UyhJhi02WWe8rlKXHgSHy/P48UiqyNSxa5ANH5TgA2IPlsZedkCXGduWcCvJkf4HgIFn2XFkm9x2hbKe6XC6vlklXV+pLsXXl0Ep5c7BSDu2srnI9rpY9W5TSY+WJrvYA4/vjrQFnL3uuTZm0UXVsTWWzRiXGdS21NSxhdmOdunJnO/VVSWxmTTL5sHbt2mHQoEEYPXo05s+fj6qqKowbNw633HKLqCg6dOgQ+vfvj0WLFqFHjx74448/sGTJElx99dWIiYnBzz//jAkTJqBPnz7o1OnU/zMGDBiA9u3b41//+heef/555Obm4oknnsDYsWMNP95yxW8mLkRERA1JQ+6cu3jxYowbNw79+/eH2WzGsGHDMG/ePPF+VVUVdu/eLaqGrFYrvv76a8ydOxelpaVo1qwZhg0bhieeeEKsY7FY8Pnnn+Oee+5BamoqQkJCMGLECF3fl9rgxIWIiMgLnE4nnB7c4+LJumcTHR1dY7O55ORkaJrs3NusWTNs2LDBcPm/NG/eHF988YVHx8Y+LkREROQzeMWFiIjICxryR0UNGScuREREXnBq4uI4+4I1rO+POHEhIiLygr+e8uzJ+v7IbyYu48elIsxmxUdNu4qxl8fOFfnFbgkiL1HKW//b+l+67SztLZ9ufPnQR0Xe/Uu2yM1SZAn1l2+uEzn9JllGvOZxWfpVuECWNne+q6fIy59bq9t3+8W3inykQj5Jc+Ue+eTmRLss7f34F9lC+baLZblxQdYekZv0leXd5UuUJ0B3Hgw9WQ5dFtFUZItVlj1nFcvnY1iDZdnzHwWyvNkeLnsI/HlEliQHhcknOhcX6Z+zERQmy5hPlsiS5MZK6Xhlmfw7iwlVyp7L5D5ilPJptew5QimHVp8ADQBhVrUcWu4jyODp0Gp5s1HZs2ZUJn3aE5oNnwJdxycuW8yu92G0nZq2VdenQNenhvgUaG+WPTfALwfReeE3ExciIqKGRHN6eI8Lr7gQERHReePhzbnw03tcWA5NREREPsOrE5eNGzfi2muvRWJiIkwmE5YvX657X9M0TJ06FQkJCQgKCkJaWhr27NnjemNEREQ+xOlwevzyR16duJSWlqJz585IT093+f7zzz+PefPmYf78+di8eTNCQkIwcOBAlJeXn+cjJSIiql9/VRV58vJHXr3HZfDgwRg8+PTqlVM0TcPcuXPxxBNP4PrrrwcALFq0CHFxcVi+fDluueWW83moRERE1AA02Htc9u3bh9zcXKSlpYmxiIgIpKSkICMjw3C9iooKFBcX615EREQNzV+dcz15+aMGW1WUm3uqB0lcXJxuPC4uTrznyqxZszBjxowzxj8fMhn2kDBUvj5IjP382Qcid9woe6ZM+D5L5mnv67bzx1DZFySkUTORP/jvGpGfzEgRecdC2e+j+fZlIve7/mKRt8yWvV4GbVkq1318pW7fa7JOihwRKOecy74/IPKjjYNFfm2vPI+kvq1FLt0oe85EXH6FyM5Fcn9ViZfo9m0OkD1QsopkPxNrSITIu44q/VoiZL+WXYdPKONRIucck+cTEi772pQUyR4rABDZSPZ4KcyX+4hV1vm9VO4jOkSOO2rRryXcpvZq0fdxUfu1qO8Fq+NKbxSbxXW/FpvFdd+XQLPx7w7KpvT9VwxWUfuyqMsb7cGoV8upbbkeN+qlYrQto13UtO+69mupaVsut1+3xb2O/VouXJpDg+bQzr5gDev7owZ7xcVdkydPRlFRkXhlZ2effSUiIiLyCQ32ikt8fDwAIC8vDwkJsqttXl4eunTpYriezWaDzWYzfJ+IiKghcDo9qwxy+unNuQ32ikuLFi0QHx+PtWvlRzjFxcXYvHkzUlNTvXhkREREntOcmscvf+TVKy4lJSXYu3ev+PO+ffuwfft2REdHIykpCePHj8dTTz2F1q1bo0WLFpgyZQoSExMxdOhQ7x00ERFRPXA6AKfZ/cmH0/0HS/s0r05cfvjhB1x55ZXizxMnTgQAjBgxAu+++y4eeeQRlJaWYsyYMSgsLETv3r2xevVq2O12bx0yEREReZFXJy59+/aFphnPNk0mE2bOnImZM2eex6MiIiI69zSHE5rZg4csshz6wjb90TkwWawo3b1cjH29/LjI3R/8QuTdI2X94YvH83TbeXeCXG7Mfz4RuejLt0W+OWifyC16NRU5Y9KbIvf59zMiv7XkLpETtCYiW0+r83zjf3+KPCIqSOSlv+aIfNGAliIX7/pd5PiRfUSu/uo7udE28n4hk3m1yNll+tuf1LLnX/Jl6bEtIlbkHYdkzxx7VLzIv+fI8dBIebXsRIEsVQ5WSpvzs4p0+06+KFrkP0tlOXqjMLmtqpNyncbKtqrK5PJRwbKkWy2TDtWVQ8tSbwAIs7oue7YHKGXPDjmulkmrrAGua1oDlMW10677WgzqYI3Kno1KmC0G9cI1ldme67LnupY817QtI/VZRWxmTTKdA5pDg+bBR0UshyYiIiJq4PzmigsREVFD4nRoHt6c659XXDhxISIi8gLe4+IeflREREREPoNXXIiIiLzAqWlwetBEzllDVe6FjBMXIiIib3Bo0EweTD789B4XflREREREPsNvrrh0vm4YAuwh6PjSH2Jsx+hwkUP//Y3I/x4in480fP5S3XZ+v0X2bpnXoVLk77rLB0FuuusxkXvMeVjkyT3Hixwb011kddL8/FrZe+V6pVcLACz/4ZDIHa6W/VqO//mTyM0fuUrkise3imzpKsdN5k0iH3SGiaz2avkpV/ZqAQB7VJzI27IKRQ5plCTyz9lyPDw6WOSiYydFDo2Q53RU6e/SrHmkyAd+Pajbd0JkC5GrSs/eryU6xHW/lgi7634toVY57qiWf6eAvi+LUb8WtZeK2q9FHQ80G/VeMe4PYryO6+Xr2q+lpn3XV78Wd/hrvxa2ivE/TocTTpMHD1n005tz/WbiQkRE1JBoHn5U5K8N6DhxISIi8gJOXNzDe1yIiIjIZ/CKCxERkRfwHhf3cOJCRETkBZqmQfOgj4vmp31c+FERERER+Qy/ueKyqk8RwkOqEPXwt2Ls1Xe+EHn8f2SZ80/XyfHXO+nLgrf0bS7yxr//n8h9/v2MyA91uUtke3wfkR3K7PixFb+JPCJWlg4/uHGvyDP/3la376O7ZBlziyeuF7l80ncimy9/QGSTeZvIBxAlsi0sWp7PIVmSHBSTKPJ3fxbo9q2WPWfuk+9FKMd+PE+WJIfHyLLn/CxZwty0mSy5ztopy56bRsmS500n9PtuqpSFVyrl0HHhdpHVsueooECR1bLnCJvrsucwq+uSZ0BfKq2WJNsDzS7HrRbXJcwBBjW+RiXPwLkve66p7LiuZc8mg30YjbtTPl1f1cIseaaGwunQ4AQfslhXvOJCRETkBZpDO/WgRbdf527iUlBQgOHDhyM8PByRkZEYNWoUSkpKDJffv38/TCaTy9eyZcvEcq7eX7p0qeF2XfGbKy5ERERUO8OHD8fhw4exZs0aVFVVYeTIkRgzZgyWLFnicvlmzZrh8OHDurE333wTL7zwAgYPHqwbX7hwIQYNGiT+HBkZWadj48SFiIjICzSHBs2Dj4rO1RWXnTt3YvXq1di6dSu6dz/V5f2VV17B1VdfjRdffBGJiYlnrGOxWBAfH68b++STT3DTTTchNDRUNx4ZGXnGsnXBj4qIiIi8wOnQPH6dCxkZGYiMjBSTFgBIS0uD2WzG5s2ba7WNzMxMbN++HaNGjTrjvbFjxyI2NhY9evTAggUL6lwdxSsuREREPqy4uFj3Z5vNBpvNZrD02eXm5qJx48a6sYCAAERHRyM3N7dW23jnnXfQrl079OzZUzc+c+ZM9OvXD8HBwfjqq69w7733oqSkBPfff3+tj49XXIiIiLxAczo9fgGn7i+JiIgQr1mzZrnc36OPPmp4A+1fr127dnl8XmVlZViyZInLqy1TpkxBr1690LVrV0yaNAmPPPIIXnjhhTpt32+uuDw1eApsJjM++jlDjG3tukLkKeWyBPrQmG4if9RHljwDwA2/rBT5vvgrRT7ibCdykEXOB+9fLEuSp14kS5JHrt0u8ut3yxnpka9kyXPLV/V/6RV3/Vf+ofctIpoD5FOgd5WHyONQnui8VilvDo1LFnnNznyRIxJlSXLm3qO6fUfHyc8ojylPjo5sJPd3cM8xkdu0jhF53/Y/Rb6oUSuRvy86InJzpaxaLXkGgIQIWfZcXV4qcmywLHt2VJaLHGVXxpWyZ93ToasMxk97OrQ9oG5lz4F1LHs2KnkGjMueDcuk61h6XFNlbl3Lnuu6nZr4Utmz0S5Y9ky1UV/l0NnZ2QgPDxfjRldbHnzwQdxxxx01bvOiiy5CfHw88vPzdePV1dUoKCio1b0pH330EU6ePInbb7/9rMumpKTgySefREVFRa2vEvnNxIWIiKgh0Zwe3pz7/7vuhoeH6yYuRho1aoRGjRqddbnU1FQUFhYiMzMT3bqd+kV+3bp1cDqdSElJOev677zzDq677rpa7Wv79u2Iioqq00dbnLgQERGR0K5dOwwaNAijR4/G/PnzUVVVhXHjxuGWW24RFUWHDh1C//79sWjRIvTo0UOsu3fvXmzcuBFffPHFGdtdsWIF8vLycPnll8Nut2PNmjV45pln8NBDD9Xp+DhxISIi8gaHE5rmweeKznP3kMXFixdj3Lhx6N+/P8xmM4YNG4Z58+aJ96uqqrB7926cPHlSt96CBQvQtGlTDBgw4IxtBgYGIj09HRMmTICmaWjVqhVmz56N0aNH1+nYOHEhIiLyAqdDg9ODByU6PXhA49lER0cbNpsDgOTkZJdlzM888wyeeeYZF2sAgwYN0jWecxerioiIiMhn8IoLERGRF2gOrc7N13Trn8MrLg0ZJy5ERERe4NQ8/KjIg3V9md9MXPq2iESIxYLoh28TY5NWPC7yjCFPiXznwe0ib3yjo247X31TKHLPKNlf5PE3ZBvkj66/WOT0r74W+W+z/iny0adk75W4l+VxVH/2tMg5La7Q7TswRG7rq/2yl0pYYkuRP/wpR+SIpPYif/rjIZFjmieJ/PNu2UulcbMIkfMP6jsxtmony9p+3rRP5B5d5DMrdn//i8it4+S+vyo+oozLfjBVSr+WJuGue7UAQOMQWSZXXVkmcmywVWSH0pclOkj2cVH7tYTZ5Le72kvFqFcLANgCXPdfsRo0KLEa9GsJMFg+oIZGLob9Wurc38X1eE09Voz6tRitU9deMe7cjmjUl8Wb/VqI6Pzzm4kLERFRQ+LQNDg8uGriybq+jBMXIiIiL3Bop16erO+PWFVEREREPoNXXIiIiLyAHxW5hxMXIiIiL+BHRe7hxIWIiMgLnB5ecWE59AWu+eqVCAsLx5w4Wd5cPryLyD1DZAnt4Omy7Pijf7TTbeeKt/8r8itv3SXyPU+tELn9qldFLhssy5uPXvmYyIFzpoi8qiBE5Igkub83N2fr9h178WUiz9/4p8jxbWTp8Zdb5DpNL5aPH9+3+6jIRqXNAwfJ7azI/E2370sHyRLvjBUbRO6a1FPkZUWy7LlNY1n2XHniuMjNIoLk+ElZcq0rh66QJc8AEBciy57V8uboYKXsuVote7a4HA8yKHu21VCSbLcYlENbXG/LqLw50OBussAaapKNSqjrWt5sVNpsVFZd47YMlq9rtXBNJcznury5ps2z7Jmo4fObiQsREVFD4oCHHxXV25H4Fk5ciIiIvMChaXCAN+fWFcuhiYiIyGfwigsREZEXODTPPu5hVRERERGdN5y4uIcfFREREZHP4BUXIiIiL+DNue7xm4lLvzHpMAXYsf+d28VYoxdeE/nNHz8Q+Z6hL4ucsP4j3XYqB00W+ftOD4gclvCmyM//Ki/+xXe+UuQJy38VOblHP5Gf+XiHyC0v6yryJ2v26vbdtntzkX/7QfZr6Z8me6ys+mSTyHfe0VfkN+Z/LvLd/7hE5G8/Wi3y31r1EfmDYzm6fXdrFilyRZHsCdMmVvagqVD6tVwUHSxyVVmJyEkRsl+LQ+nX0kjp1eKo1PdxibTLb1O1L0tooOteKsEG40Z9XIIMlgcAq0HTFKNxo74sde3JAhj3WanzeB17stT0nlGPlbqOu8NoU3UdJ2oonB5+VOT0z3kLPyoiIiIi3+E3V1yIiIgaEn5U5B5OXIiIiLyAVUXu4cSFiIjIC05NXDy54lKPB+NDeI8LERER+QxecSEiIvICflTkHr+ZuARFJ8IcGIS7LZ3EWIvesuT3iqUFInceeovI/Z9er9tO6q03ivx/L20U+ep/DhT5tbflOrff1lvkt99cKfLkh24Q+amnF4s85+mRIt//8Ou6fT91531yu0s/EfnWSbK0+j8v75TH1O4mkV/K3S/yFcnRIpcdzxO5W2K4yBUn5NcDANopZc+VpUUiJ0cq5c1KGXNimOvy5pgg16XNUXaLyKeXJEfYXJcrh1pdrxMS6PpCYlCA6/pYew01ybYA19uqc5m0wbhRmTRgXMZsMajzNRp3p1TZ6L36KkmuqVSZZczkL3hzrnv4URERERH5DL+54kJERNSQaACcHq7vjzhxISIi8gJ+VOQeflREREREPoNXXIiIiLyAVUXu4cSFiIjIC/hRkXv8ZuKy/ZUbER4ejvCeY8VY8ffpItdmHAC2Grz31hxl/CX51Olp/f4l8ktPyFLle7snivxo3n6Rb24fK/Lo47m6fQ9uGSmyWq7cu2moyNXl8knMl8bJJzSrJclto20iqyXJF0UEuhwHgGZh8ltFLT1ODHE93jhIliqrYuyuP52Mshl/ahludf1eWKDrutkQg7LnYHfKoQ0Oy2jc4JAMxw0Oqcb3zAY/6OprvKb3TAY/KOtr/Hzsg/vmvmvzHjVcfjNxISIiakj4UZF7OHEhIiLyAn5U5B5OXIiIiLzA6eEVF6d/zlt8oxw6PT0dycnJsNvtSElJwZYtW7x9SEREROQFDX7i8sEHH2DixImYNm0atm3bhs6dO2PgwIHIz8/39qERERG5zaFpHr/8UYOfuMyePRujR4/GyJEj0b59e8yfPx/BwcFYsGCBtw+NiIjIbQ78/xt03X15+wS8pEHf41JZWYnMzExMnjxZjJnNZqSlpSEjI8PlOhUVFaioqBB/Lio69STjEydOAAA0hyzzLS4uFrk24+6sU1/j3Df3zX1z39z3ud+35qg69d/zcDWj0qMnFXm+vs/SGrBDhw5pALTvv/9eN/7www9rPXr0cLnOtGnTNJx69hRffPHFF198ufXKzs4+Z/9vKysr0+Lj4+vlOOPj47WysrJzdqwNUYO+4uKOyZMnY+LEieLPhYWFaN68ObKyshAREeHFIzu/iouL0axZM2RnZyM8PNzbh3Pe8Lx53v6A533uzlvTNJw4cQKJiYlnX9hNdrsd+/btQ2Vl5dkXPgur1Qq73V4PR+U7GvTEJTY2FhaLBXl5ebrxvLw8xMfHu1zHZrPBZrOdMR4REeFX/8D/Eh4ezvP2Izxv/8LzPjfOxy+5drvd7yYc9aVB35xrtVrRrVs3rF27Vow5nU6sXbsWqampXjwyIiIi8oYGfcUFACZOnIgRI0age/fu6NGjB+bOnYvS0lKMHDnS24dGRERE51mDn7jcfPPNOHLkCKZOnYrc3Fx06dIFq1evRlxcXK3Wt9lsmDZtmsuPjy5kPG+etz/gefO8yf+YNM1PO9gQERGRz2nQ97gQERERqThxISIiIp/BiQsRERH5DE5ciIiIyGdc0BOX9PR0JCcnw263IyUlBVu2bPH2IdWrWbNm4bLLLkNYWBgaN26MoUOHYvfu3bplysvLMXbsWMTExCA0NBTDhg07o6Gfr3v22WdhMpkwfvx4MXahnvehQ4dw2223ISYmBkFBQejYsSN++OEH8b6maZg6dSoSEhIQFBSEtLQ07Nmzx4tH7DmHw4EpU6agRYsWCAoKQsuWLfHkk0/qniVzIZz3xo0bce211yIxMREmkwnLly/XvV+bcywoKMDw4cMRHh6OyMhIjBo1CiUlJefxLOqupvOuqqrCpEmT0LFjR4SEhCAxMRG33347cnJydNvwxfMm912wE5cPPvgAEydOxLRp07Bt2zZ07twZAwcORH5+vrcPrd5s2LABY8eOxaZNm7BmzRpUVVVhwIABKC0tFctMmDABK1aswLJly7Bhwwbk5OTghhtu8OJR16+tW7fijTfeQKdOnXTjF+J5Hz9+HL169UJgYCBWrVqF3377DS+99BKioqLEMs8//zzmzZuH+fPnY/PmzQgJCcHAgQNRXl7uxSP3zHPPPYfXX38dr776Knbu3InnnnsOzz//PF555RWxzIVw3qWlpejcuTPS09Ndvl+bcxw+fDh+/fVXrFmzBp9//jk2btyIMWPGnK9TcEtN533y5Els27YNU6ZMwbZt2/Dxxx9j9+7duO6663TL+eJ5kwe8+Jykc6pHjx7a2LFjxZ8dDoeWmJiozZo1y4tHdW7l5+drALQNGzZomqZphYWFWmBgoLZs2TKxzM6dOzUAWkZGhrcOs96cOHFCa926tbZmzRrtiiuu0B544AFN0y7c8540aZLWu3dvw/edTqcWHx+vvfDCC2KssLBQs9ls2n/+85/zcYjnxJAhQ7Q777xTN3bDDTdow4cP1zTtwjxvANonn3wi/lybc/ztt980ANrWrVvFMqtWrdJMJpN26NCh83bsnjj9vF3ZsmWLBkA7cOCApmkXxnlT3VyQV1wqKyuRmZmJtLQ0MWY2m5GWloaMjAwvHtm5VVRUBACIjo4GAGRmZqKqqkr3dWjbti2SkpIuiK/D2LFjMWTIEN35ARfueX/22Wfo3r07brzxRjRu3Bhdu3bFW2+9Jd7ft28fcnNzdecdERGBlJQUnz7vnj17Yu3atfj9998BAD/99BO+/fZbDB48GMCFe96q2pxjRkYGIiMj0b17d7FMWloazGYzNm/efN6P+VwpKiqCyWRCZGQkAP85b5IafOdcdxw9ehQOh+OM7rpxcXHYtWuXl47q3HI6nRg/fjx69eqFSy65BACQm5sLq9Uq/oH/JS4uDrm5uV44yvqzdOlSbNu2DVu3bj3jvQv1vP/880+8/vrrmDhxIh577DFs3boV999/P6xWK0aMGCHOzdX3vS+f96OPPori4mK0bdsWFosFDocDTz/9NIYPHw4AF+x5q2pzjrm5uWjcuLHu/YCAAERHR18wX4fy8nJMmjQJt956q3jIoj+cN+ldkBMXfzR27Fjs2LED3377rbcP5ZzLzs7GAw88gDVr1vjV01WdTie6d++OZ555BgDQtWtX7NixA/Pnz8eIESO8fHTnzocffojFixdjyZIl6NChA7Zv347x48cjMTHxgj5v0quqqsJNN90ETdPw+uuve/twyIsuyI+KYmNjYbFYzqgiycvLQ3x8vJeO6twZN24cPv/8c3zzzTdo2rSpGI+Pj0dlZSUKCwt1y/v61yEzMxP5+fm49NJLERAQgICAAGzYsAHz5s1DQEAA4uLiLsjzTkhIQPv27XVj7dq1Q1ZWFgCIc7vQvu8ffvhhPProo7jlllvQsWNH/Otf/8KECRMwa9YsABfueatqc47x8fFnFB9UV1ejoKDA578Of01aDhw4gDVr1oirLcCFfd7k2gU5cbFarejWrRvWrl0rxpxOJ9auXYvU1FQvHln90jQN48aNwyeffIJ169ahRYsWuve7deuGwMBA3ddh9+7dyMrK8umvQ//+/fHLL79g+/bt4tW9e3cMHz5c5AvxvHv16nVGufvvv/+O5s2bAwBatGiB+Ph43XkXFxdj8+bNPn3eJ0+ehNms/1FlsVjgdDoBXLjnrarNOaampqKwsBCZmZlimXXr1sHpdCIlJeW8H3N9+WvSsmfPHnz99deIiYnRvX+hnjfVwNt3B58rS5cu1Ww2m/buu+9qv/32mzZmzBgtMjJSy83N9fah1Zt77rlHi4iI0NavX68dPnxYvE6ePCmWufvuu7WkpCRt3bp12g8//KClpqZqqampXjzqc0OtKtK0C/O8t2zZogUEBGhPP/20tmfPHm3x4sVacHCw9v7774tlnn32WS0yMlL79NNPtZ9//lm7/vrrtRYtWmhlZWVePHLPjBgxQmvSpIn2+eefa/v27dM+/vhjLTY2VnvkkUfEMhfCeZ84cUL78ccftR9//FEDoM2ePVv78ccfRfVMbc5x0KBBWteuXbXNmzdr3377rda6dWvt1ltv9dYp1UpN511ZWaldd911WtOmTbXt27frfs5VVFSIbfjieZP7LtiJi6Zp2iuvvKIlJSVpVqtV69Gjh7Zp0yZvH1K9AuDytXDhQrFMWVmZdu+992pRUVFacHCw9ve//107fPiw9w76HDl94nKhnveKFSu0Sy65RLPZbFrbtm21N998U/e+0+nUpkyZosXFxWk2m03r37+/tnv3bi8dbf0oLi7WHnjgAS0pKUmz2+3aRRddpD3++OO6/3FdCOf9zTffuPz3PGLECE3TaneOx44d02699VYtNDRUCw8P10aOHKmdOHHCC2dTezWd9759+wx/zn3zzTdiG7543uQ+k6Yp7SeJiIiIGrAL8h4XIiIiujBx4kJEREQ+gxMXIiIi8hmcuBAREZHP4MSFiIiIfAYnLkREROQzOHEhIiIin8GJCxHVyv79+2EymbB9+3ZvHwoR+TFOXIh8xB133AGTyQSTyYTAwEDExcXhqquuwoIFC8Rze+pzX0OHDq3XbRIR1QdOXIh8yKBBg3D48GHs378fq1atwpVXXokHHngA11xzDaqrq719eERE5xwnLkQ+xGazIT4+Hk2aNMGll16Kxx57DJ9++ilWrVqFd999FwBQWFiIu+66C40aNUJ4eDj69euHn376SWxj+vTp6NKlC9544w00a9YMwcHBuOmmm1BUVCTef++99/Dpp5+KKzzr168X6//555+48sorERwcjM6dOyMjI+N8fgmIyM9x4kLk4/r164fOnTvj448/BgDceOONyM/Px6pVq5CZmYlLL70U/fv3R0FBgVhn7969+PDDD7FixQqsXr0aP/74I+69914AwEMPPYSbbrpJXN05fPgwevbsKdZ9/PHH8dBDD2H79u24+OKLceutt/JqDxGdN5y4EF0A2rZti/379+Pbb7/Fli1bsGzZMnTv3h2tW7fGiy++iMjISHz00Udi+fLycixatAhdunRBnz598Morr2Dp0qXIzc1FaGgogoKCxNWd+Ph4WK1Wse5DDz2EIUOG4OKLL8aMGTNw4MAB7N271xunTUR+iBMXoguApmkwmUz46aefUFJSgpiYGISGhorXvn378Mcff4jlk5KS0KRJE/Hn1NRUOJ1O7N69+6z76tSpk8gJCQkAgPz8/Ho8GyIiYwHePgAi8tzOnTvRokULlJSUICEhQXdPyl8iIyPrZV+BgYEim0wmAKj3qiYiIiOcuBD5uHXr1uGXX37BhAkT0LRpU+Tm5iIgIADJycmG62RlZSEnJweJiYkAgE2bNsFsNqNNmzYAAKvVCofDcT4On4ioTjhxIfIhFRUVyM3NhcPhQF5eHlavXo1Zs2bhmmuuwe233w6z2YzU1FQMHToUzz//PC6++GLk5ORg5cqV+Pvf/47u3bsDAOx2O0aMGIEXX3wRxcXFuP/++3HTTTchPj4eAJCcnIwvv/wSu3fvRkxMDCIiIrx52kREAicuRD5k9erVSEhIQEBAAKKiotC5c2fMmzcPI0aMgNl86pa1L774Ao8//jhGjhyJI0eOID4+Hn369EFcXJzYTqtWrXDDDTfg6quvRkFBAa655hq89tpr4v3Ro0dj/fr16N69O0pKSvDNN9/UeAWHiOh8MWmapnn7IIjo/Jk+fTqWL1/O1v1E5JNYVUREREQ+gxMXIiIi8hn8qIiIiIh8Bq+4EBERkc/gxIWIiIh8BicuRERE5DM4cSEiIiKfwYkLERER+QxOXIiIiMhncOJCREREPoMTFyIiIvIZnLgQERGRz/h/EUZqzUoz920AAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ], + "source": [ + "sample_pos_encoding = PositionalEncoding(50, 128)\n", + "#아까 만든 클래스를 사용해서 생성한 sample_pos_encoding 배열을 시각화함.\n", + "\n", + "#pcolormesh : 2차원 배열을 시각화할 때 사용하며, 배열 값에 따라 색상을 적용해서 이미지 생성함.\n", + "\n", + "#sample_pos_encoding은 tensor 객체이므로, \n", + "#numpy 메소드를 사용해서 tensor를 numpy 배열로 변환한 다음\n", + "#[0]을 사용해서 (batch 차원, position, d_model)에서 인덱스 0인 batch 차원을 없앤 채로 반환함.\n", + "\n", + "plt.pcolormesh(sample_pos_encoding.pos_encoding.numpy()[0], cmap='RdBu')\n", + "plt.xlabel('Depth')\n", + "plt.xlim((0, 128))\n", + "plt.ylabel('Position')\n", + "plt.colorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "미니배치에서 첫번째 꺼는 항상 제외하고 계산하는 건지" + ], + "metadata": { + "id": "ZKfG3N0BhTEK" + }, + "id": "ZKfG3N0BhTEK" + }, + { + "cell_type": "markdown", + "id": "0d531b2b", + "metadata": { + "id": "0d531b2b" + }, + "source": [ + "## Scaled dot product attention" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efddecf0", + "metadata": { + "id": "efddecf0" + }, + "outputs": [], + "source": [ + "def scaled_dot_product_attention(query, key, value, mask):\n", + " # query 크기 : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " # key 크기 : (batch_size, num_heads, key의 문장 길이, d_model/num_heads)\n", + " # value 크기 : (batch_size, num_heads, value의 문장 길이, d_model/num_heads)\n", + " # padding_mask : (batch_size, 1, 1, key의 문장 길이)\n", + "\n", + " # Q와 K의 곱. 어텐션 스코어 행렬. \n", + " matmul_qk = tf.matmul(query, key, transpose_b=True) \n", + " #'key'의 transpose를 사용해 key와 query의 dot product를 계산\n", + "\n", + " # 스케일링\n", + " # dk의 루트값으로 나눠준다.\n", + " depth = tf.cast(tf.shape(key)[-1], tf.float32)\n", + " logits = matmul_qk / tf.math.sqrt(depth)\n", + "\n", + " # 마스킹. 어텐션 스코어 행렬의 마스킹 할 위치에 매우 작은 음수값을 넣는다.\n", + " # 매우 작은 값이므로 소프트맥스 함수를 지나면 행렬의 해당 위치의 값은 0이 된다.\n", + " if mask is not None:\n", + " logits += (mask * -1e9)\n", + "\n", + " # 소프트맥스 함수는 마지막 차원인 key의 문장 길이 방향으로 수행된다.\n", + " # attention weight : (batch_size, num_heads, query의 문장 길이, key의 문장 길이)\n", + " attention_weights = tf.nn.softmax(logits, axis=-1)\n", + "\n", + " # output : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " output = tf.matmul(attention_weights, value)\n", + "\n", + " return output, attention_weights" + ] + }, + { + "cell_type": "markdown", + "source": [ + "query, key, value, padding_mask에서 기본값은 없는지, 특별히 조정 가능한 건지 확인" + ], + "metadata": { + "id": "g2oqX1Z2iXSd" + }, + "id": "g2oqX1Z2iXSd" + }, + { + "cell_type": "markdown", + "id": "728a5cc3", + "metadata": { + "id": "728a5cc3" + }, + "source": [ + "## Multi Head Attention" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7618539d", + "metadata": { + "id": "7618539d" + }, + "outputs": [], + "source": [ + "class MultiHeadAttention(tf.keras.layers.Layer):\n", + "\n", + " def __init__(self, d_model, num_heads, name=\"multi_head_attention\"):\n", + " super(MultiHeadAttention, self).__init__(name=name)\n", + " self.num_heads = num_heads\n", + " self.d_model = d_model\n", + "\n", + " assert d_model % self.num_heads == 0 \n", + " #d_model을 num_heads로 나눈 값이 정확하게 나누어 떨어지는지 확인하는 용도\n", + "\n", + " # d_model을 num_heads로 나눈 값.\n", + " # 논문 기준 : 64\n", + " self.depth = d_model // self.num_heads\n", + "\n", + " # WQ, WK, WV에 해당하는 밀집층 정의\n", + " self.query_dense = tf.keras.layers.Dense(units=d_model)\n", + " self.key_dense = tf.keras.layers.Dense(units=d_model)\n", + " self.value_dense = tf.keras.layers.Dense(units=d_model)\n", + "\n", + " # WO에 해당하는 밀집층 정의 : 모르겠음\n", + " self.dense = tf.keras.layers.Dense(units=d_model)\n", + "\n", + " # num_heads 개수만큼 q, k, v를 split하는 함수\n", + " def split_heads(self, inputs, batch_size):\n", + " inputs = tf.reshape(\n", + " inputs, shape=(batch_size, -1, self.num_heads, self.depth))\n", + " return tf.transpose(inputs, perm=[0, 2, 1, 3])\n", + "\n", + " def call(self, inputs):\n", + " '''\n", + " 1. query, key, value를 각각 Dense 레이어를 통과시켜서 출력값을 얻습니다.\n", + " 2. 각 head로 나눠진 query, key, value를 scaled_dot_product_attention() 함수에 입력값으로 넣어 어텐션을 수행합니다.\n", + " 3. 어텐션의 결과를 다시 transpose() 함수를 이용해 축을 변환합니다.\n", + " 4. 각 head를 다시 연결(concatenate)하여 최종 결과를 얻습니다.\n", + " 5. 결과값을 dense 레이어를 통과시켜 최종 출력값을 구합니다.\n", + " \n", + " query, key, value가 multi-heads 수만큼 나뉘어서 어텐션을 계산\n", + " 각 head는 서로 다른 부분을 학습하기 위해서 존재하며, 이를 통해 모델이 더욱 효과적으로 특징을 추출함\n", + " 출력값으로는 각 단어의 위치와 상관없이 모든 단어가 attention을 받은 정보가 담긴 벡터를 반환함\n", + " '''\n", + " query, key, value, mask = inputs['query'], inputs['key'], inputs[\n", + " 'value'], inputs['mask']\n", + " batch_size = tf.shape(query)[0]\n", + "\n", + " # 1. WQ, WK, WV에 해당하는 밀집층 지나기\n", + " # q : (batch_size, query의 문장 길이, d_model)\n", + " # k : (batch_size, key의 문장 길이, d_model)\n", + " # v : (batch_size, value의 문장 길이, d_model)\n", + " # 참고) 인코더(k, v)-디코더(q) 어텐션에서는 query 길이와 key, value의 길이는 다를 수 있다.\n", + " query = self.query_dense(query)\n", + " key = self.key_dense(key)\n", + " value = self.value_dense(value)\n", + "\n", + " # 2. 헤드 나누기\n", + " # q : (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " # k : (batch_size, num_heads, key의 문장 길이, d_model/num_heads)\n", + " # v : (batch_size, num_heads, value의 문장 길이, d_model/num_heads)\n", + " query = self.split_heads(query, batch_size)\n", + " key = self.split_heads(key, batch_size)\n", + " value = self.split_heads(value, batch_size)\n", + "\n", + " # 3. 스케일드 닷 프로덕트 어텐션. 앞서 구현한 함수 사용.\n", + " # (batch_size, num_heads, query의 문장 길이, d_model/num_heads)\n", + " scaled_attention, _ = scaled_dot_product_attention(query, key, value, mask)\n", + " # (batch_size, query의 문장 길이, num_heads, d_model/num_heads)\n", + " scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3])\n", + "\n", + " # 4. 헤드 연결(concatenate)하기\n", + " # (batch_size, query의 문장 길이, d_model)\n", + " concat_attention = tf.reshape(scaled_attention,\n", + " (batch_size, -1, self.d_model))\n", + "\n", + " # 5. WO에 해당하는 밀집층 지나기\n", + " # (batch_size, query의 문장 길이, d_model)\n", + " outputs = self.dense(concat_attention)\n", + "\n", + " return outputs" + ] + }, + { + "cell_type": "markdown", + "id": "1d31bfe6", + "metadata": { + "id": "1d31bfe6" + }, + "source": [ + "## padding mask 만들기" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d76ee2e", + "metadata": { + "id": "3d76ee2e" + }, + "outputs": [], + "source": [ + "def create_padding_mask(x):\n", + "#입력으로 들어온 'x' tensor에서 값이 0인 위치에 1을, 그 외의 위치에 0을 가지는 텐서를 생성하는 함수\n", + " mask = tf.cast(tf.math.equal(x, 0), tf.float32)\n", + " # (batch_size, 1, 1, key의 문장 길이)\n", + " ## 입력으로 (batch_size, seq_len) 크기의 텐서 x가 주어졌다면, \n", + " ## 이 함수는 (batch_size, 1, 1, seq_len) 크기의 텐서를 반환\n", + " return mask[:, tf.newaxis, tf.newaxis, :]" + ] + }, + { + "cell_type": "markdown", + "id": "a87d6db3", + "metadata": { + "id": "a87d6db3" + }, + "source": [ + "## encoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75149d08", + "metadata": { + "id": "75149d08" + }, + "outputs": [], + "source": [ + "def encoder_layer(dff, d_model, num_heads, dropout, name=\"encoder_layer\"):\n", + " '''\n", + " dff : feedforward network의 hidden layer에 있는 뉴런 수를 나타내는 정수\n", + " d_model : 모델의 차원을 나타내는 정수. 즉, 임베딩 크기\n", + " num_heads : attention head 개수를 나타내는 정수\n", + " dropout : 드롭아웃 비율을 나타내는 실수\n", + " name : 레이어 이름을 나타내는 문자열\n", + " '''\n", + "\n", + " '''\n", + " 간단히 말하자면\n", + " 1. 입력 데이터(inputs)와 패딩 마스크(padding_mask)를 받고\n", + " 2. 멀티 헤드 어텐션을 수행한 뒤\n", + " 3. 드롭아웃을 적용하고 잔차 연결(residual connection)과 \n", + " 층 정규화(layer normalization)를 수행함\n", + " 4. 포지션 와이즈 피드 포워드 신경망을 수행하는데, \n", + " 이때 입력으로 받은 어텐션 출력(attention)을 사용하고\n", + " 5. 드롭아웃을 적용하고 잔차 연결과 층 정규화를 수행함\n", + "\n", + " return에선 \n", + " - 입력 데이터(inputs)와 패딩 마스크(padding_mask)를 입력으로 받음\n", + " - 출력으로는 두번째 서브층의 입력으로 사용될 어텐션 출력(attention)에 \n", + " 두번째 서브층을 수행한 결과를 더한 결과\n", + " 를 반환하는 tf.keras.Model 객체를 생성\n", + " '''\n", + " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", + "\n", + " # 인코더는 패딩 마스크 사용\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name=\"padding_mask\")\n", + "\n", + " # 멀티-헤드 어텐션 (첫번째 서브층 / 셀프 어텐션)\n", + " attention = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention\")({\n", + " 'query': inputs, 'key': inputs, 'value': inputs, # Q = K = V\n", + " 'mask': padding_mask # 패딩 마스크 사용\n", + " })\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " attention = tf.keras.layers.Dropout(rate=dropout)(attention)\n", + " attention = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(inputs + attention)\n", + "\n", + " # 포지션 와이즈 피드 포워드 신경망 (두번째 서브층)\n", + " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention) #ReLU와\n", + " outputs = tf.keras.layers.Dense(units=d_model)(outputs) \n", + " #선형활성화 함수가 있는 두 개의 고밀도 레이어로 구성됨\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(outputs)\n", + " outputs = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention + outputs) \n", + " #attention tensor에 드롭아웃 적용된 출력텐서를 더함\n", + " #그리고 레이어 정규화를 적용해 다른 잔차 연결을 얻음\n", + "\n", + " #최종 출력은 output tensor, 출력 텐서를 출력으로 하는 tf.keras.Model 객체를 반환\n", + " #모델 이름은 name\n", + " return tf.keras.Model(\n", + " inputs=[inputs, padding_mask], outputs=outputs, name=name)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "edda14f2", + "metadata": { + "id": "edda14f2" + }, + "outputs": [], + "source": [ + "def encoder(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name=\"encoder\"):\n", + " '''\n", + " 다수의 self attention과 feedfoward 신경망으로 구성된 인코더를 구현하는 함수\n", + " '''\n", + " inputs = tf.keras.Input(shape=(None,), name=\"inputs\")\n", + "\n", + " # 인코더는 패딩 마스크 사용\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name=\"padding_mask\")\n", + " #입력문장을 받아들이고 입력 문장에 대한 패딩마스크를 입력으로 받음\n", + " #그리고 입력 문장의 임베딩을 구성한 뒤, positional encoding을 적용함 \n", + " # 포지셔널 인코딩 + 드롭아웃\n", + " embeddings = tf.keras.layers.Embedding(vocab_size, d_model)(inputs)\n", + " embeddings *= tf.math.sqrt(tf.cast(d_model, tf.float32))\n", + " #이때 임베딩 차원 수와 포지셔널 인코딩 차원 수가 같도록 조정해줌\n", + " embeddings = PositionalEncoding(vocab_size, d_model)(embeddings)\n", + " #마지막으로 드롭아웃을 적용함.\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(embeddings)\n", + "\n", + " # 인코더 층을 num_layers개 쌓기\n", + " for i in range(num_layers):\n", + " outputs = encoder_layer(dff=dff, d_model=d_model, num_heads=num_heads,\n", + " dropout=dropout, name=\"encoder_layer_{}\".format(i),\n", + " )([outputs, padding_mask])\n", + " #encoder_layer 함수를 for문 만큼 사용\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, padding_mask], outputs=outputs, name=name)\n", + " #tf.keras.Model 객체를 반환하는데, 반환되는 모델명은 name으로 지정됨." + ] + }, + { + "cell_type": "markdown", + "id": "3277dd47", + "metadata": { + "id": "3277dd47" + }, + "source": [ + "## decoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fed9cc2c", + "metadata": { + "id": "fed9cc2c" + }, + "outputs": [], + "source": [ + "# 디코더의 첫번째 서브층(sublayer)에서 미래 토큰을 Mask하는 함수\n", + "def create_look_ahead_mask(x):\n", + " '''\n", + " 디코더는 현재 위치의 이전 토큰들을 이용해 다음 토큰을 예측하므로, \n", + " 현재 위치 이후에 등장하는 토큰들은 모두 가려주어야 함\n", + " '''\n", + " seq_len = tf.shape(x)[1]\n", + " #x 텐서의 shape을 이용해 seq_len을 구함\n", + " look_ahead_mask = 1 - tf.linalg.band_part(tf.ones((seq_len, seq_len)), -1, 0) #-1랑 0: 하삼각행렬/0, -1 : 상삼각행렬\n", + " #이게 다 0, 0이면 대각선 제외하고 다 0이 됨.\n", + "\n", + " #tf.linalg.band_part() : seq_len 크기의 전체 1로 구성된 정방행렬 만듦\n", + " padding_mask = create_padding_mask(x) # 패딩 마스크도 포함\n", + " return tf.maximum(look_ahead_mask, padding_mask)\n", + "'''tf.maximum() 함수: element-wise maximum(각 element 별로 큰 값을 선택하는 함수)\n", + "이전에 만든 패딩 마스크와 조합해 현재 위치의 이후 위치들을 모두 가려주는 마스크를 만들고 반환함.\n", + "\n", + "tf.maximum(look_ahead_mask, padding_mask): element-wise maximum(각 element 별로 큰 값을 선택하는 함수)\n", + "\n", + "- look_ahead_mask : 미래 토큰을 Masking 하는데 사용되는 마스크\n", + "- padding_mask : 패딩 토큰을 Masking 하는데 사용되는 마스크\n", + "\n", + "두 마스크를 maximum 함수에 적용해서 \n", + "\"각 위치에서 패딩토큰과 미래토큰 중 하나가 존재하는 경우에는 해당 위치를 마스킹하도록 결정\"\n", + "-> 이렇게 결합된 마스크는 패딩 및 미래 토큰 모두를 마스킹하는 마스크를 생성함.\n", + "'''" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9ba8f4b", + "metadata": { + "id": "e9ba8f4b" + }, + "outputs": [], + "source": [ + "def decoder_layer(dff, d_model, num_heads, dropout, name=\"decoder_layer\"):\n", + " #디코더의 sublayer를 구성하는 함수\n", + " inputs = tf.keras.Input(shape=(None, d_model), name=\"inputs\")\n", + " enc_outputs = tf.keras.Input(shape=(None, d_model), name=\"encoder_outputs\")\n", + "\n", + " # 디코더는 룩어헤드 마스크(첫번째 서브층)와 패딩 마스크(두번째 서브층) 둘 다 사용.\n", + " look_ahead_mask = tf.keras.Input(\n", + " shape=(1, None, None), name=\"look_ahead_mask\") #미래토큰을 masking 하도록 사용\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name='padding_mask')\n", + " # 패딩된 부분을 masking하도록 padding_mask를 사용함.\n", + "\n", + " \n", + "\n", + " # 멀티-헤드 어텐션 (첫번째 서브층 / 마스크드 셀프 어텐션)\n", + " attention1 = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention_1\")(inputs={\n", + " 'query': inputs, 'key': inputs, 'value': inputs, # Q = K = V\n", + " 'mask': look_ahead_mask # 룩어헤드 마스크\n", + " #look_ahed_mask랑 padding mask 모두 사용하려면\n", + " #look_ahed_mask 함수 내 tf.maximum 함수를 사용해 둘 중 더 큰 값을 선택함.\n", + " \n", + " #그러면 디코더의 첫번째 sublayer에선 미래 정보를 참조 못하고, \n", + " #두번째 sublayer에선 패딩된 부분을 참조하지 못하게 함.\n", + " })\n", + "\n", + " # 잔차 연결과 층 정규화\n", + " attention1 = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention1 + inputs)\n", + "\n", + " # 멀티-헤드 어텐션 (두번째 서브층 / 디코더-인코더 어텐션)\n", + " attention2 = MultiHeadAttention(\n", + " d_model, num_heads, name=\"attention_2\")(inputs={\n", + " 'query': attention1, 'key': enc_outputs, 'value': enc_outputs, # Q != K = V\n", + " 'mask': padding_mask # 패딩 마스크\n", + " })\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " attention2 = tf.keras.layers.Dropout(rate=dropout)(attention2)\n", + " attention2 = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(attention2 + attention1)\n", + "\n", + " # 포지션 와이즈 피드 포워드 신경망 (세번째 서브층)\n", + " outputs = tf.keras.layers.Dense(units=dff, activation='relu')(attention2)\n", + " outputs = tf.keras.layers.Dense(units=d_model)(outputs)\n", + "\n", + " # 드롭아웃 + 잔차 연결과 층 정규화\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(outputs)\n", + " outputs = tf.keras.layers.LayerNormalization(\n", + " epsilon=1e-6)(outputs + attention2)\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, enc_outputs, look_ahead_mask, padding_mask],\n", + " outputs=outputs,\n", + " name=name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66f05031", + "metadata": { + "id": "66f05031" + }, + "outputs": [], + "source": [ + "def decoder(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name='decoder'):\n", + " inputs = tf.keras.Input(shape=(None,), name='inputs')\n", + " enc_outputs = tf.keras.Input(shape=(None, d_model), name='encoder_outputs')\n", + "\n", + " # 디코더는 룩어헤드 마스크(첫번째 서브층)와 패딩 마스크(두번째 서브층) 둘 다 사용.\n", + " look_ahead_mask = tf.keras.Input(\n", + " shape=(1, None, None), name='look_ahead_mask')\n", + " padding_mask = tf.keras.Input(shape=(1, 1, None), name='padding_mask')\n", + "\n", + " # 포지셔널 인코딩 + 드롭아웃\n", + " embeddings = tf.keras.layers.Embedding(vocab_size, d_model)(inputs)\n", + " embeddings *= tf.math.sqrt(tf.cast(d_model, tf.float32))\n", + " embeddings = PositionalEncoding(vocab_size, d_model)(embeddings)\n", + " outputs = tf.keras.layers.Dropout(rate=dropout)(embeddings)\n", + "\n", + " # 디코더를 num_layers개 쌓기\n", + " for i in range(num_layers):\n", + " outputs = decoder_layer(dff=dff, d_model=d_model, num_heads=num_heads,\n", + " dropout=dropout, name='decoder_layer_{}'.format(i),\n", + " )(inputs=[outputs, enc_outputs, look_ahead_mask, padding_mask])\n", + "\n", + " return tf.keras.Model(\n", + " inputs=[inputs, enc_outputs, look_ahead_mask, padding_mask],\n", + " outputs=outputs,\n", + " name=name)\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "2e5d5fc8", + "metadata": { + "id": "2e5d5fc8" + }, + "source": [ + "## Transformer 구현" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcc9c225", + "metadata": { + "id": "dcc9c225" + }, + "outputs": [], + "source": [ + "def transformer(vocab_size, num_layers, dff,\n", + " d_model, num_heads, dropout,\n", + " name=\"transformer\"):\n", + "\n", + " # 인코더의 입력\n", + " inputs = tf.keras.Input(shape=(None,), name=\"inputs\")\n", + "\n", + " # 디코더의 입력\n", + " dec_inputs = tf.keras.Input(shape=(None,), name=\"dec_inputs\")\n", + "\n", + " # 인코더의 패딩 마스크\n", + " enc_padding_mask = tf.keras.layers.Lambda(\n", + " create_padding_mask, output_shape=(1, 1, None),\n", + " name='enc_padding_mask')(inputs)\n", + "\n", + " # 디코더의 룩어헤드 마스크(첫번째 서브층)\n", + " look_ahead_mask = tf.keras.layers.Lambda(\n", + " create_look_ahead_mask, output_shape=(1, None, None),\n", + " name='look_ahead_mask')(dec_inputs)\n", + "\n", + " # 디코더의 패딩 마스크(두번째 서브층)\n", + " dec_padding_mask = tf.keras.layers.Lambda(\n", + " create_padding_mask, output_shape=(1, 1, None),\n", + " name='dec_padding_mask')(inputs)\n", + "\n", + " # 인코더의 출력은 enc_outputs. 디코더로 전달된다.\n", + " enc_outputs = encoder(vocab_size=vocab_size, num_layers=num_layers, dff=dff,\n", + " d_model=d_model, num_heads=num_heads, dropout=dropout,\n", + " )(inputs=[inputs, enc_padding_mask]) # 인코더의 입력은 입력 문장과 패딩 마스크\n", + "\n", + " # 디코더의 출력은 dec_outputs. 출력층으로 전달된다.\n", + " dec_outputs = decoder(vocab_size=vocab_size, num_layers=num_layers, dff=dff,\n", + " d_model=d_model, num_heads=num_heads, dropout=dropout,\n", + " )(inputs=[dec_inputs, enc_outputs, look_ahead_mask, dec_padding_mask])\n", + "\n", + " # 다음 단어 예측을 위한 출력층\n", + " outputs = tf.keras.layers.Dense(units=vocab_size, name=\"outputs\")(dec_outputs)\n", + "\n", + " return tf.keras.Model(inputs=[inputs, dec_inputs], outputs=outputs, name=name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "157eba42", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "id": "157eba42", + "outputId": "52e4255a-815c-473f-9279-eaabddba93f7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(1, 9000, 128)\n", + "(1, 9000, 128)\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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knrnnXdWrlz51VdfNTQ0MJ0FAAAAACTB4AIAACivwMDAt2/fnjhxgukgAAAAACAJBhcAAEB59e3bd968eREREUwHAQAAAABJMLgAAABKbdWqVQ8ePLhy5QrTQQAAAACgQxhcUDfLli3T1dVlsViZmZmSXzp37py+vv5PP/3ERMzu27lzp76+frs7KA8q2ktycunSpZCQkKSkJBsbGxaLxWKxWs0ROHXqVF1dXU1NzWHDht27d09hwRiJdPr06d27d4tEIhm2Ce1ycnJ69913v/nmG6aDAACAspNQCfeQutaEarZf/v7+rL8sXLiw5UuoY1tqW8empKSIu87ExKR7zWJwQd0cPXr022+/leYliqIUFUqWQkJC/vnPfypscyraS/KwZcuWqKioDRs2eHt7P3361NbW1tjYOC4u7uzZs+J1Ll68mJCQMGvWrOzsbCcnJ4VlYySSp6cnl8t1d3cvLy+XYbPQrsDAwNTU1KdPnzIdBAAAlJqESriH1LUmVL/9MjIySktLy8nJiYmJES9EHdtK2zp29uzZBQUFV69e9fDw6HazGFzovWbOnFlRUTFr1iymgyg1efdSXV2dq6urnBqXoV27dp08efLUqVO6urrihVFRURoaGgKBoKKigsFsLSk4UmBg4MiRIz08PJqamhSwud7My8vL0tKyZZUAAACgSOpaE6rffvF4vOnTp9vb22tra9NLUMe2q1Udy2KxLC0t3dzcBg0a1O02MbighlgsVjdekh5FUQkJCUeOHOl5UxATE1NUVMR0ik7k5eVt3rx569atXC635XJXV9egoKCXL1+uWbOGqWytKD5SWFhYZmbmvn37FLO5XovNZi9YsCAuLk79/sECAACyJZNyV/FUoibsBsb3C3WsBDKvYzG40AUikSg0NNTa2prH440YMSI+Pp4QEh0draOjw+fzU1NTZ8yYoaenZ2Vl1XLWtGPHjo0dO5bL5ero6AwYMGD79u0SNhEVFcXlcs3MzPz9/fv27cvlcl1dXTMyMuhXr1275uDgoK+vz+VyHR0dL1y4QC+nKGrPnj2DBw/W1tbW19dfu3atuMGOXrp+/bq1tTWLxTpw4ECneyESib788svBgwfzeDwTE5OBAwd++eWX8+bNk7Aj+/bt09HR0dDQGDNmjLm5OYfD0dHRcXJycnNz69evH5fLNTAw+OKLL8Trd7RrV65c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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ], + "source": [ + "small_transformer = transformer(\n", + " vocab_size = 9000,\n", + " num_layers = 4,\n", + " dff = 512,\n", + " d_model = 128,\n", + " num_heads = 4,\n", + " dropout = 0.3,\n", + " name=\"small_transformer\")\n", + "\n", + "tf.keras.utils.plot_model(\n", + " small_transformer, to_file='small_transformer.png', show_shapes=True)" + ] + }, + { + "cell_type": "markdown", + "id": "6f6a3a83", + "metadata": { + "id": "6f6a3a83" + }, + "source": [ + "## 손실함수\n", + "- seq2seq에서 사용되는 손실함수\n", + "- 인코더에서 출력된 context vector를 decoder에 입력하고, 디코더에서 이를 기반으로 출력된 문장을 실제 정답 문장과 비교해서 손실을 계산함." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87a3d5ec", + "metadata": { + "id": "87a3d5ec" + }, + "outputs": [], + "source": [ + "def loss_function(y_true, y_pred):\n", + " #y_true : 실제 정답 문장\n", + " #y_pred : 디코더에서 출력된 모델의 예측값\n", + " y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1)) \n", + " '''\n", + " MAX_LENGTH -1의 형태로 reshape하는 이유는 \n", + " 디코더에서 사용되는 'start token'을 제외한 모든 토큰을 포함하기 위함.\n", + " '''\n", + " loss = tf.keras.losses.SparseCategoricalCrossentropy(\n", + " from_logits=True, reduction='none')(y_true, y_pred)\n", + " #SparseCategoricalCrossentropy : y_true와 y_pred 간의 손실 계산\n", + " #from_logits=True : y_pred가 확률이 아니라 logit값이므로 softmax함수를 거치지 않게끔 함.\n", + " #reduction=none : 배치 단위의 데이터의 평균 대신 각각의 샘플에 대한 손실값을 반환함.\n", + "\n", + " mask = tf.cast(tf.not_equal(y_true, 0), tf.float32)\n", + " #y_true가 패딩 토큰인 경우에 대한 손실을 제외하고자 마스크를 적용\n", + " #패딩토큰에 해당하는 부분은 mask 변수를 사용해 0으로 설정함.\n", + " loss = tf.multiply(loss, mask)\n", + " #손실값과 마스크를 곱해 마스크가 적용된 손실을 계산하고, \n", + " #이를 평균 내어 반환함.\n", + " return tf.reduce_mean(loss)" + ] + }, + { + "cell_type": "markdown", + "id": "8a831e8a", + "metadata": { + "id": "8a831e8a" + }, + "source": [ + "## custom schedule\n", + "- tf.keras.optimizers.schedules.LearningRateSchedule를 상속\n", + "- 낮은 학습률로 시작하여 점차적으로 학습률을 높여 다시 감소하기 시작하는 지점까지 학습률을 높이도록 설계됨\n", + " - 신경망 훈련에서 일반적으로 사용되는 방식" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f74e232", + "metadata": { + "id": "2f74e232" + }, + "outputs": [], + "source": [ + "class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):\n", + "\n", + " def __init__(self, d_model, warmup_steps=4000):\n", + " '''모델의 차원 크기(`d_model`)와 워밍업 단계 수(`warmup_steps`)를 포함하여 \n", + " 스케줄의 하이퍼파라미터를 초기화함\n", + " '''\n", + " super(CustomSchedule, self).__init__()\n", + " self.d_model = d_model\n", + " self.d_model = tf.cast(self.d_model, tf.float32)\n", + " self.warmup_steps = warmup_steps\n", + " \n", + "\n", + " def __call__(self, step):\n", + " '''d_model` 매개 변수는 `__call__` 메서드 내부의 나누기 연산이 \n", + " 정수를 반환하도록 하기 위해 정수로 캐스팅됨.\n", + " '''\n", + " #현재 훈련 단계를 나타내는 `step` 매개 변수를 받음\n", + " #이 메서드는 현재 단계에서 학습률을 계산하는 데 사용되는 두 개의 인수인 `arg1`과 `arg2`를 계산\n", + " arg1 = tf.math.rsqrt(step)\n", + " #'arg1'은 스텝 수의 역제곱근으로 계산\n", + " arg2 = step * (self.warmup_steps**-1.5)\n", + " #'arg2'는 스텝 수에 'warmup_steps'의 역제곱근을 `-1.5`의 거듭제곱으로 곱한 값으로 계산\n", + " \n", + " return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2)\n", + " #학습률은 `d_model`의 역제곱근에 `arg1`과 `arg2`의 최소값을 곱한 값으로 계산" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fb94965", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 467 + }, + "id": "4fb94965", + "outputId": "27bd8827-3790-446e-e14b-d287a3b1d71b" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0.5, 0, 'Train Step')" + ] + }, + "metadata": {}, + "execution_count": 19 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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kydL+3NzczFy5Ejcdddd2LNnD3788UcUFhbioYcesql+zUlaUsEOd/9ZDOwQCpkMOKwtRb6+6voHEBER3cyEjXbu3Ck2bdokhBAiPz9fJCUlicDAQHHLLbeInJwcm841YMAAMWXKFOmzyWQSkZGRIi0trd74Rx99VIwYMcJqW3x8vHjqqaeEEEKYzWah0WjEokWLpP0lJSVCqVSKL774QgghxMGDBwUAsXPnTinmhx9+EDKZTJw9e1YIIcTatWuFt7e3MJlMUsy3334rZDKZMBqNja6fTqcTAIROp2v0MU018p2tInrGevHTAa1dz/tA3Xm/yDpl1/MSERG5qqa23zb3VPXr1w933nkngNrhv/T0dOj1emRnZ6N3796NPo/RaER2djYSExOlbXK5HImJicjMzKz3mMzMTKt4AEhKSpLic3NzodVqrWLUajXi4+OlmMzMTAQHB6Nfv35STGJiIuRyObKysgAAffv2hVwuxyeffAKTyQSdTof//Oc/SExMhI/Pte+CMxgM0Ov1Vq/mIi2p4GWfJRUs7uocBgDYdLj+3kMiIiKqZbcJOLt378Z9993X6PjCwkKYTCaEh4dbbQ8PD4dWq633GK1W22C85f16MWFhYVb7vb29ERISIsXExMTgp59+wqxZs6BUKhEcHIwzZ87gyy+/bLBOaWlpUKvV0isqKqrBeHtyxJwqALirS+3vauuxQhhqrn6QNhEREdWyqQX+8ccf8cILL2DWrFk4ceIEAODw4cNITk5G//79pUfZuDutVotJkyZh/Pjx2LlzJ3755RcoFAr85S9/gRDimsfNnDkTOp1OejVl4n5TWdapsteSChbdI4PQKlCJCqMJO3K5tAIREdG1NHrxz48++giTJk1CSEgILl68iA8//BCvv/46nnvuOYwaNQr79+9H165dG33h0NBQeHl5IT8/32p7fn4+NBpNvcdoNJoG4y3v+fn5iIiIsIqxDE1qNJqrJsLX1NSguLhYOn7p0qVQq9VYuHChFPPZZ58hKioKWVlZuPXWW+stn1KphFKpvF7VHcLogInqACCXy3Bn51b4ctcZbD58AYNjW9n1/ERERJ6i0d0ab731Fv7973+jsLAQX375JQoLC/Huu+/ijz/+wLJly2xKqABAoVCgb9++yMjIkLaZzWZkZGQgISGh3mMSEhKs4gFg48aNUnxMTAw0Go1V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I1bb3fW727x5c73/TY4fP14IUXub+Jw5c0R4eLhQKpVi6NChV9W9qKhIjBkzRgQEBIigoCAxYcIEUVpaahWzd+9eMWjQIKFUKkXr1q3FggULrirLl19+KTp16iQUCoXo3r27+P777632N6YsttQvNzf3mv8mLWuPZWdni/j4eKFWq4VKpRJdu3YV//rXv6wSEmfW73p1rKioEPfcc49o1aqV8PHxEdHR0WLSpElXJeDu+h1avP/++8LX11eUlJRcdbyrf4fXaxeEcK2/nY0py/XI6ipORERERDeAc6qIiIiI7IBJFREREZEdMKkiIiIisgMmVURERER2wKSKiIiIyA6YVBERERHZAZMqIiIiIjtgUkVERERkB0yqiIgAtGvXDm+++aazi0FEboxJFRG5FZlM1uDrH//4R5POu3PnTkyePPmGypabm4u//vWviIyMhEqlQps2bTBy5EgcPnwYAHDy5EnIZDLpgdRE5Fm8nV0AIiJbnD9/Xvp5zZo1SE1NxZEjR6RtAQEB0s9CCJhMJnh7X/9PXatWrW6oXNXV1bj77rvRuXNnfP3114iIiMCZM2fwww8/oKSk5IbOTUTugT1VRORWNBqN9FKr1ZDJZNLnw4cPIzAwED/88AP69u0LpVKJrVu34vjx4xg5ciTCw8MREBCA/v374+eff7Y675XDfzKZDB9++CEefPBB+Pn5ITY2Ft9+++01y3XgwAEcP34c7777Lm699VZER0fjtttuw/z583HrrbcCAGJiYgAAffr0gUwmwx133CEd/+GHH6Jr165QqVTo0qUL3n33XWmfpYdr9erVGDhwIFQqFXr06IFffvnFDr9RIrIXJlVE5HFefvllLFiwAIcOHULPnj1RVlaG4cOHIyMjAzk5ORg2bBjuv/9+5OXlNXieV155BY8++ij27duH4cOHY+zYsSguLq43tlWrVpDL5fjqq69gMpnqjdmxYwcA4Oeff8b58+fx9ddfAwA+//xzpKam4tVXX8WhQ4fwr3/9C3PmzMHKlSutjn/xxRcxffp05OTkICEhAffffz+Kiops/fUQkaMIIiI39cknnwi1Wi193rx5swAg1q1bd91ju3fvLt5++23pc3R0tHjjjTekzwDE7Nmzpc9lZWUCgPjhhx+uec533nlH+Pn5icDAQHHnnXeKefPmiePHj0v7c3NzBQCRk5NjdVyHDh3EqlWrrLb985//FAkJCVbHLViwQNpfXV0t2rRpI/79739ft65E1DzYU0VEHqdfv35Wn8vKyvDCCy+ga9euCA4ORkBAAA4dOnTdnqqePXtKP/v7+yMoKAgFBQXXjJ8yZQq0Wi0+//xzJCQkYO3atejevTs2btx4zWPKy8tx/PhxTJw4EQEBAdJr/vz5OH78uFVsQkKC9LO3tzf69euHQ4cONVgHImo+nKhORB7H39/f6vMLL7yAjRs3YvHixejYsSN8fX3xl7/8BUajscHz+Pj4WH2WyWQwm80NHhMYGIj7778f999/P+bPn4+kpCTMnz8fd999d73xZWVlAIAPPvgA8fHxVvu8vLwavBYRuRb2VBGRx9u2bRsef/xxPPjgg4iLi4NGo8HJkycdfl2ZTIYuXbqgvLwcAKBQKADAas5VeHg4IiMjceLECXTs2NHqZZnYbvH7779LP9fU1CA7Oxtdu3Z1eD2IqHHYU0VEHi82NhZff/017r//fshkMsyZM+e6PU622rNnD+bOnYvHHnsM3bp1g0KhwC+//IKPP/4YM2bMAACEhYXB19cX6enpaNOmDVQqFdRqNV555RU8//zzUKvVGDZsGAwGA3bt2oWLFy8iJSVFusbSpUsRGxuLrl274o033sDFixfxxBNP2LUeRNR0TKqIyOO9/vrreOKJJzBw4ECEhoZixowZ0Ov1dr1GmzZt0K5dO7zyyivSEgiWz3/7298A1M6DWrJkCebNm4fU1FQMHjwYW7ZswZNPPgk/Pz8sWrQIL774Ivz9/REXF4dp06ZZXWPBggVYsGAB9uzZg44dO+Lbb79FaGioXetBRE0nE0IIZxeCiIiu7eTJk4iJiUFOTg569+7t7OIQ0TVwThURERGRHTCpIiIiIrIDDv8RERER2QF7qoiIiIjsgEkVERERkR0wqSIiIiKyAyZVRERERHbApIqIiIjIDphUEREREdkBkyoiIiIiO2BSRURERGQH/x9J7OoaV4icwwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ], + "source": [ + "sample_learning_rate = CustomSchedule(d_model=128)\n", + "#각 단어를 모델에서 128차원의 벡터로 표현하도록 함\n", + "\n", + "plt.plot(sample_learning_rate(tf.range(200000, dtype=tf.float32)))\n", + "#training step이 200000번임.\n", + "plt.ylabel(\"Learning Rate\")\n", + "plt.xlabel(\"Train Step\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "colab": { + "provenance": [], + "include_colab_link": true + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file From fcf39e625f9555390dc76d95dbc44c21ac6539eb Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Fri, 9 Feb 2024 14:36:56 +0900 Subject: [PATCH 5/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...354\247\204\354\230\201_huggingface.ipynb" | 10073 ++++++++++++++++ 1 file changed, 10073 insertions(+) create mode 100644 "\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_huggingface.ipynb" diff --git "a/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_huggingface.ipynb" "b/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_huggingface.ipynb" new file mode 100644 index 0000000..8923a05 --- /dev/null +++ "b/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_huggingface.ipynb" @@ -0,0 +1,10073 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Details\n", + "Training : 빠른 학습속도를 위한 AMP 사용\n", + "Epoch : 10\n", + "Data : 각 모델별로 5 Fold 학습\n", + "Model : 'monologg/kobert', 'klue/roberta-base', 'klue/roberta-small', 'klue/roberta-large', 'xlm-roberta-large', 'bert-base-multilingual-uncased'\n", + "Ensemble : logit ensemble" + ], + "metadata": { + "id": "mpZY6sFLDjmm" + }, + "id": "mpZY6sFLDjmm" + }, + { + "cell_type": "markdown", + "id": "0343a98b", + "metadata": { + "id": "0343a98b" + }, + "source": [ + "## 시작" + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install torch_optimizer\n", + "#torch_optimizer는 PyTorch를 기반으로 하는 \"딥러닝 모델의 최적화\"를 위한 여러 알고리즘을 제공하는 라이브러리" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L0hQWVizkqoO", + "outputId": "4ec43b95-037a-4e32-f646-a00538c5bd51" + }, + "id": "L0hQWVizkqoO", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting torch_optimizer\n", + " Downloading torch_optimizer-0.3.0-py3-none-any.whl (61 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.9/61.9 KB\u001b[0m \u001b[31m1.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pytorch-ranger>=0.1.1\n", + " Downloading pytorch_ranger-0.1.1-py3-none-any.whl (14 kB)\n", + "Requirement already satisfied: torch>=1.5.0 in /usr/local/lib/python3.9/dist-packages (from torch_optimizer) (2.0.0+cu118)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (3.10.7)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (3.1.2)\n", + "Requirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (2.0.0)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (3.0)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (1.11.1)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.9/dist-packages (from torch>=1.5.0->torch_optimizer) (4.5.0)\n", + "Requirement already satisfied: lit in /usr/local/lib/python3.9/dist-packages (from triton==2.0.0->torch>=1.5.0->torch_optimizer) (16.0.0)\n", + "Requirement already satisfied: cmake in /usr/local/lib/python3.9/dist-packages (from triton==2.0.0->torch>=1.5.0->torch_optimizer) (3.25.2)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.9/dist-packages (from jinja2->torch>=1.5.0->torch_optimizer) (2.1.2)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.9/dist-packages (from sympy->torch>=1.5.0->torch_optimizer) (1.3.0)\n", + "Installing collected packages: pytorch-ranger, torch_optimizer\n", + "Successfully installed pytorch-ranger-0.1.1 torch_optimizer-0.3.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install transformers\n", + "#transformers : 딥러닝 자연어 처리 모델 구현 라이브러리\n", + "##다양한 pre-trained 언어 모델을 제공하고, 이를 fine-tunning 해서 특정 자연어 처리 task에 맞는 모델을 만들 수 있음" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "O-hRaYsBkwrr", + "outputId": "1290dce9-58c6-47c3-cb9b-ff87c55ab41a" + }, + "id": "O-hRaYsBkwrr", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting transformers\n", + " Downloading transformers-4.27.4-py3-none-any.whl (6.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.8/6.8 MB\u001b[0m \u001b[31m46.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.9/dist-packages (from transformers) (4.65.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.9/dist-packages (from transformers) (2022.10.31)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.9/dist-packages (from transformers) (6.0)\n", + "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.9/dist-packages (from transformers) (1.22.4)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.9/dist-packages (from transformers) (23.0)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.9/dist-packages (from transformers) (2.27.1)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.9/dist-packages (from transformers) (3.10.7)\n", + "Collecting huggingface-hub<1.0,>=0.11.0\n", + " Downloading huggingface_hub-0.13.4-py3-none-any.whl (200 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m200.1/200.1 KB\u001b[0m \u001b[31m12.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting tokenizers!=0.11.3,<0.14,>=0.11.1\n", + " Downloading tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m64.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.9/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.9/dist-packages (from requests->transformers) (2022.12.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.9/dist-packages (from requests->transformers) (1.26.15)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.9/dist-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/dist-packages (from requests->transformers) (3.4)\n", + "Installing collected packages: tokenizers, huggingface-hub, transformers\n", + "Successfully installed huggingface-hub-0.13.4 tokenizers-0.13.3 transformers-4.27.4\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "- pre-trained\n", + " - pre-trained model : 대규모 데이터 셋에서 미리 학습된 모델 -> 다른 자연어 처리 task에서도 유용(BERT가 Wikipedia 대규모 데이터셋에서 사전학습되었고, 다양한 자연어 처리 업무에 사용 가능)\n", + " - 학습시간을 줄이고 소규모 데이터셋에서도 높은 성능 획득 가능\n", + "- fine-tunning\n", + " - pre-trained 모델을 사용해 특정 자연어 처리 업무에 맞는 모델을 만드는 과정\n", + " - 단계\n", + " > pre-trained model을 특정 자연어 처리 태스크에 맞게 fine-tunning\n", + " > --> 이 fine-tuned 모델은 특정 태스크에 대해 더 좋은 성능 발휘" + ], + "metadata": { + "id": "PhkA0kWajgNQ" + }, + "id": "PhkA0kWajgNQ" + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9892bce4", + "metadata": { + "code_folding": [ + 0 + ], + "id": "9892bce4" + }, + "outputs": [], + "source": [ + "# ------ LIBRARY -------#\n", + "import numpy as np\n", + "import os\n", + "import pickle\n", + "import sys\n", + "import pandas as pd\n", + "import re\n", + "import cv2\n", + "\n", + "# PyTorch 관련 라이브러리\n", + "import torch\n", + "import torch.cuda.amp as amp #Automatic Mixed Precision, GPU 메모리 사용량을 줄이고 학습 속도를 높이고자 사용하는 기술\n", + "\n", + "#데이터 로딩을 위한 라이브러리 : torch.utils.data, torch.utils.data.sampler\n", + "from torch.utils.data.dataset import Dataset\n", + "from torch.utils.data import DataLoader\n", + "from torch.utils.data.sampler import *\n", + "\n", + "#모델 학습 및 최적화를 위한 라이브러리 : torch.nn, torch.optim, torch.optim.lr_scheduler\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts, CosineAnnealingLR, ReduceLROnPlateau, MultiStepLR, OneCycleLR\n", + "\n", + "import math\n", + "\n", + "#optimizer는 학습 중 모델의 가중치를 업데이트하는 알고리즘\n", + "#required는 optimizer 클래스의 메소드에서 필수적으로 사용되는 인자를 표시하는 데 사용됨.\n", + "from torch.optim.optimizer import Optimizer, required\n", + "import torch_optimizer as optim\n", + "#defaultdict는 일반적인 dict와 유사하지만 존재하지 않는 키를 새로 만들 때 디폴트값을 반환함.\n", + "from collections import defaultdict\n", + "#itertools는 반복 가능한 객체를 다루는 유용한 함수들을 제공함\n", + "import itertools as it\n", + "\n", + "import tqdm #진행상황을 시각화하는 라이브러리(진행 바 같은 걸 출력해줌)\n", + "import random\n", + "#import time\n", + "import matplotlib.pyplot as plt\n", + "from timeit import default_timer as timer\n", + "from sklearn.model_selection import KFold\n", + "from sklearn.metrics import f1_score\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "\n", + "# transformer 모델들과 tokenizer import\n", + "# trainsformer 모델들 : pretrained\n", + "from transformers import XLMPreTrainedModel, XLMRobertaModel, XLMRobertaConfig, XLMRobertaTokenizer\n", + "from transformers import XLMRobertaForSequenceClassification, BertForSequenceClassification\n", + "from transformers import AutoTokenizer\n", + "from transformers import BertForSequenceClassification, DistilBertForSequenceClassification, XLNetForSequenceClassification,\\\n", + "XLMRobertaForSequenceClassification, XLMForSequenceClassification, RobertaForSequenceClassification\n", + "#AdamW 최적화 알고리즘을 사용\n", + "from transformers import AdamW\n", + "#학습률 조절에 사용하는 함수\n", + "from transformers import get_linear_schedule_with_warmup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f87869f9", + "metadata": { + "code_folding": [], + "id": "f87869f9" + }, + "outputs": [], + "source": [ + "# class args\n", + "class args: #여러 학습 인자의 값을 설정\n", + " # ---- factor ---- #\n", + " debug=False #디버그 모드 여부\n", + " amp = True #mixed precision을 사용할 지 여부\n", + " gpu = '0' #GPU 번호\n", + "\n", + " epochs=10 #에포크 수\n", + " batch_size=1 #배치 크기\n", + " weight_decay=1e-6 #가중치 감소 값\n", + " n_fold=5 #교차 검증(fold) 수\n", + " fold=3 # [0, 1, 2, 3, 4] # 원래는 3\n", + "\n", + " exp_name = 'experiment_name_folder'\n", + " dir_ = f'./saved_models/'\n", + " pt = 'your_model_name'\n", + " max_len = 33 #모델 입력 시퀀스의 최대 길이 설정\n", + " #학습률을 설정하는 파라미터\n", + " start_lr = 1e-5#1e-3,5e-5 #학습시 초기학습률 값을 의미. 학습 초기에 빠르게 수렴할 가능성이 있지만, 값이 너무 크면 수렴이 불안정해짐\n", + " min_lr=1e-6 #학습 중 학습율이 더이상 작아지지 않게 제한하는 값. 해당 값 이하로 떨어지지 않게 보장함.\n", + " # ---- Dataset ---- #\n", + "\n", + " # ---- Else ---- #\n", + " num_workers=8\n", + " seed=2021\n", + " scheduler = None#모델의 학습률을 조정하는 방법을 지정. 방법은 사용하지 않겠지만, 다른 변수를 이용해 학습률 조정 방식을 선택할 수 있음.\n", + "\n", + "\n", + "data_dir = './' # 데이터가 저장된 디렉토리 경로를 나타냄\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"] = args.gpu #args.gpu : 코드 실행 시 지정된 GPU의 인덱스\n", + "device = torch.device(f\"cuda\" if torch.cuda.is_available() else \"cpu\") #디바이스 유형 설정.\n", + "#만약 CUDA 디바이스가 사용 가능하면 \"cuda\"로 설정하고, 그렇지 않으면 \"cpu\"로 설정함. 이를 통해 디바이스 유형에 맞게 모델을 초기화할 수 있음.\n", + "\n", + "##모델 학습 시 랜덤 시드를 설정해 재현성을 보장\n", + "def set_seeds(seed=42):\n", + " random.seed(seed)\n", + " os.environ['PYTHONHASHSEED'] = str(seed)\n", + " np.random.seed(seed)\n", + " torch.manual_seed(seed)\n", + " torch.cuda.manual_seed(seed)\n", + " torch.cuda.manual_seed_all(seed)\n", + " #torch.backends.cudnn : NVIDIA cuDNN 라이브러리를 사용해서 PyTorch 연산의 실행 속도를 높이는 데 사용됨.\n", + " #cuDNN : Deep Neural Network 라이브러리, NVIDIA GPU에서 딥러닝 모델을 학습 및 추론할 때 연산속도를 높이기 위한 최적화된 기능을 제공\n", + " #torch.backends.cudnn을 쓰면 이런 최적화를 활용해 PyTorch 연산 속도를 높일 수 있음.\n", + " torch.backends.cudnn.deterministic = True #기본값이 True. 연산 실행 시간을 단축하고자 cuDNN 라이브러리가 실행 시간을 측정하고 최적화를 수행하는 걸 의미\n", + " torch.backends.cudnn.benchmark = False # 연산 결과가 항상 동일하지 않을 수 있다는 걸 의미함. -> 연산 속도 및 학습을 빠르게함\n", + "\n", + "set_seeds(seed=args.seed)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "299e9265", + "metadata": { + "code_folding": [ + 1, + 11 + ], + "id": "299e9265" + }, + "outputs": [], + "source": [ + "# - util - #\n", + "def get_learning_rate(optimizer): #현재 학습률을 가져와서 반환하는 함수\n", + " lr=[]\n", + " for param_group in optimizer.param_groups:\n", + " #param_groups : optimizer의 학습률과 weight decay 같은 하이퍼파라미터 관리\n", + " lr +=[ param_group['lr'] ]\n", + "\n", + " assert(len(lr)==1)\n", + " #'lr'의 길이가 1인지 확인하는데, 이건 현재 이 코드에서 하나의 학습률만 사용하기 때문임.\n", + " lr = lr[0]\n", + "\n", + " return lr\n", + "\n", + "def load_data(): #데이터 로드 합수\n", + " train=pd.read_csv('./train_data.csv')\n", + " test=pd.read_csv('./test_data.csv')\n", + "\n", + " #일부 column을 지정\n", + " train=train[['title','topic_idx']]\n", + " test=test[['title']]\n", + " #5-fold 교차 검증 수행\n", + " from sklearn.model_selection import StratifiedKFold\n", + " skf = StratifiedKFold(n_splits=5, random_state=42, shuffle=True)\n", + " train['fold'] = -1\n", + " for n_fold, (_,v_idx) in enumerate(skf.split(train, train['topic_idx'])):\n", + " train.loc[v_idx, 'fold'] = n_fold\n", + " #train 데이터에 fold와 id열을 추가\n", + " train['id'] = [x for x in range(len(train))]\n", + "\n", + " return train, test\n" + ] + }, + { + "cell_type": "markdown", + "id": "86ed46c9", + "metadata": { + "heading_collapsed": true, + "id": "86ed46c9" + }, + "source": [ + "# 전처리" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6feb9fe2", + "metadata": { + "code_folding": [ + 0 + ], + "hidden": true, + "id": "6feb9fe2" + }, + "outputs": [], + "source": [ + "# make KoBertTokenizer\n", + "# 한글을 토큰화할 수 있는 KoBert 모델용 custom tokenizer를 만드는 데 사용함.\n", + "import logging\n", + "import os\n", + "import unicodedata #유니코드 문자 처리를 위함\n", + "from shutil import copyfile #파일 복사\n", + "\n", + "from transformers import PreTrainedTokenizer\n", + "\n", + "logger = logging.getLogger(__name__)\n", + "#logger : 스크립트 실행되는 동안 메세지를 기록하는 데 사용함.\n", + "# 로거명을 __name__로 설정하면 현재 모듈명을 로거의 이름으로 사용함\n", + "# 이렇게 하면 각 모듈이 자체 로거를 가질 수 있으므로 대규모 애플리케이션에서 로그 메세지를 더 잘 구성할 수 있음.\n", + "\n", + "VOCAB_FILES_NAMES = {\"vocab_file\": \"tokenizer_78b3253a26.model\", # 어휘파일의 위치 지정\n", + " \"vocab_txt\": \"vocab.txt\"} # 어휘에 대한 토큰-index mapping 사전을 구축하는 데 쓰임.\n", + "#PRETRAINED_VOCAB_FILES_MAP 변수를 정의하는 코드\n", + "# hugging face의 transformer 라이브러리에서 사용되고, 사전 학습된 모델의 tokenizer와 관련된 파일들의 URL을 매핑함\n", + "#즉, 해당 모델에 대한 토크나이저와 어휘파일을 쉽게 다운로드할 수 있음.\n", + "PRETRAINED_VOCAB_FILES_MAP = {\n", + " #vocab_file과 vocab_txt는 각각 토크나이저 파이과 어휘 파일의 URL을 가리키는 사전임\n", + " \"vocab_file\": {\n", + " \"monologg/kobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert/tokenizer_78b3253a26.model\",\n", + " #각각의 어휘파일의 링크가 제공됨.\n", + " #이 링크들은 Hugging Face에서 제공하는 S3 버킷에서 해당 어휘 파일을 다운로드할 수 있는 주소를 제공함.\n", + " \"monologg/kobert-lm\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert-lm/tokenizer_78b3253a26.model\",\n", + " \"monologg/distilkobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/distilkobert/tokenizer_78b3253a26.model\"\n", + " #세 개의 다른 모델명, 각각 해당 모델에 대한 토크나이저와 어휘 파일을 가짐.\n", + " },\n", + " \"vocab_txt\": {\n", + " \"monologg/kobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert/vocab.txt\",\n", + " \"monologg/kobert-lm\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert-lm/vocab.txt\",\n", + " \"monologg/distilkobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/distilkobert/vocab.txt\"\n", + " }\n", + "}\n", + "\n", + "#KoBERT의 tokenizer와 관련된 변수들을 정의하는 부분\n", + "#positional embedding의 크기를 지정\n", + "PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {\n", + " \"monologg/kobert\": 512,\n", + " \"monologg/kobert-lm\": 512,\n", + " \"monologg/distilkobert\": 512\n", + "}\n", + "#초기화 설정값 지정.\n", + "PRETRAINED_INIT_CONFIGURATION = {\n", + " \"monologg/kobert\": {\"do_lower_case\": False}, #do_lower_case를 False로 설정하면 대소문자를 구분함.\n", + " \"monologg/kobert-lm\": {\"do_lower_case\": False},\n", + " \"monologg/distilkobert\": {\"do_lower_case\": False}\n", + "}\n", + "\n", + "SPIECE_UNDERLINE = u'▁'\n", + "#KOBERT tokenizer에서 사용되는 특수 토큰.\n", + "#\"__\"은 subword를 나타내며, 이는 단어 일부분이 다른 단어와 함께 subword 단위로 나눠지는 경우 사용됨.\n", + "\n", + "class KoBertTokenizer(PreTrainedTokenizer):\n", + " # KoBertTokenizer 클래스 : 문장 조각 기반 tokenizer를 구축하는 데 사용하는 transformer library의 PreTrainedTokenizer class를 상속받음\n", + " \"\"\"\n", + " SentencePiece based tokenizer. Peculiarities:\n", + " - requires `SentencePiece `_\n", + " \"\"\"\n", + " vocab_files_names = VOCAB_FILES_NAMES\n", + " pretrained_vocab_files_map = PRETRAINED_VOCAB_FILES_MAP\n", + " pretrained_init_configuration = PRETRAINED_INIT_CONFIGURATION\n", + " max_model_input_sizes = PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES\n", + "\n", + " def __init__(\n", + " self,\n", + " vocab_file,\n", + " vocab_txt,\n", + " do_lower_case=False,\n", + " remove_space=True,\n", + " keep_accents=False,\n", + " unk_token=\"[UNK]\",\n", + " sep_token=\"[SEP]\",\n", + " pad_token=\"[PAD]\",\n", + " cls_token=\"[CLS]\",\n", + " mask_token=\"[MASK]\",\n", + " **kwargs):\n", + " super().__init__(\n", + " unk_token=unk_token,\n", + " sep_token=sep_token,\n", + " pad_token=pad_token,\n", + " cls_token=cls_token,\n", + " mask_token=mask_token,\n", + " **kwargs\n", + " )\n", + "\n", + " # Build vocab\n", + " self.token2idx = dict()\n", + " self.idx2token = []\n", + " with open(vocab_txt, 'r', encoding='utf-8') as f:\n", + " #vocabtxt 파일을 열어서 어휘(vocabulary) 만듦.\n", + " #해당 텍스트 파일은 각 단어가 한 줄씩 적혀 있음\n", + " for idx, token in enumerate(f):\n", + " token = token.strip()\n", + " self.token2idx[token] = idx\n", + " self.idx2token.append(token)\n", + "\n", + " #self.max_len_single_sentence = self.max_len - 2 # take into account special tokens\n", + " #self.max_len_sentences_pair = self.max_len - 3 # take into account special tokens\n", + "\n", + " #sentencepiece 패키지를 이용해, SentencePiece모델 파일(tokenizer_78b3253a26.model)을 로드함.\n", + " #이 모델 파일은 BytePairEncoding 기반의 subword tokenization 정보를 담고 있으며,\n", + " #각 subwork token을 생서하기 위한 기준 정보를 담음\n", + " try:\n", + " import sentencepiece as spm\n", + " except ImportError:\n", + " logger.warning(\"You need to install SentencePiece to use KoBertTokenizer: https://github.com/google/sentencepiece\"\n", + " \"pip install sentencepiece\")\n", + "\n", + " #KoBertTokenizer 객체의 어휘 변수로 어휘 파일(vocab_txt), SentencePiece 모델 파일(vocab_file) 경로,\n", + " #대소문자 구분 여부(do_lower_case), 공백 제거 여부(remove_space), 악센트 유지 여부(keep_accents) 등이 저장됨\n", + " self.do_lower_case = do_lower_case\n", + " self.remove_space = remove_space\n", + " self.keep_accents = keep_accents\n", + " self.vocab_file = vocab_file\n", + " self.vocab_txt = vocab_txt\n", + "\n", + " self.sp_model = spm.SentencePieceProcessor() #sentencepiece 패키지를 사용하여 SentencePieceProcessor 객체를 초기화\n", + " self.sp_model.Load(vocab_file)\n", + "\n", + " @property\n", + " #메서드를 클래스 속성의 \"getter\"로 정의할 수 있는 파이썬 데코레이터.\n", + " #메서드 저의 앞에서 @property를 쓰면 해당 메서드를 클래스 인스턴스의 속성으로 접근 가능함.\n", + " #(ex. KoBertTokenizer 클래스에서 vocab_size는 속성이지만,\n", + " #KoBertTokenizer 인스턴스의 속성처럼 전근 가능하되 실제 토큰화 어휘의 길이를 반환하는 method)\n", + " def vocab_size(self):\n", + " return len(self.idx2token)\n", + "\n", + " def __getstate__(self):\n", + " state = self.__dict__.copy()\n", + " state[\"sp_model\"] = None\n", + " return state\n", + "\n", + " def __setstate__(self, d):\n", + " self.__dict__ = d\n", + " try:\n", + " import sentencepiece as spm\n", + " except ImportError:\n", + " logger.warning(\"You need to install SentencePiece to use KoBertTokenizer: https://github.com/google/sentencepiece\"\n", + " \"pip install sentencepiece\")\n", + " self.sp_model = spm.SentencePieceProcessor()\n", + " self.sp_model.Load(self.vocab_file)\n", + "\n", + " def preprocess_text(self, inputs):\n", + " if self.remove_space:\n", + " outputs = \" \".join(inputs.strip().split())\n", + " else:\n", + " outputs = inputs\n", + " outputs = outputs.replace(\"``\", '\"').replace(\"''\", '\"')\n", + "\n", + " if not self.keep_accents:\n", + " outputs = unicodedata.normalize('NFKD', outputs)\n", + " outputs = \"\".join([c for c in outputs if not unicodedata.combining(c)])\n", + " if self.do_lower_case:\n", + " outputs = outputs.lower()\n", + "\n", + " return outputs\n", + "\n", + " def _tokenize(self, text, return_unicode=True, sample=False):\n", + " \"\"\" Tokenize a string. \"\"\"\n", + " text = self.preprocess_text(text)\n", + "\n", + " if not sample:\n", + " pieces = self.sp_model.EncodeAsPieces(text)\n", + " else:\n", + " pieces = self.sp_model.SampleEncodeAsPieces(text, 64, 0.1)\n", + " new_pieces = []\n", + " for piece in pieces:\n", + " if len(piece) > 1 and piece[-1] == str(\",\") and piece[-2].isdigit():\n", + " cur_pieces = self.sp_model.EncodeAsPieces(piece[:-1].replace(SPIECE_UNDERLINE, \"\"))\n", + " if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE:\n", + " if len(cur_pieces[0]) == 1:\n", + " cur_pieces = cur_pieces[1:]\n", + " else:\n", + " cur_pieces[0] = cur_pieces[0][1:]\n", + " cur_pieces.append(piece[-1])\n", + " new_pieces.extend(cur_pieces)\n", + " else:\n", + " new_pieces.append(piece)\n", + "\n", + " return new_pieces\n", + "\n", + " def _convert_token_to_id(self, token):\n", + " \"\"\" 어휘를 사용하여 아이디의 토큰(문자열/유니코드)을 변환함 \"\"\"\n", + " return self.token2idx.get(token, self.token2idx[self.unk_token])\n", + "\n", + " def _convert_id_to_token(self, index, return_unicode=True):\n", + " \"\"\"어휘를 사용하여 인덱스(정수)를 토큰(문자열/유니코드)으로 변환함\"\"\"\n", + " return self.idx2token[index]\n", + "\n", + " def convert_tokens_to_string(self, tokens):\n", + " \"\"\"토큰 시퀀스(하위 단어의 문자열)를 단일 문자열로 변환함\"\"\"\n", + " out_string = \"\".join(tokens).replace(SPIECE_UNDERLINE, \" \").strip()\n", + " return out_string\n", + "\n", + " def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None):\n", + " \"\"\"\n", + " 특수 토큰을 연결하고 추가하여 시퀀스 또는 시퀀스 쌍에서 시퀀스 분류 작업을 위한 모델 입력을 구축함.\n", + " RoBERTa 시퀀스의 형식은 다음과 같다:\n", + " single sequence: [CLS] X [SEP]\n", + " pair of sequences: [CLS] A [SEP] B [SEP]\n", + " \"\"\"\n", + " if token_ids_1 is None:\n", + " return [self.cls_token_id] + token_ids_0 + [self.sep_token_id]\n", + " cls = [self.cls_token_id]\n", + " sep = [self.sep_token_id]\n", + " return cls + token_ids_0 + sep + token_ids_1 + sep\n", + "\n", + " def get_special_tokens_mask(self, token_ids_0, token_ids_1=None, already_has_special_tokens=False):\n", + " \"\"\"\n", + " 특수 토큰이 추가되지 않은 토큰 목록에서 시퀀스 ID를 검색함.\n", + " 이 메서드는 토큰화기 ``prepare_for_model`` 또는 ``encode_plus`` 메서드를 사용하여 특수 토큰을 추가할 때 호출됨.\n", + " Args:\n", + " token_ids_0: ID 목록(특수 토큰을 포함하지 않아야 함)\n", + " token_ids_1: 시퀀스 쌍에 대한 시퀀스 ID를 가져올 때 필요한 선택적 ID 목록(특수 토큰을 포함하지 않아야 함)\n", + " already_has_special_tokens: (default False) 토큰 목록이 모델에 대한 특수 토큰으로 이미 형식화되어 있으면 True로 설정\n", + " Returns:\n", + " [0, 1] 범위의 정수 목록: 특수 토큰은 0, 시퀀스 토큰은 1\n", + " \"\"\"\n", + "\n", + " if already_has_special_tokens:\n", + " if token_ids_1 is not None:\n", + " raise ValueError(\n", + " \"You should not supply a second sequence if the provided sequence of \"\n", + " \"ids is already formated with special tokens for the model.\"\n", + " )\n", + " return list(map(lambda x: 1 if x in [self.sep_token_id, self.cls_token_id] else 0, token_ids_0))\n", + "\n", + " if token_ids_1 is not None:\n", + " return [1] + ([0] * len(token_ids_0)) + [1] + ([0] * len(token_ids_1)) + [1]\n", + " return [1] + ([0] * len(token_ids_0)) + [1]\n", + "\n", + " def create_token_type_ids_from_sequences(self, token_ids_0, token_ids_1=None):\n", + " \"\"\"\n", + " 전달된 두 시퀀스로부터 시퀀스 쌍 분류 작업에 사용할 마스크를 만듦.\n", + " BERT 시퀀스 쌍 마스크의 형식은 다음과 같음:\n", + " 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1\n", + " | first sequence | second sequence\n", + " token_ids_1이 None이면 마스크의 첫 번째 부분(0)만 반환함\n", + " \"\"\"\n", + " sep = [self.sep_token_id]\n", + " cls = [self.cls_token_id]\n", + " if token_ids_1 is None:\n", + " return len(cls + token_ids_0 + sep) * [0]\n", + " return len(cls + token_ids_0 + sep) * [0] + len(token_ids_1 + sep) * [1]\n", + "\n", + " def save_vocabulary(self, save_directory):\n", + " \"\"\" 문장 조각 어휘(원본 파일 복사)와 특수 토큰 파일을 디렉토리에 저장\"\"\"\n", + " if not os.path.isdir(save_directory):\n", + " logger.error(\"Vocabulary path ({}) should be a directory\".format(save_directory))\n", + " return\n", + "\n", + " # 1. Save sentencepiece model\n", + " out_vocab_model = os.path.join(save_directory, VOCAB_FILES_NAMES[\"vocab_file\"])\n", + "\n", + " if os.path.abspath(self.vocab_file) != os.path.abspath(out_vocab_model):\n", + " copyfile(self.vocab_file, out_vocab_model)\n", + "\n", + " # 2. Save vocab.txt\n", + " index = 0\n", + " out_vocab_txt = os.path.join(save_directory, VOCAB_FILES_NAMES[\"vocab_txt\"])\n", + " with open(out_vocab_txt, \"w\", encoding=\"utf-8\") as writer:\n", + " for token, token_index in sorted(self.token2idx.items(), key=lambda kv: kv[1]):\n", + " if index != token_index:\n", + " logger.warning(\n", + " \"{}에 어휘 저장:어휘 인덱스가 연속적이지 않음.\"\n", + " \" 어휘가 손상되지 않았는지 확인하세요!\".format(out_vocab_txt)\n", + " )\n", + " index = token_index\n", + " writer.write(token + \"\\n\")\n", + " index += 1\n", + "\n", + " return out_vocab_model, out_vocab_txt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac556bf5", + "metadata": { + "code_folding": [ + 0, + 17, + 69 + ], + "hidden": true, + "id": "ac556bf5" + }, + "outputs": [], + "source": [ + "#bert_tokenizer는 preprocessing_train() 및 preprocessing_test() 함수에서 각 문장을 토큰화 및 인코딩하는 데 사용됨.\n", + "#이 함수는 문장, MAX_LEN 매개변수, 토큰화 객체를 입력으로 받아 input_ids, attention_mask, token_type_ids 텐서를 반환함\n", + "def bert_tokenizer(sent, MAX_LEN, tokenizer):\n", + "\n", + " encoded_dict=tokenizer.encode_plus(\n", + " text = sent,\n", + " add_special_tokens=True,\n", + " max_length=MAX_LEN,\n", + " pad_to_max_length=True,\n", + " return_attention_mask=True,\n", + " truncation = True)\n", + "\n", + " input_id=encoded_dict['input_ids']\n", + " attention_mask=encoded_dict['attention_mask']\n", + " #token_type_id = encoded_dict['token_type_ids']\n", + " token_type_id = 0\n", + "\n", + " return input_id, attention_mask, token_type_id\n", + "#텍스트 분류 작업을 위해서, 각각 훈련데이터와 테스트 데이터의 전처리 단계를 수행하는\n", + "#preprocessing_train() 및 preprocessing_test()의 두 가지 함수를 정의\n", + "\n", + "'''\n", + "이 함수들은 BERT 기반 토큰화기를 사용하여 입력 텍스트를 토큰화하고\n", + "토큰을 BERT 기반 모델을 미세 조정하는 데 필요한 입력인 input_ids, attention_masks, token_type_ids로 인코딩함\n", + "\n", + "인코딩된 입력은 훈련 세트의 경우 train_data, 테스트 세트의 경우 test_data라는 딕셔너리에 저장된 다음 피클 파일 형식으로 디스크에 저장됨\n", + "파일 저장 경로는 사전 학습된 모델 이름 또는 디렉터리인 args.pt 매개변수를 기반으로 함.\n", + "'''\n", + "def preprocessing_train():\n", + "\n", + " pt = args.pt#'monologg/kobert'\n", + "\n", + " if 'kobert' in pt:\n", + " tokenizer = KoBertTokenizer.from_pretrained(pt, cache_dir='bert_ckpt', do_lower_case=False) #do_lower_case : 모든 문자를 소문자로 변환할지 여부설정\n", + " print('load kobert')\n", + " else:\n", + " tokenizer = AutoTokenizer.from_pretrained(args.pt)\n", + "\n", + " MAX_LEN = args.max_len\n", + " #MAX_LEN 매개변수는 입력 시퀀스의 최대 길이를 지정하며, 토큰화기는 이 길이에 맞게 시퀀스를 자르거나 패딩\n", + " train = pd.read_csv('./train_data.csv')\n", + " train=train[['title','topic_idx']]\n", + "\n", + " input_ids =[]\n", + " attention_masks =[]\n", + " token_type_ids =[]\n", + " train_data_labels = []\n", + "\n", + " for train_sent, train_label in tqdm.tqdm(zip(train['title'], train['topic_idx'])):\n", + " try:\n", + " input_id, attention_mask,_ = bert_tokenizer(train_sent, MAX_LEN=MAX_LEN, tokenizer=tokenizer)\n", + "\n", + " input_ids.append(input_id)\n", + " attention_masks.append(attention_mask)\n", + " token_type_ids.append(0)\n", + " #########################################\n", + " train_data_labels.append(train_label)\n", + "\n", + " except Exception as e:\n", + " print(e)\n", + " pass\n", + "\n", + " train_input_ids=np.array(input_ids, dtype=int)\n", + " train_attention_masks=np.array(attention_masks, dtype=int)\n", + " train_token_type_ids=np.array(token_type_ids, dtype=int)\n", + " ###########################################################\n", + " train_inputs=(train_input_ids, train_attention_masks, train_token_type_ids)\n", + " train_labels=np.asarray(train_data_labels, dtype=np.int32)\n", + "\n", + " # save\n", + " train_data = {}\n", + "\n", + " train_data['input_ids'] = train_input_ids\n", + " train_data['attention_mask'] = train_attention_masks\n", + " train_data['token_type_ids'] = train_token_type_ids\n", + " train_data['targets'] = np.asarray(train_data_labels, dtype=np.int32)\n", + "\n", + " os.makedirs(f'./data/{pt}/', exist_ok=True)\n", + " with open(f'./data/{pt}/train_data_{MAX_LEN}.pickle', 'wb') as f:\n", + " pickle.dump(train_data, f, pickle.HIGHEST_PROTOCOL)\n", + "\n", + "def preprocessing_test():\n", + "\n", + " pt = args.pt\n", + " if 'kobert' in pt:\n", + " tokenizer = KoBertTokenizer.from_pretrained(pt, cache_dir='bert_ckpt', do_lower_case=False)\n", + " print('load kobert')\n", + " else:\n", + " tokenizer = AutoTokenizer.from_pretrained(args.pt)\n", + " MAX_LEN = args.max_len\n", + "\n", + " test = pd.read_csv('./test_data.csv')\n", + " test=test[['title']]\n", + "\n", + " input_ids =[]\n", + " attention_masks =[]\n", + " token_type_ids =[]\n", + "\n", + " for test_sent in tqdm.tqdm(test['title']):\n", + " try:\n", + " input_id, attention_mask,_ = bert_tokenizer(test_sent, MAX_LEN=MAX_LEN, tokenizer=tokenizer)\n", + "\n", + " input_ids.append(input_id)\n", + " attention_masks.append(attention_mask)\n", + " token_type_ids.append(0)\n", + " #########################################\n", + "\n", + " except Exception as e:\n", + " print(e)\n", + " pass\n", + "\n", + " test_input_ids=np.array(input_ids, dtype=int)\n", + " test_attention_masks=np.array(attention_masks, dtype=int)\n", + " test_token_type_ids=np.array(token_type_ids, dtype=int)\n", + " ###########################################################\n", + " test_inputs=(test_input_ids, test_attention_masks, test_token_type_ids)\n", + "\n", + "\n", + " # save\n", + " test_data = {}\n", + "\n", + " test_data['input_ids'] = test_input_ids\n", + " test_data['attention_mask'] = test_attention_masks\n", + " test_data['token_type_ids'] = test_token_type_ids\n", + "\n", + " os.makedirs(f'./data/{pt}/', exist_ok=True)\n", + " with open(f'./data/{pt}/test_data_{MAX_LEN}.pickle', 'wb') as f:\n", + " pickle.dump(test_data, f, pickle.HIGHEST_PROTOCOL)\n", + "" + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install sentencepiece # spm은 KoBertTokenizer class의 일부이고, args.pt 변수 값에 따라 다른 토크나이저가 선택됨.\n", + "#오류 메세지가 떴을 때는 KoBertTokenizer 대신에 BertTokenizer가 선택되어 있는데, 이는 KoBertTokenizer가 의존하는 SentencePiece 패키지가 안 설치 되어 있기 때문임" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_0Ac6tbGqSDM", + "outputId": "3492264b-a91f-4f31-930a-66e4c88d137d" + }, + "id": "_0Ac6tbGqSDM", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting sentencepiece\n", + " Downloading sentencepiece-0.1.97-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m40.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: sentencepiece\n", + "Successfully installed sentencepiece-0.1.97\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "#마운트 시키고 cd 명령어 사용 -> 근데 이 마운크를 굳이 코드로 안 해도 되는 거였음... 방식 알려주기\n", + "from google.colab import drive\n", + "drive.mount('/content/drive')\n", + "%cd /content/drive/My Drive/4J" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "41AJ0YEpqvPK", + "outputId": "effd56c4-b852-4631-9f47-1c75510df57c" + }, + "id": "41AJ0YEpqvPK", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/drive\n", + "/content/drive/My Drive/4J\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd7db76a", + "metadata": { + "hidden": true, + "colab": { + "base_uri": "https://localhost:8080/", + "referenced_widgets": [ + "265d58264cb44d71b8af68940bf31e56", + "28d3b20cb6ea4f4c9c72c10072d246e8", + "1d18879aaf8943b09503d61e78773f37", + "8c609b8177e44af89f7e35f2879721c9", + "f707fba56e7141d78891d53ee74a259e", + "bb841ec0e55a45b9bfe5179d764cc05d", + "5916603561134a779856a7366679e448", + "3646753908c740649027e069cd8de136", + "620fe7178e6c46b6b7486bebdbc62aa8", + "554b2ff17b82433d898fefc6fd6f1888", + "50f71915c0934804a05a1fa20c7c16d4", + "e19099aad499415bb2460740c0618632", + "592e02aac4834d488a86abf0ac9de161", + "bdf5b15134fe49959fc6ae43245ac9da", + "f11334304f5f47ef864576420c7773f4", + "309130246636451fb0c8d260eba51362", + "1708a31d597b467a82f624a4b7413eff", + "284d8a5b895b4fbd936b99752a774972", + "b6fd5128436741c98da9dca9ffa206be", + "9508da1c1a034d32a54184848f623cd6", + "e79e6a5f223e4628be73c0a8958a614c", + "c018678480b94f9185d5171ecaebb83c", + "b6200a2256da485183c393bbc798e61b", + "bdd16c6c006d4caabc73c9d2281d2e3f", + "6a54274d88994f82a841cfdd6d64b2ae", + "23022de1e9744471b3698d963e03774c", + "b16247821a1949688f4cc9036eca0d80", + "9dd713a34e7b42e695a80dfb274accee", + "e544c367b1e147ccbf5034b4c3e8bb44", + "681379aa4c9440e1b52717aa2152c43e", + "bd1c303bbfc34155964705b4809c980a", + "fc13c5b3a69b40079832122954285ee1", + "9409bae71a19445aabe5128050d515e2", + "f413126d65144f74835cdc7c8f8066fd", + "a13e738d23e847a4ac024eb33c861dbd", + "8c03dc9206c246fb8097db0ca231d6db", + "37797bfaa693445cabf39a89898eb6b5", + "72809d66d0854c0baa67125a312c204b", + "06ce2be29b574129901e3c574b05f2d4", + "cc59c893ed454c51a92b72b4a1f3e5c3", + "265faaf2dd234ca1b2b564e4c05ccd12", + "5e8a24d5528f405d8ec9c3bc3076a82f", + "3b3f48432b2a44f7b5399f13a7f3f9e5", + "766eb8e5e64c43da842b82b728de8315", + "66656f6cd75a4752b2ab42aba9630cb2", + "77b092f984124ef3b20e949e794759db", + "64ea592689824dd99c2206be5b973f24", + "b907ffa02f0a48dc861a01a3590b9ddc", + "017c025167734aa986a4225493d6b892", + "f829b7b1bee8490e8e541bb85b33b046", + "03ca09bcc5ef42bbbf3fbd79f9a1b75e", + "9ec6996bc36b4aae9614c09c471977a3", + "afcc94d046194196a1445c4a9a5a10ca", + "de10e0bca4f64a29b0f97a47769056fc", + "8de79158d5fc4e7798e6ec17a0cb8359", + "8f79c3be45234bd6b82be1fcf535b56a", + "34ed45155a0c406ab3eeb358ffa1f23d", + "9ef7f690f9394e0e871cbeb3a4f9c074", + "18101aa88c124c91a6f91cc00183c140", + "4dbc376168444a1892e6565048dbbee8", + "8fc34bda9bc2434f86434bfc996003d0", + "ef7fa97a2caa4be2856c9b1c799e0e01", + "6ef574e796474fd9b816adfdf2996e69", + "e7afa624c3b448abb9d97dcc19bd79bc", + "e8ee348b8a1641638a7896b0a7826941", + "f1375674453847fb9beb80694d5053b5", + "4577e5b3ae014e78a9df350a272ea0c8", + "e97b6d15983d444cb9b0d9c106a98fe7", + "62ca38c626d94edda3440566412b8c6b", + "8f7ab930d07443529e0540155e2a186b", + "8980fbe163c44cf48bf452364a1f5012", + "8b73e58bb16b494982366382dd47ba5e", + "96bf1f55d9474b62ba634fe04db459c3", + "ccd9a614a299432bbe24b667f27f9079", + "90b4a14f201d4681b53dc85911eae8cd", + "e52278d4919048e8895035bab37bdc40", + "6b41100258e64ea19c614133aa6c8d00", + "0088a0b55b49413bb142546deec7a230", + "eb9d9f98cad241ad81a1f54c769cd1bd", + "cb37af934f734aea9b7cfcaecb2d7f08", + "8564f07f1a814676be264bbde286da82", + "4604dfa3b73444d388ba16a9ef55ac78", + "42d6092eed3d418fa2d8ac12dafcb2bd", + "53f953c1cd2f4924a055409227dc3e7a", + "caa145c4ec574bd1aae875bf19a680f3", + "6f50fce310c143af967cd6bf74c7bb49", + "c0393d413ebb45489d1e20b45b150f6f", + "80925dfdc6af4bb08ce1d8b3b1afacf7", + "e58cac3a40634e6d81d55477df36de85", + "9cf89a3e788c487ab4f53292763f1dc8", + "bf512cc764e14c9596bebe8d02cb0786", + "b04082a3db8a474b825c965d531c0954", + "0df5705875c6427ab4423a14acee87ef", + "04ed1e744cb44d2ebb61eaa0584b5298", + "80069a4370cb401c80121dba364391aa", + "74fe7e6409c049cdb18ca24fe9f1d621", + "2d387d8f89264abfb93eb014db2f191a", + "40fedaebe5cd485284d654117a5294da", + "8663e0e8ca694482bd6b09a5428ad728", + "b0bc95f5472e4531b29fe33b09a4d36c", + "720c88fe32da498d94f05551b7da1cac", + "ef804c95503541a9b39ac3a8511e7e85", + "c888c88074ab4fd48b68a3aee8e9fd22", + "e0173bd95c4941c1a77760e6a0a4ca54", + "14ccf32079a142f89dc1c98437c7c171", + "1020f0d261ac4b67bf013339849de275", + "a8df45aea3864ee685d5e7a2bc90089c", + "33753b59355e449c9fb0309e63b31b0f", + "44caee2e2d814520b728f415225590fd", + "d1866ceaf58a469d8bfaa43b768a365a", + "8288953050cf4a87b3db5d8fdbe67d9b", + "d73fc41b72de468196d84f3c8b3c0200", + "b41543c9d8c649ee9f64e50b11c6ae14", + "b1ae87f9375b4132897fc7b837b28fbd", + "a6bd3e27f5cd4453957abe5a590b16cf", + "960cc22366f2464388d255a6486bd10e", + "7838f14b7ba64452a397a05f556f25f5", + "b0df16ca17be4620b30338a178986a9b", + "0257b66188b647ac9e2dc410a2886bca", + "4ab6e6f31da645c5907a6bba7fb1123b", + "539c83d11d744635a73458baec674794", + "2a4b8cabad1c4bf29dfc11380b298dd0", + "d7ab63d9b3544825b2dd9ca4e9da8bc4", + "53ffd0362e3541c5b37ed678c52de9bb", + "1ee0027d989e4ac79b5bcb58be4a6861", + "385d38c30b0b43eca6e9087c8f940957", + "c048e4fb18ea4a5eb6b9ffaf15e41ac0", + "6e4271d504e0489ebef9922e4c17469f", + "b1fad86df4454c9d99b808166cfdf279", + "5ad0767da8db47f7b9badf288ac734f9", + "4b05bc71e79c4a39a0df48db1c81080a", + "f80feafed211460f91fa43ca7e875190", + "6e85f86433f74ae88bb45a17a51c69b5", + "711fed0039c04bb0a727d8153a7f67a4", + "733626879544456cbc72fd6dc9f8d856", + "a203e8286e094b2e89e1d35877999f75", + "4f05871c1a424f929a349d48c9c51bd4", + "b1c758d8f64045ec89f2ec64028b7a7f", + "00680b63bf464d17a6dd6a3077fb986f", + "570b8de9ad53403f805c559e4f9592bc", + "75fc6ac62ebf4477a1873e74b72591a1", + "8ab3f4504d9b45ada6f4c192092d969d", + "b20c18308e914f50bc6f27da41a5fc10", + "65d914265588433589ab59433a9f37f1", + "281efada42e34f0cbdb256e07b5cf3eb", + "294f93e6bebc4dbdad817f901574944f", + "fba61f3da3ea4cfcb57175fd35bd8ef5", + "40021a9175da4e528babf528edd41f14", + "0eb4f7c4b5904be48c69cf3ac4c1122c", + "00410518ae984713b0f2c9540bdd2789", + "b3c662c827c64b09849acd63838583f8", + "e7698d59fd404a4785b5cd616703b968", + "f1c6d510bfa140c48159b839e8673ea5", + "149bb646b6fb46138fc60c9c041f872f", + "a9d9485a697642089f3d8ca18301b8a3", + "9a68253e718a496096b1ff68488f1e5c", + "9c1c3f3918ae4c6fad369a507f7263ed", + "6db1f76443374653b9f07c7fa97c2541", + "8fd5173aa11c43e1a43550c31ef6115e", + "a2bba57856554a7b9d27cffc0be0d8cb", + "d831d42338754b2fb27410f1b68c4bef", + "a4efeb8660214bd08f8b56880a9d7366", + "e0eff06d626b4d45acba52aa4a888e34", + "dfe44a5da1484f83a11e0b2c649671a7", + "21bf9ae5622241e38969c57b1d638a09", + "8b7c743043ec4c208efcb10777ca8d7b", + "fd765d0dbfe541cb9507b0b079c967c4", + "2bf17eee97e9415b91bf4f65ff96ebe0", + "46ac8b7079c544098fa4724dc74532ba", + "b5affe7fde7149298cbffbbc8ba74c1b", + "79e101bb06b040ee879d39335a3dad46", + "f49037c4d405436584f573e226214e14", + "fbce263c1b0c4096bade0a8c2c365fc9", + "6e8b1f658adb4cfd8c44d1e1f7654f21", + "f5fc3218202244179ec7d005bc4b079b", + "a127875ffe704645bfabfb6303c498c9", + "9e4ff39cf7eb4cf8afc22d53a2f30f01", + "943bf4dd97ee4766a1e97572bceeb408", + "35d501bb7f104d5a96dc4697b7964fcc", + "c9f41bef5b1d4d6a83e895fbf27c297f", + "2c4de5c9b6ab4eae94792d896ccc1e64", + "6b112b5d8c8b45e5abf49d8003f2844e", + "24183aecc7604328a686246ad722561b", + "4b53c4d8c3054a7fa22e0c8c414c282b", + "ae84b73ce2db42ca92c5d47010226088", + "0893ae402bc540d2ad22edaf02281d15", + "e662dcebe976458f9e82d9283e5a6bf8", + "72bb231a18cd420b98d68ff20c6e9ba3", + "e5deaa84a9b54853a608c6ef84785695", + "7a7da9562c06465f84c7c13e989c4567", + "9f382345dca24290a4b30ccf7725ae4a", + "f404624183054a4da60b875fa2cd11e4", + "e16f0923b5214cffa01b4abe44207f01", + "b38a270cb89b4bf9a0bbe6431285184d", + "e080c28dad4d4d81ac57b91a465e33e1", + "c87f2163fa1e45218bf4f0c16cc131b6", + "e7c84a7f482449efa673cbaa1827fc59", + "7887928960044ffca14abe437467c206", + "8e3cfc5e197e451fa3aa9d231dda52a1", + "7f043eae39594350bfa59c71ff90430e", + "9eb7d4cc7817421e970617eef8538652", + "37d11178fcc1451191a2e8d41130746e", + "618d8b9d899540429bafb1bbc5750e76", + "6948e1f520cd486fa4a72214e1e07093", + "6822647c69784bc988a3e8354457219c", + "3b5ca4c4e8f54a28a762b7cc9af2adb0", + "e58e9e2839cf4572abd06e1e96ae55bd", + "dd375cd60ac54434b3ef78f4fd15c437", + "19b20f738e03483ba062ff4a3cb3b578", + "ce3a3b4238344f8c8898ce22a13bcddc", + "53a37b6c7dbf43cdb0b426a209bc9a7d", + "d4ecf0ec7dab46a2925a31261d830444", + "636206c306b24596b7caf1980be4ec47", + "b503f438dcc94a2c8e4feb11bdec53be", + "0d6a1d5e3a3c43b4aad257b0c2df3114", + "36cde43ac29244569819ce5d2a2fa955", + "900a95dc077c4d64a19383c8553721c1", + "9a6a9bffd81f44ce932460f13e303ad4", + "d44e289145ec42aca4e376d8cf5e6e8a", + "73e79d9e0abe4dc2ad638ef0aeaec68b", + "2622a3c4f8814c6a899982788435f702", + "62f2fa1b9d7b449089de00623bb20a68", + "748890444a154ef6a49698394c810f3c", + "d0b9b80d61b84529b2e3b14f06d082b9", + "a08eeaeb49c54da5bcec3e369be00151", + "a09cf480023349c9bec9daddade90e91", + "447f80b186ed41d3a405b58494d3e410", + "debe3dda1c824088848d526d0d840e13", + "d535c1fc215a4e658fb4f485e87e3e46", + "ce087aafeb084c37b1f2097cb041bfef", + "3969d441f073405985cd0a1eadc92154", + "825255d506e749789af57bb5587b026b", + "3fa6946a123f43f7ab05acb3ab7aeb14", + "449d2a6116204739bd9d2ad32f976085", + "054fe8d86d344304994d8ce70e0be7ac", + "c476cba899184c5c8885029d1a4f218a", + "9a078879844a4ef68226978173aa274e", + "159607b8f0c1484da356a1b4faf5ada3", + "ab5e5becdddb4cb8aa4a68ce5ff6d085", + "b1e10471c905486e83fac3e1739a818e", + "26e0ea94e7374a6eb1797de01b43c291", + "c75797202f8d461da2ad22934b430718", + "70dea0d82f05461cabe81830551c22da", + "fd3dbe48d23f4aeca586d6dc24c94eaf", + "bb961ba002ca446ba937c05c26bc677c", + "b9f919a089054ab2a7faaf70cfab4baf", + "3a89823e13c342028df88106c5b803e4", + "e51ecaad661a4634acbeb84e3dba0b7c", + "d102602e099342ada758779502f153ed", + "c8bc0f0f53de4364a6348ce583b9c73e", + "a0e199e803a94361b63bc2e4d26515c2", + "2afdfd4753dd45af95153ef1bedb7f5a", + "9aac61202ab34d8086d458f30e3c8ef4" + ], + "height": 1000 + }, + "id": "fd7db76a", + "outputId": "66c5c808-b578-4d40-8f7f-0f563649f53c" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (…)zer_78b3253a26.model: 0%| | 0.00/371k [00:001:\n", + " net = nn.DataParallel(net)\n", + "\n", + " # ------------------------\n", + " # loss\n", + " # ------------------------\n", + " loss_fn = nn.CrossEntropyLoss()\n", + "\n", + " # ------------------------\n", + " # Optimizer\n", + " # ------------------------\n", + " optimizer = optim.Lookahead(optim.RAdam(filter(lambda p: p.requires_grad,net.parameters()), lr=args.start_lr), alpha=0.5, k=5)\n", + "\n", + " scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 0, num_training_steps = len(trainloader)*args.epochs)\n", + "\n", + "\n", + " # ----\n", + " start_timer = timer()\n", + " best_score = 0\n", + "\n", + " for epoch in range(1, args.epochs+1):\n", + " train_loss = 0\n", + " valid_loss = 0\n", + "\n", + " target_lst = []\n", + " pred_lst = []\n", + " lr = get_learning_rate(optimizer)\n", + " print(f'-------------------')\n", + " print(f'{epoch}epoch start')\n", + " print(f'-------------------'+'\\n')\n", + " print(f'learning rate : {lr : .6f}')\n", + " for t, data in enumerate(tqdm.tqdm(trainloader)):\n", + "\n", + " # one iteration update -------------\n", + " ids = data['ids'].to(device)\n", + " mask = data['mask'].to(device)\n", + " tokentype = data['token_type_ids'].to(device)\n", + " target = data['targets'].to(device)\n", + "\n", + " # ------------\n", + " net.train()\n", + " optimizer.zero_grad()\n", + "\n", + "\n", + " if args.amp:\n", + " with amp.autocast():\n", + " # output\n", + " output = net(ids, mask)\n", + " output = output[0]\n", + "\n", + " # loss\n", + " loss = loss_fn(output, target)\n", + " train_loss += loss\n", + "\n", + "\n", + " scaler.scale(loss).backward()\n", + " scaler.step(optimizer)\n", + " scaler.update()\n", + "\n", + " else:\n", + " # output\n", + " output = net(ids, mask)\n", + "\n", + " # loss\n", + " loss = loss_fn(output, target)\n", + " train_loss += loss\n", + "\n", + " # update\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + "\n", + " # for calculate f1 score\n", + " target_lst.extend(target.detach().cpu().numpy())\n", + " pred_lst.extend(output.argmax(dim=1).tolist())\n", + "\n", + "\n", + " if scheduler is not None:\n", + " scheduler.step()\n", + " train_loss = train_loss / len(trainloader)\n", + " train_score = f1_score(y_true=target_lst, y_pred=pred_lst, average='macro')\n", + " train_acc = accuracy_score(y_true=target_lst, y_pred=pred_lst)\n", + "\n", + " # validation\n", + " valid_loss, valid_score, valid_acc, _ = do_valid(net, validloader)\n", + "\n", + "\n", + " if valid_acc > best_score:\n", + " best_score = valid_acc\n", + " best_epoch = epoch\n", + " best_loss = valid_loss\n", + "\n", + " torch.save(net.state_dict(), out_dir + f'/{folds}f_{epoch}e_{best_score:.4f}_s.pth')\n", + " print('best model saved'+'\\n')\n", + "\n", + "\n", + " print(f'train loss : {train_loss:.4f}, train f1 score : {train_score : .4f}, train acc : {train_acc : .4f}'+'\\n')\n", + " print(f'valid loss : {valid_loss:.4f}, valid f1 score : {valid_score : .4f}, valid acc : {valid_acc : .4f}'+'\\n')\n", + "\n", + "\n", + " print(f'best valid loss : {best_loss : .4f}'+'\\n')\n", + " print(f'best epoch : {best_epoch }'+'\\n')\n", + " print(f'best accuracy : {best_score : .4f}'+'\\n')\n", + "\n", + "def run_predict(model_path):\n", + " ## dataset ------------------------------------\n", + " # load\n", + " with open(f'./data/{args.pt}/test_data_{args.max_len}.pickle', 'rb') as f:\n", + " test_dict = pickle.load(f)\n", + "\n", + " print('test load')\n", + " test_dataset = KobertDataSet(data = test_dict, test=True)\n", + " testloader = DataLoader(dataset=test_dataset, batch_size=args.batch_size,\n", + " num_workers=8, shuffle=False, pin_memory=True)\n", + " print('set testloader')\n", + " ## net ----------------------------------------\n", + " scaler = amp.GradScaler()\n", + " if 'xlm-roberta' in args.pt:\n", + " net = XLMRobertaForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + "\n", + " elif 'klue/roberta' in args.pt:\n", + " net = RobertaForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + " else:\n", + " net = BertForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + "\n", + " net.to(device)\n", + "\n", + " if len(args.gpu)>1:\n", + " net = nn.DataParallel(net)\n", + "\n", + " f = torch.load(model_path)\n", + " net.load_state_dict(f, strict=True) # True\n", + " print('load saved models')\n", + " # ------------------------\n", + " # validation\n", + " preds, logit = do_predict(net, testloader) #outputs\n", + "\n", + " print('complete predict')\n", + "\n", + " return preds, np.array(logit)\n", + "# 예측된 레이블과 로그는 각각 pred_lst 및 logit 목록에 저장\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa4fb075", + "metadata": { + "id": "aa4fb075", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 247 + }, + "outputId": "c46734a8-ee54-4c76-a974-059ffa01324b" + }, + "outputs": [ + { + "output_type": "error", + "ename": "NameError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m 'bert-base-multilingual-uncased', 'klue/roberta-large'],[33,33,33,33,33,33,28]):\n\u001b[1;32m 7\u001b[0m \u001b[0;31m#일부 매개변수(args.max_len, args.pt, args.exp_name)를 정의한 다음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_len\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax_len\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'_'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_len\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'args' is not defined" + ] + } + ], + "source": [ + "\"\"\"5fold 전용\"\"\"\n", + "if __name__ == '__main__':\n", + " #스크립트를 모듈로 가져오는 것이 아니라 직접 실행할 때만 실행해야 하는 코드를 지정할 수 있는 Python 코드의 일반적인 패턴\n", + "\n", + " for pt, max_len in zip(['monologg/kobert','klue/roberta-base','klue/roberta-small','klue/roberta-large','xlm-roberta-large',\n", + " 'bert-base-multilingual-uncased', 'klue/roberta-large'],[33,33,33,33,33,33,28]):\n", + " #일부 매개변수(args.max_len, args.pt, args.exp_name)를 정의한 다음\n", + " args.max_len = max_len\n", + " args.pt = pt\n", + " args.exp_name = str(args.pt) + '_' + str(args.max_len)\n", + " #교차 유효성 검사의 5배수에 걸쳐 pt와 max_len의 각 조합에 대해 run_train 함수를 호출\n", + " for i in [0,1,2,3,4]: # 5fold\n", + " run_train(folds=i)\n", + " #5 교차 유효성 검사를 사용해 다양한 최대 시퀀스 길이(max_len)을 가진 사전 학습 언어 모델(pt)에 학습 스크립트를 실행하는 루프" + ] + }, + { + "cell_type": "markdown", + "id": "63f1e8a2", + "metadata": { + "id": "63f1e8a2" + }, + "source": [ + "# ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efa34f47", + "metadata": { + "code_folding": [ + 0 + ], + "id": "efa34f47" + }, + "outputs": [], + "source": [ + "#여러 transformer 모델을 앙상블시킴\n", + "def ensemble():\n", + " final_logit=0 #final_logit 변수를 0으로 초기화한 다음 각 모델에서 예측 로그를 추가함.\n", + " #각 모델은 예측된 레이블과 예측 로그를 반환하는 run_predict() 함수를 사용해 호출됨\n", + " args.max_len=33\n", + " args.pt = 'monologg/kobert'\n", + " _, logit1 = run_predict(\"./saved_models/fold3/kobert/0f_9e_0.8895_s.pth\")\n", + " _, logit2 = run_predict(\"./saved_models/fold3/kobert/1f_10e_0.8823_s.pth\")\n", + " _, logit3 = run_predict(\"./saved_models/fold3/kobert/2f_8e_0.8888_s.pth\")\n", + " _, logit4 = run_predict(\"./saved_models/fold3/kobert/3f_10e_0.8897_s.pth\")\n", + " _, logit5 = run_predict(\"./saved_models/fold3/kobert/4f_8e_0.8867_s.pth\")\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #여기선 레이블은 안 쓰고 logit만 사용\n", + " #예측 로짓의 평균을 취해 final_logit에 추가함\n", + " #####################\n", + "\n", + " args.pt = 'klue/roberta-base'\n", + " _, logit1 = run_predict(\"./saved_models/fold3/roberta-base/0f_5e_0.8920_s.pth\")\n", + " _, logit2 = run_predict(\"./saved_models/fold3/roberta-base/1f_4e_0.8879_s.pth\")\n", + " _, logit3 = run_predict(\"./saved_models/fold3/roberta-base/2f_5e_0.8889_s.pth\")\n", + " _, logit4 = run_predict(\"./saved_models/fold3/roberta-base/3f_4e_0.8951_s.pth\")\n", + " _, logit5 = run_predict(\"./saved_models/fold3/roberta-base/4f_4e_0.8887_s.pth\")\n", + "\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + "\n", + " #####################\n", + " args.pt = 'klue/roberta-small'\n", + " preds1, logit1 = run_predict(\"./saved_models/fold3/roberta-small/0f_8e_0.8900_s.pth\")\n", + " preds2, logit2 = run_predict(\"./saved_models/fold3/roberta-small/1f_9e_0.8813_s.pth\")\n", + " preds3, logit3 = run_predict(\"./saved_models/fold3/roberta-small/2f_7e_0.8884_s.pth\")\n", + " preds4, logit4 = run_predict(\"./saved_models/fold3/roberta-small/3f_3e_0.8958_s.pth\")\n", + " preds5, logit5 = run_predict(\"./saved_models/fold3/roberta-small/4f_4e_0.8881_s.pth\") # 8884 가능\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #####################\n", + "\n", + " args.pt = 'bert-base-multilingual-uncased'\n", + " preds1, logit1 = run_predict(\"./saved_models/fold3/bert-base-multilingual-uncased/0f_5e_0.8624_s.pth\")\n", + " preds2, logit2 = run_predict(\"./saved_models/fold3/bert-base-multilingual-uncased/1f_8e_0.8573_s.pth\")\n", + " preds3, logit3 = run_predict(\"./saved_models/fold3/bert-base-multilingual-uncased/2f_9e_0.8674_s.pth\")\n", + " preds4, logit4 = run_predict(\"./saved_models/fold3/bert-base-multilingual-uncased/3f_8e_0.8649_s.pth\")\n", + " preds5, logit5 = run_predict(\"./saved_models/fold3/bert-base-multilingual-uncased/4f_9e_0.8673_s.pth\")\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #####################\n", + " args.pt = 'klue/roberta-large'\n", + " preds1, logit1 = run_predict(\"./saved_models/fold3/klue-roberta-large/0f_2e_0.8905_s.pth\")\n", + " preds2, logit2 = run_predict(\"./saved_models/fold3/klue-roberta-large/1f_4e_0.8897_s.pth\")\n", + " preds3, logit3 = run_predict(\"./saved_models/fold3/klue-roberta-large/2f_3e_0.8887_s.pth\")\n", + " preds4, logit4 = run_predict(\"./saved_models/fold3/klue-roberta-large/3f_3e_0.8949_s.pth\")\n", + " preds5, logit5 = run_predict(\"./saved_models/fold3/klue-roberta-large/4f_2e_0.8939_s.pth\")\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #####################\n", + " args.pt = 'xlm-roberta-large'\n", + " preds1, logit1 = run_predict(\"./saved_models/fold3/xlm-roberta-large_radam/0f_6e_0.8928_s.pth\")\n", + " preds2, logit2 = run_predict(\"./saved_models/fold3/xlm-roberta-large_radam/1f_5e_0.8850_s.pth\")\n", + " preds3, logit3 = run_predict(\"./saved_models/fold3/xlm-roberta-large_radam/2f_5e_0.8891_s.pth\")\n", + " preds4, logit4 = run_predict(\"./saved_models/fold3/xlm-roberta-large_radam/3f_8e_0.8938_s.pth\")\n", + " preds5, logit5 = run_predict(\"./saved_models/fold3/xlm-roberta-large_radam/4f_6e_0.8911_s.pth\")\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #####################\n", + " args.max_len=28\n", + " args.pt = 'klue/roberta-large'\n", + " preds1, logit1 = run_predict(\"./saved_models/fold3/klue-roberta-large_28/0f_6e_0.8912_s.pth\")\n", + " preds2, logit2 = run_predict(\"./saved_models/fold3//klue-roberta-large_28/1f_3e_0.8891_s.pth\")\n", + " preds3, logit3 = run_predict(\"./saved_models/fold3//klue-roberta-large_28/2f_5e_0.8891_s.pth\")\n", + " preds4, logit4 = run_predict(\"./saved_models/fold3//klue-roberta-large_28/3f_4e_0.8961_s.pth\")\n", + " preds5, logit5 = run_predict(\"./saved_models/fold3//klue-roberta-large_28/4f_2e_0.8938_s.pth\")\n", + " final_logit += (logit1+logit2+logit3+logit4+logit5)/5\n", + " #최종적으로 final_logit에는 모든 모델의 평균 예측 로짓이 포함됨 -> 함수의 최종 출력으로 반환됨\n", + " return final_logit\n", + "\n", + "## 평균 예측 로그를 취하는 목적 : 분산을 줄이고 전체 예측의 정확도를 개선하기 위함" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8bb613ee", + "metadata": { + "scrolled": true, + "id": "8bb613ee" + }, + "outputs": [], + "source": [ + "final_logit = ensemble()" + ] + }, + { + "cell_type": "markdown", + "id": "3cba9d8a", + "metadata": { + "heading_collapsed": true, + "id": "3cba9d8a" + }, + "source": [ + "# submission" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a6b633c", + "metadata": { + "hidden": true, + "id": "9a6b633c" + }, + "outputs": [], + "source": [ + "sub = pd.read_csv(\"./sample_submission.csv\")\n", + "sub['topic_idx'] = final_logit.argmax(1)\n", + "# preds\n", + "sub.to_csv('./submission/final_submission.csv', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + }, + "colab": { + "provenance": [], + "include_colab_link": true + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "265d58264cb44d71b8af68940bf31e56": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_28d3b20cb6ea4f4c9c72c10072d246e8", + "IPY_MODEL_1d18879aaf8943b09503d61e78773f37", + "IPY_MODEL_8c609b8177e44af89f7e35f2879721c9" + ], + "layout": "IPY_MODEL_f707fba56e7141d78891d53ee74a259e" + } + }, + "28d3b20cb6ea4f4c9c72c10072d246e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bb841ec0e55a45b9bfe5179d764cc05d", + "placeholder": "​", + "style": "IPY_MODEL_5916603561134a779856a7366679e448", + "value": "Downloading (…)zer_78b3253a26.model: 100%" + } + }, + "1d18879aaf8943b09503d61e78773f37": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3646753908c740649027e069cd8de136", + "max": 371391, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_620fe7178e6c46b6b7486bebdbc62aa8", + "value": 371391 + } + }, + "8c609b8177e44af89f7e35f2879721c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_554b2ff17b82433d898fefc6fd6f1888", + "placeholder": "​", + "style": "IPY_MODEL_50f71915c0934804a05a1fa20c7c16d4", + "value": " 371k/371k [00:00<00:00, 1.52MB/s]" + } + }, + "f707fba56e7141d78891d53ee74a259e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bb841ec0e55a45b9bfe5179d764cc05d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5916603561134a779856a7366679e448": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3646753908c740649027e069cd8de136": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "620fe7178e6c46b6b7486bebdbc62aa8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "554b2ff17b82433d898fefc6fd6f1888": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "50f71915c0934804a05a1fa20c7c16d4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e19099aad499415bb2460740c0618632": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_592e02aac4834d488a86abf0ac9de161", + "IPY_MODEL_bdf5b15134fe49959fc6ae43245ac9da", + "IPY_MODEL_f11334304f5f47ef864576420c7773f4" + ], + "layout": "IPY_MODEL_309130246636451fb0c8d260eba51362" + } + }, + "592e02aac4834d488a86abf0ac9de161": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1708a31d597b467a82f624a4b7413eff", + "placeholder": "​", + "style": "IPY_MODEL_284d8a5b895b4fbd936b99752a774972", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "bdf5b15134fe49959fc6ae43245ac9da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b6fd5128436741c98da9dca9ffa206be", + "max": 77779, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9508da1c1a034d32a54184848f623cd6", + "value": 77779 + } + }, + "f11334304f5f47ef864576420c7773f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e79e6a5f223e4628be73c0a8958a614c", + "placeholder": "​", + "style": "IPY_MODEL_c018678480b94f9185d5171ecaebb83c", + "value": " 77.8k/77.8k [00:00<00:00, 2.07MB/s]" + } + }, + "309130246636451fb0c8d260eba51362": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1708a31d597b467a82f624a4b7413eff": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "284d8a5b895b4fbd936b99752a774972": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b6fd5128436741c98da9dca9ffa206be": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9508da1c1a034d32a54184848f623cd6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e79e6a5f223e4628be73c0a8958a614c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c018678480b94f9185d5171ecaebb83c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b6200a2256da485183c393bbc798e61b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bdd16c6c006d4caabc73c9d2281d2e3f", + "IPY_MODEL_6a54274d88994f82a841cfdd6d64b2ae", + "IPY_MODEL_23022de1e9744471b3698d963e03774c" + ], + "layout": "IPY_MODEL_b16247821a1949688f4cc9036eca0d80" + } + }, + "bdd16c6c006d4caabc73c9d2281d2e3f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9dd713a34e7b42e695a80dfb274accee", + "placeholder": "​", + "style": "IPY_MODEL_e544c367b1e147ccbf5034b4c3e8bb44", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "6a54274d88994f82a841cfdd6d64b2ae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_681379aa4c9440e1b52717aa2152c43e", + "max": 51, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bd1c303bbfc34155964705b4809c980a", + "value": 51 + } + }, + "23022de1e9744471b3698d963e03774c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fc13c5b3a69b40079832122954285ee1", + "placeholder": "​", + "style": "IPY_MODEL_9409bae71a19445aabe5128050d515e2", + "value": " 51.0/51.0 [00:00<00:00, 3.49kB/s]" + } + }, + "b16247821a1949688f4cc9036eca0d80": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9dd713a34e7b42e695a80dfb274accee": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e544c367b1e147ccbf5034b4c3e8bb44": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "681379aa4c9440e1b52717aa2152c43e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd1c303bbfc34155964705b4809c980a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fc13c5b3a69b40079832122954285ee1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9409bae71a19445aabe5128050d515e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f413126d65144f74835cdc7c8f8066fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a13e738d23e847a4ac024eb33c861dbd", + "IPY_MODEL_8c03dc9206c246fb8097db0ca231d6db", + "IPY_MODEL_37797bfaa693445cabf39a89898eb6b5" + ], + "layout": "IPY_MODEL_72809d66d0854c0baa67125a312c204b" + } + }, + "a13e738d23e847a4ac024eb33c861dbd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_06ce2be29b574129901e3c574b05f2d4", + "placeholder": "​", + "style": "IPY_MODEL_cc59c893ed454c51a92b72b4a1f3e5c3", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "8c03dc9206c246fb8097db0ca231d6db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_265faaf2dd234ca1b2b564e4c05ccd12", + "max": 426, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5e8a24d5528f405d8ec9c3bc3076a82f", + "value": 426 + } + }, + "37797bfaa693445cabf39a89898eb6b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b3f48432b2a44f7b5399f13a7f3f9e5", + "placeholder": "​", + "style": "IPY_MODEL_766eb8e5e64c43da842b82b728de8315", + "value": " 426/426 [00:00<00:00, 26.5kB/s]" + } + }, + "72809d66d0854c0baa67125a312c204b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06ce2be29b574129901e3c574b05f2d4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cc59c893ed454c51a92b72b4a1f3e5c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "265faaf2dd234ca1b2b564e4c05ccd12": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5e8a24d5528f405d8ec9c3bc3076a82f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "3b3f48432b2a44f7b5399f13a7f3f9e5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "766eb8e5e64c43da842b82b728de8315": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "66656f6cd75a4752b2ab42aba9630cb2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_77b092f984124ef3b20e949e794759db", + "IPY_MODEL_64ea592689824dd99c2206be5b973f24", + "IPY_MODEL_b907ffa02f0a48dc861a01a3590b9ddc" + ], + "layout": "IPY_MODEL_017c025167734aa986a4225493d6b892" + } + }, + "77b092f984124ef3b20e949e794759db": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f829b7b1bee8490e8e541bb85b33b046", + "placeholder": "​", + "style": "IPY_MODEL_03ca09bcc5ef42bbbf3fbd79f9a1b75e", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "64ea592689824dd99c2206be5b973f24": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9ec6996bc36b4aae9614c09c471977a3", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_afcc94d046194196a1445c4a9a5a10ca", + "value": 375 + } + }, + "b907ffa02f0a48dc861a01a3590b9ddc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_de10e0bca4f64a29b0f97a47769056fc", + "placeholder": "​", + "style": "IPY_MODEL_8de79158d5fc4e7798e6ec17a0cb8359", + "value": " 375/375 [00:00<00:00, 6.37kB/s]" + } + }, + "017c025167734aa986a4225493d6b892": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f829b7b1bee8490e8e541bb85b33b046": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "03ca09bcc5ef42bbbf3fbd79f9a1b75e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9ec6996bc36b4aae9614c09c471977a3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "afcc94d046194196a1445c4a9a5a10ca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "de10e0bca4f64a29b0f97a47769056fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8de79158d5fc4e7798e6ec17a0cb8359": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8f79c3be45234bd6b82be1fcf535b56a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_34ed45155a0c406ab3eeb358ffa1f23d", + "IPY_MODEL_9ef7f690f9394e0e871cbeb3a4f9c074", + "IPY_MODEL_18101aa88c124c91a6f91cc00183c140" + ], + "layout": "IPY_MODEL_4dbc376168444a1892e6565048dbbee8" + } + }, + "34ed45155a0c406ab3eeb358ffa1f23d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8fc34bda9bc2434f86434bfc996003d0", + "placeholder": "​", + "style": "IPY_MODEL_ef7fa97a2caa4be2856c9b1c799e0e01", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "9ef7f690f9394e0e871cbeb3a4f9c074": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6ef574e796474fd9b816adfdf2996e69", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e7afa624c3b448abb9d97dcc19bd79bc", + "value": 248477 + } + }, + "18101aa88c124c91a6f91cc00183c140": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e8ee348b8a1641638a7896b0a7826941", + "placeholder": "​", + "style": "IPY_MODEL_f1375674453847fb9beb80694d5053b5", + "value": " 248k/248k [00:00<00:00, 7.07MB/s]" + } + }, + "4dbc376168444a1892e6565048dbbee8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fc34bda9bc2434f86434bfc996003d0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ef7fa97a2caa4be2856c9b1c799e0e01": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6ef574e796474fd9b816adfdf2996e69": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e7afa624c3b448abb9d97dcc19bd79bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e8ee348b8a1641638a7896b0a7826941": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f1375674453847fb9beb80694d5053b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4577e5b3ae014e78a9df350a272ea0c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e97b6d15983d444cb9b0d9c106a98fe7", + "IPY_MODEL_62ca38c626d94edda3440566412b8c6b", + "IPY_MODEL_8f7ab930d07443529e0540155e2a186b" + ], + "layout": "IPY_MODEL_8980fbe163c44cf48bf452364a1f5012" + } + }, + "e97b6d15983d444cb9b0d9c106a98fe7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8b73e58bb16b494982366382dd47ba5e", + "placeholder": "​", + "style": "IPY_MODEL_96bf1f55d9474b62ba634fe04db459c3", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "62ca38c626d94edda3440566412b8c6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ccd9a614a299432bbe24b667f27f9079", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_90b4a14f201d4681b53dc85911eae8cd", + "value": 751504 + } + }, + "8f7ab930d07443529e0540155e2a186b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e52278d4919048e8895035bab37bdc40", + "placeholder": "​", + "style": "IPY_MODEL_6b41100258e64ea19c614133aa6c8d00", + "value": " 752k/752k [00:00<00:00, 12.5MB/s]" + } + }, + "8980fbe163c44cf48bf452364a1f5012": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b73e58bb16b494982366382dd47ba5e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "96bf1f55d9474b62ba634fe04db459c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ccd9a614a299432bbe24b667f27f9079": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90b4a14f201d4681b53dc85911eae8cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e52278d4919048e8895035bab37bdc40": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b41100258e64ea19c614133aa6c8d00": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0088a0b55b49413bb142546deec7a230": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_eb9d9f98cad241ad81a1f54c769cd1bd", + "IPY_MODEL_cb37af934f734aea9b7cfcaecb2d7f08", + "IPY_MODEL_8564f07f1a814676be264bbde286da82" + ], + "layout": "IPY_MODEL_4604dfa3b73444d388ba16a9ef55ac78" + } + }, + "eb9d9f98cad241ad81a1f54c769cd1bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_42d6092eed3d418fa2d8ac12dafcb2bd", + "placeholder": "​", + "style": "IPY_MODEL_53f953c1cd2f4924a055409227dc3e7a", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "cb37af934f734aea9b7cfcaecb2d7f08": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_caa145c4ec574bd1aae875bf19a680f3", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6f50fce310c143af967cd6bf74c7bb49", + "value": 173 + } + }, + "8564f07f1a814676be264bbde286da82": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c0393d413ebb45489d1e20b45b150f6f", + "placeholder": "​", + "style": "IPY_MODEL_80925dfdc6af4bb08ce1d8b3b1afacf7", + "value": " 173/173 [00:00<00:00, 5.94kB/s]" + } + }, + "4604dfa3b73444d388ba16a9ef55ac78": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "42d6092eed3d418fa2d8ac12dafcb2bd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "53f953c1cd2f4924a055409227dc3e7a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "caa145c4ec574bd1aae875bf19a680f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6f50fce310c143af967cd6bf74c7bb49": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c0393d413ebb45489d1e20b45b150f6f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "80925dfdc6af4bb08ce1d8b3b1afacf7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e58cac3a40634e6d81d55477df36de85": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9cf89a3e788c487ab4f53292763f1dc8", + "IPY_MODEL_bf512cc764e14c9596bebe8d02cb0786", + "IPY_MODEL_b04082a3db8a474b825c965d531c0954" + ], + "layout": "IPY_MODEL_0df5705875c6427ab4423a14acee87ef" + } + }, + "9cf89a3e788c487ab4f53292763f1dc8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_04ed1e744cb44d2ebb61eaa0584b5298", + "placeholder": "​", + "style": "IPY_MODEL_80069a4370cb401c80121dba364391aa", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "bf512cc764e14c9596bebe8d02cb0786": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_74fe7e6409c049cdb18ca24fe9f1d621", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2d387d8f89264abfb93eb014db2f191a", + "value": 375 + } + }, + "b04082a3db8a474b825c965d531c0954": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_40fedaebe5cd485284d654117a5294da", + "placeholder": "​", + "style": "IPY_MODEL_8663e0e8ca694482bd6b09a5428ad728", + "value": " 375/375 [00:00<00:00, 12.9kB/s]" + } + }, + "0df5705875c6427ab4423a14acee87ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "04ed1e744cb44d2ebb61eaa0584b5298": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "80069a4370cb401c80121dba364391aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "74fe7e6409c049cdb18ca24fe9f1d621": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d387d8f89264abfb93eb014db2f191a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "40fedaebe5cd485284d654117a5294da": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8663e0e8ca694482bd6b09a5428ad728": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b0bc95f5472e4531b29fe33b09a4d36c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_720c88fe32da498d94f05551b7da1cac", + "IPY_MODEL_ef804c95503541a9b39ac3a8511e7e85", + "IPY_MODEL_c888c88074ab4fd48b68a3aee8e9fd22" + ], + "layout": "IPY_MODEL_e0173bd95c4941c1a77760e6a0a4ca54" + } + }, + "720c88fe32da498d94f05551b7da1cac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_14ccf32079a142f89dc1c98437c7c171", + "placeholder": "​", + "style": "IPY_MODEL_1020f0d261ac4b67bf013339849de275", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "ef804c95503541a9b39ac3a8511e7e85": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a8df45aea3864ee685d5e7a2bc90089c", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_33753b59355e449c9fb0309e63b31b0f", + "value": 248477 + } + }, + "c888c88074ab4fd48b68a3aee8e9fd22": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_44caee2e2d814520b728f415225590fd", + "placeholder": "​", + "style": "IPY_MODEL_d1866ceaf58a469d8bfaa43b768a365a", + "value": " 248k/248k [00:00<00:00, 4.13MB/s]" + } + }, + "e0173bd95c4941c1a77760e6a0a4ca54": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "14ccf32079a142f89dc1c98437c7c171": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1020f0d261ac4b67bf013339849de275": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a8df45aea3864ee685d5e7a2bc90089c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "33753b59355e449c9fb0309e63b31b0f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "44caee2e2d814520b728f415225590fd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d1866ceaf58a469d8bfaa43b768a365a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8288953050cf4a87b3db5d8fdbe67d9b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d73fc41b72de468196d84f3c8b3c0200", + "IPY_MODEL_b41543c9d8c649ee9f64e50b11c6ae14", + "IPY_MODEL_b1ae87f9375b4132897fc7b837b28fbd" + ], + "layout": "IPY_MODEL_a6bd3e27f5cd4453957abe5a590b16cf" + } + }, + "d73fc41b72de468196d84f3c8b3c0200": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_960cc22366f2464388d255a6486bd10e", + "placeholder": "​", + "style": "IPY_MODEL_7838f14b7ba64452a397a05f556f25f5", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "b41543c9d8c649ee9f64e50b11c6ae14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b0df16ca17be4620b30338a178986a9b", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0257b66188b647ac9e2dc410a2886bca", + "value": 751504 + } + }, + "b1ae87f9375b4132897fc7b837b28fbd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4ab6e6f31da645c5907a6bba7fb1123b", + "placeholder": "​", + "style": "IPY_MODEL_539c83d11d744635a73458baec674794", + "value": " 752k/752k [00:00<00:00, 5.54MB/s]" + } + }, + "a6bd3e27f5cd4453957abe5a590b16cf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "960cc22366f2464388d255a6486bd10e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7838f14b7ba64452a397a05f556f25f5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b0df16ca17be4620b30338a178986a9b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0257b66188b647ac9e2dc410a2886bca": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4ab6e6f31da645c5907a6bba7fb1123b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "539c83d11d744635a73458baec674794": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2a4b8cabad1c4bf29dfc11380b298dd0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d7ab63d9b3544825b2dd9ca4e9da8bc4", + "IPY_MODEL_53ffd0362e3541c5b37ed678c52de9bb", + "IPY_MODEL_1ee0027d989e4ac79b5bcb58be4a6861" + ], + "layout": "IPY_MODEL_385d38c30b0b43eca6e9087c8f940957" + } + }, + "d7ab63d9b3544825b2dd9ca4e9da8bc4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c048e4fb18ea4a5eb6b9ffaf15e41ac0", + "placeholder": "​", + "style": "IPY_MODEL_6e4271d504e0489ebef9922e4c17469f", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "53ffd0362e3541c5b37ed678c52de9bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b1fad86df4454c9d99b808166cfdf279", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5ad0767da8db47f7b9badf288ac734f9", + "value": 173 + } + }, + "1ee0027d989e4ac79b5bcb58be4a6861": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4b05bc71e79c4a39a0df48db1c81080a", + "placeholder": "​", + "style": "IPY_MODEL_f80feafed211460f91fa43ca7e875190", + "value": " 173/173 [00:00<00:00, 7.63kB/s]" + } + }, + "385d38c30b0b43eca6e9087c8f940957": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c048e4fb18ea4a5eb6b9ffaf15e41ac0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e4271d504e0489ebef9922e4c17469f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b1fad86df4454c9d99b808166cfdf279": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5ad0767da8db47f7b9badf288ac734f9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4b05bc71e79c4a39a0df48db1c81080a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f80feafed211460f91fa43ca7e875190": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6e85f86433f74ae88bb45a17a51c69b5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_711fed0039c04bb0a727d8153a7f67a4", + "IPY_MODEL_733626879544456cbc72fd6dc9f8d856", + "IPY_MODEL_a203e8286e094b2e89e1d35877999f75" + ], + "layout": "IPY_MODEL_4f05871c1a424f929a349d48c9c51bd4" + } + }, + "711fed0039c04bb0a727d8153a7f67a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b1c758d8f64045ec89f2ec64028b7a7f", + "placeholder": "​", + "style": "IPY_MODEL_00680b63bf464d17a6dd6a3077fb986f", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "733626879544456cbc72fd6dc9f8d856": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_570b8de9ad53403f805c559e4f9592bc", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_75fc6ac62ebf4477a1873e74b72591a1", + "value": 375 + } + }, + "a203e8286e094b2e89e1d35877999f75": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8ab3f4504d9b45ada6f4c192092d969d", + "placeholder": "​", + "style": "IPY_MODEL_b20c18308e914f50bc6f27da41a5fc10", + "value": " 375/375 [00:00<00:00, 12.7kB/s]" + } + }, + "4f05871c1a424f929a349d48c9c51bd4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b1c758d8f64045ec89f2ec64028b7a7f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "00680b63bf464d17a6dd6a3077fb986f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "570b8de9ad53403f805c559e4f9592bc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "75fc6ac62ebf4477a1873e74b72591a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8ab3f4504d9b45ada6f4c192092d969d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b20c18308e914f50bc6f27da41a5fc10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "65d914265588433589ab59433a9f37f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_281efada42e34f0cbdb256e07b5cf3eb", + "IPY_MODEL_294f93e6bebc4dbdad817f901574944f", + "IPY_MODEL_fba61f3da3ea4cfcb57175fd35bd8ef5" + ], + "layout": "IPY_MODEL_40021a9175da4e528babf528edd41f14" + } + }, + "281efada42e34f0cbdb256e07b5cf3eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0eb4f7c4b5904be48c69cf3ac4c1122c", + "placeholder": "​", + "style": "IPY_MODEL_00410518ae984713b0f2c9540bdd2789", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "294f93e6bebc4dbdad817f901574944f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b3c662c827c64b09849acd63838583f8", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e7698d59fd404a4785b5cd616703b968", + "value": 248477 + } + }, + "fba61f3da3ea4cfcb57175fd35bd8ef5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f1c6d510bfa140c48159b839e8673ea5", + "placeholder": "​", + "style": "IPY_MODEL_149bb646b6fb46138fc60c9c041f872f", + "value": " 248k/248k [00:00<00:00, 3.40MB/s]" + } + }, + "40021a9175da4e528babf528edd41f14": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0eb4f7c4b5904be48c69cf3ac4c1122c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "00410518ae984713b0f2c9540bdd2789": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b3c662c827c64b09849acd63838583f8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e7698d59fd404a4785b5cd616703b968": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f1c6d510bfa140c48159b839e8673ea5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "149bb646b6fb46138fc60c9c041f872f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a9d9485a697642089f3d8ca18301b8a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9a68253e718a496096b1ff68488f1e5c", + "IPY_MODEL_9c1c3f3918ae4c6fad369a507f7263ed", + "IPY_MODEL_6db1f76443374653b9f07c7fa97c2541" + ], + "layout": "IPY_MODEL_8fd5173aa11c43e1a43550c31ef6115e" + } + }, + "9a68253e718a496096b1ff68488f1e5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a2bba57856554a7b9d27cffc0be0d8cb", + "placeholder": "​", + "style": "IPY_MODEL_d831d42338754b2fb27410f1b68c4bef", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "9c1c3f3918ae4c6fad369a507f7263ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a4efeb8660214bd08f8b56880a9d7366", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e0eff06d626b4d45acba52aa4a888e34", + "value": 751504 + } + }, + "6db1f76443374653b9f07c7fa97c2541": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dfe44a5da1484f83a11e0b2c649671a7", + "placeholder": "​", + "style": "IPY_MODEL_21bf9ae5622241e38969c57b1d638a09", + "value": " 752k/752k [00:00<00:00, 2.00MB/s]" + } + }, + "8fd5173aa11c43e1a43550c31ef6115e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a2bba57856554a7b9d27cffc0be0d8cb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d831d42338754b2fb27410f1b68c4bef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a4efeb8660214bd08f8b56880a9d7366": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e0eff06d626b4d45acba52aa4a888e34": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dfe44a5da1484f83a11e0b2c649671a7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "21bf9ae5622241e38969c57b1d638a09": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8b7c743043ec4c208efcb10777ca8d7b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fd765d0dbfe541cb9507b0b079c967c4", + "IPY_MODEL_2bf17eee97e9415b91bf4f65ff96ebe0", + "IPY_MODEL_46ac8b7079c544098fa4724dc74532ba" + ], + "layout": "IPY_MODEL_b5affe7fde7149298cbffbbc8ba74c1b" + } + }, + "fd765d0dbfe541cb9507b0b079c967c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79e101bb06b040ee879d39335a3dad46", + "placeholder": "​", + "style": "IPY_MODEL_f49037c4d405436584f573e226214e14", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "2bf17eee97e9415b91bf4f65ff96ebe0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fbce263c1b0c4096bade0a8c2c365fc9", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6e8b1f658adb4cfd8c44d1e1f7654f21", + "value": 173 + } + }, + "46ac8b7079c544098fa4724dc74532ba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f5fc3218202244179ec7d005bc4b079b", + "placeholder": "​", + "style": "IPY_MODEL_a127875ffe704645bfabfb6303c498c9", + "value": " 173/173 [00:00<00:00, 6.26kB/s]" + } + }, + "b5affe7fde7149298cbffbbc8ba74c1b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "79e101bb06b040ee879d39335a3dad46": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f49037c4d405436584f573e226214e14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fbce263c1b0c4096bade0a8c2c365fc9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6e8b1f658adb4cfd8c44d1e1f7654f21": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f5fc3218202244179ec7d005bc4b079b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a127875ffe704645bfabfb6303c498c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9e4ff39cf7eb4cf8afc22d53a2f30f01": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_943bf4dd97ee4766a1e97572bceeb408", + "IPY_MODEL_35d501bb7f104d5a96dc4697b7964fcc", + "IPY_MODEL_c9f41bef5b1d4d6a83e895fbf27c297f" + ], + "layout": "IPY_MODEL_2c4de5c9b6ab4eae94792d896ccc1e64" + } + }, + "943bf4dd97ee4766a1e97572bceeb408": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6b112b5d8c8b45e5abf49d8003f2844e", + "placeholder": "​", + "style": "IPY_MODEL_24183aecc7604328a686246ad722561b", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "35d501bb7f104d5a96dc4697b7964fcc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4b53c4d8c3054a7fa22e0c8c414c282b", + "max": 616, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ae84b73ce2db42ca92c5d47010226088", + "value": 616 + } + }, + "c9f41bef5b1d4d6a83e895fbf27c297f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0893ae402bc540d2ad22edaf02281d15", + "placeholder": "​", + "style": "IPY_MODEL_e662dcebe976458f9e82d9283e5a6bf8", + "value": " 616/616 [00:00<00:00, 31.4kB/s]" + } + }, + "2c4de5c9b6ab4eae94792d896ccc1e64": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b112b5d8c8b45e5abf49d8003f2844e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "24183aecc7604328a686246ad722561b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4b53c4d8c3054a7fa22e0c8c414c282b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae84b73ce2db42ca92c5d47010226088": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0893ae402bc540d2ad22edaf02281d15": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e662dcebe976458f9e82d9283e5a6bf8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "72bb231a18cd420b98d68ff20c6e9ba3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e5deaa84a9b54853a608c6ef84785695", + "IPY_MODEL_7a7da9562c06465f84c7c13e989c4567", + "IPY_MODEL_9f382345dca24290a4b30ccf7725ae4a" + ], + "layout": "IPY_MODEL_f404624183054a4da60b875fa2cd11e4" + } + }, + "e5deaa84a9b54853a608c6ef84785695": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e16f0923b5214cffa01b4abe44207f01", + "placeholder": "​", + "style": "IPY_MODEL_b38a270cb89b4bf9a0bbe6431285184d", + "value": "Downloading (…)tencepiece.bpe.model: 100%" + } + }, + "7a7da9562c06465f84c7c13e989c4567": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e080c28dad4d4d81ac57b91a465e33e1", + "max": 5069051, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c87f2163fa1e45218bf4f0c16cc131b6", + "value": 5069051 + } + }, + "9f382345dca24290a4b30ccf7725ae4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e7c84a7f482449efa673cbaa1827fc59", + "placeholder": "​", + "style": "IPY_MODEL_7887928960044ffca14abe437467c206", + "value": " 5.07M/5.07M [00:00<00:00, 11.2MB/s]" + } + }, + "f404624183054a4da60b875fa2cd11e4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e16f0923b5214cffa01b4abe44207f01": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b38a270cb89b4bf9a0bbe6431285184d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e080c28dad4d4d81ac57b91a465e33e1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c87f2163fa1e45218bf4f0c16cc131b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e7c84a7f482449efa673cbaa1827fc59": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7887928960044ffca14abe437467c206": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8e3cfc5e197e451fa3aa9d231dda52a1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7f043eae39594350bfa59c71ff90430e", + "IPY_MODEL_9eb7d4cc7817421e970617eef8538652", + "IPY_MODEL_37d11178fcc1451191a2e8d41130746e" + ], + "layout": "IPY_MODEL_618d8b9d899540429bafb1bbc5750e76" + } + }, + "7f043eae39594350bfa59c71ff90430e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6948e1f520cd486fa4a72214e1e07093", + "placeholder": "​", + "style": "IPY_MODEL_6822647c69784bc988a3e8354457219c", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "9eb7d4cc7817421e970617eef8538652": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b5ca4c4e8f54a28a762b7cc9af2adb0", + "max": 9096718, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e58e9e2839cf4572abd06e1e96ae55bd", + "value": 9096718 + } + }, + "37d11178fcc1451191a2e8d41130746e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd375cd60ac54434b3ef78f4fd15c437", + "placeholder": "​", + "style": "IPY_MODEL_19b20f738e03483ba062ff4a3cb3b578", + "value": " 9.10M/9.10M [00:00<00:00, 16.2MB/s]" + } + }, + "618d8b9d899540429bafb1bbc5750e76": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6948e1f520cd486fa4a72214e1e07093": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6822647c69784bc988a3e8354457219c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3b5ca4c4e8f54a28a762b7cc9af2adb0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e58e9e2839cf4572abd06e1e96ae55bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dd375cd60ac54434b3ef78f4fd15c437": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "19b20f738e03483ba062ff4a3cb3b578": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ce3a3b4238344f8c8898ce22a13bcddc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_53a37b6c7dbf43cdb0b426a209bc9a7d", + "IPY_MODEL_d4ecf0ec7dab46a2925a31261d830444", + "IPY_MODEL_636206c306b24596b7caf1980be4ec47" + ], + "layout": "IPY_MODEL_b503f438dcc94a2c8e4feb11bdec53be" + } + }, + "53a37b6c7dbf43cdb0b426a209bc9a7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0d6a1d5e3a3c43b4aad257b0c2df3114", + "placeholder": "​", + "style": "IPY_MODEL_36cde43ac29244569819ce5d2a2fa955", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "d4ecf0ec7dab46a2925a31261d830444": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_900a95dc077c4d64a19383c8553721c1", + "max": 28, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9a6a9bffd81f44ce932460f13e303ad4", + "value": 28 + } + }, + "636206c306b24596b7caf1980be4ec47": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d44e289145ec42aca4e376d8cf5e6e8a", + "placeholder": "​", + "style": "IPY_MODEL_73e79d9e0abe4dc2ad638ef0aeaec68b", + "value": " 28.0/28.0 [00:00<00:00, 971B/s]" + } + }, + "b503f438dcc94a2c8e4feb11bdec53be": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0d6a1d5e3a3c43b4aad257b0c2df3114": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "36cde43ac29244569819ce5d2a2fa955": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "900a95dc077c4d64a19383c8553721c1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9a6a9bffd81f44ce932460f13e303ad4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d44e289145ec42aca4e376d8cf5e6e8a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "73e79d9e0abe4dc2ad638ef0aeaec68b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2622a3c4f8814c6a899982788435f702": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_62f2fa1b9d7b449089de00623bb20a68", + "IPY_MODEL_748890444a154ef6a49698394c810f3c", + "IPY_MODEL_d0b9b80d61b84529b2e3b14f06d082b9" + ], + "layout": "IPY_MODEL_a08eeaeb49c54da5bcec3e369be00151" + } + }, + "62f2fa1b9d7b449089de00623bb20a68": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a09cf480023349c9bec9daddade90e91", + "placeholder": "​", + "style": "IPY_MODEL_447f80b186ed41d3a405b58494d3e410", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "748890444a154ef6a49698394c810f3c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_debe3dda1c824088848d526d0d840e13", + "max": 625, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d535c1fc215a4e658fb4f485e87e3e46", + "value": 625 + } + }, + "d0b9b80d61b84529b2e3b14f06d082b9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ce087aafeb084c37b1f2097cb041bfef", + "placeholder": "​", + "style": "IPY_MODEL_3969d441f073405985cd0a1eadc92154", + "value": " 625/625 [00:00<00:00, 30.6kB/s]" + } + }, + "a08eeaeb49c54da5bcec3e369be00151": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a09cf480023349c9bec9daddade90e91": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "447f80b186ed41d3a405b58494d3e410": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "debe3dda1c824088848d526d0d840e13": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d535c1fc215a4e658fb4f485e87e3e46": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ce087aafeb084c37b1f2097cb041bfef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3969d441f073405985cd0a1eadc92154": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "825255d506e749789af57bb5587b026b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3fa6946a123f43f7ab05acb3ab7aeb14", + "IPY_MODEL_449d2a6116204739bd9d2ad32f976085", + "IPY_MODEL_054fe8d86d344304994d8ce70e0be7ac" + ], + "layout": "IPY_MODEL_c476cba899184c5c8885029d1a4f218a" + } + }, + "3fa6946a123f43f7ab05acb3ab7aeb14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9a078879844a4ef68226978173aa274e", + "placeholder": "​", + "style": "IPY_MODEL_159607b8f0c1484da356a1b4faf5ada3", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "449d2a6116204739bd9d2ad32f976085": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab5e5becdddb4cb8aa4a68ce5ff6d085", + "max": 871891, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b1e10471c905486e83fac3e1739a818e", + "value": 871891 + } + }, + "054fe8d86d344304994d8ce70e0be7ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26e0ea94e7374a6eb1797de01b43c291", + "placeholder": "​", + "style": "IPY_MODEL_c75797202f8d461da2ad22934b430718", + "value": " 872k/872k [00:00<00:00, 23.3MB/s]" + } + }, + "c476cba899184c5c8885029d1a4f218a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9a078879844a4ef68226978173aa274e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "159607b8f0c1484da356a1b4faf5ada3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ab5e5becdddb4cb8aa4a68ce5ff6d085": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b1e10471c905486e83fac3e1739a818e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "26e0ea94e7374a6eb1797de01b43c291": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c75797202f8d461da2ad22934b430718": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "70dea0d82f05461cabe81830551c22da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fd3dbe48d23f4aeca586d6dc24c94eaf", + "IPY_MODEL_bb961ba002ca446ba937c05c26bc677c", + "IPY_MODEL_b9f919a089054ab2a7faaf70cfab4baf" + ], + "layout": "IPY_MODEL_3a89823e13c342028df88106c5b803e4" + } + }, + "fd3dbe48d23f4aeca586d6dc24c94eaf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e51ecaad661a4634acbeb84e3dba0b7c", + "placeholder": "​", + "style": "IPY_MODEL_d102602e099342ada758779502f153ed", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "bb961ba002ca446ba937c05c26bc677c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c8bc0f0f53de4364a6348ce583b9c73e", + "max": 1715180, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a0e199e803a94361b63bc2e4d26515c2", + "value": 1715180 + } + }, + "b9f919a089054ab2a7faaf70cfab4baf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2afdfd4753dd45af95153ef1bedb7f5a", + "placeholder": "​", + "style": "IPY_MODEL_9aac61202ab34d8086d458f30e3c8ef4", + "value": " 1.72M/1.72M [00:00<00:00, 35.7MB/s]" + } + }, + "3a89823e13c342028df88106c5b803e4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e51ecaad661a4634acbeb84e3dba0b7c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d102602e099342ada758779502f153ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c8bc0f0f53de4364a6348ce583b9c73e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a0e199e803a94361b63bc2e4d26515c2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2afdfd4753dd45af95153ef1bedb7f5a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9aac61202ab34d8086d458f30e3c8ef4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + }, + "accelerator": "GPU", + "gpuClass": "standard" + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file From 9c84c4fd7ea18d226fcea9ef8743fed7f2be8fa4 Mon Sep 17 00:00:00 2001 From: Jinaen <68771741+fire-long@users.noreply.github.com> Date: Fri, 9 Feb 2024 14:43:13 +0900 Subject: [PATCH 6/6] =?UTF-8?q?Colaboratory=EB=A5=BC=20=ED=86=B5=ED=95=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...354\210\230\354\240\225\353\263\270.ipynb" | 9351 +++++++++++++++++ 1 file changed, 9351 insertions(+) create mode 100644 "\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_\354\275\224\353\223\234\354\210\230\354\240\225\353\263\270.ipynb" diff --git "a/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_\354\275\224\353\223\234\354\210\230\354\240\225\353\263\270.ipynb" "b/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_\354\275\224\353\223\234\354\210\230\354\240\225\353\263\270.ipynb" new file mode 100644 index 0000000..daaf89b --- /dev/null +++ "b/\353\252\250\353\215\270\353\247\2013_\353\260\225\354\247\204\354\230\201_\354\275\224\353\223\234\354\210\230\354\240\225\353\263\270.ipynb" @@ -0,0 +1,9351 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "authorship_tag": "ABX9TyNTzlYFxKOvvQVBTsd3UISv", + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU", + "gpuClass": "standard", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "f534bed4fe7448eb91578f67245ecac0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d4a2359a15044033884b4313f9d1d778", + "IPY_MODEL_bbaf30af30ef4d189ed4ab329af1d3e1", + "IPY_MODEL_322f25b0c08449c78112c4fd752077d6" + ], + "layout": "IPY_MODEL_8d191cda699440f18333e6c25ce71b7b" + } + }, + "d4a2359a15044033884b4313f9d1d778": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b01efc3853224067a3584eb63d0bc97e", + "placeholder": "​", + "style": "IPY_MODEL_372ded0a98fd4d8783173078d7f24414", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "bbaf30af30ef4d189ed4ab329af1d3e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_19aec36478e0404d8ba498e8fc8a1120", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e919abc447004aa49fd6e1f869f2ed8f", + "value": 375 + } + }, + "322f25b0c08449c78112c4fd752077d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_303ad95a73474fbfa05b7e660b71e40c", + "placeholder": "​", + "style": "IPY_MODEL_21db930fea3a4b40bcf1d63a7e854f7d", + "value": " 375/375 [00:00<00:00, 14.6kB/s]" + } + }, + "8d191cda699440f18333e6c25ce71b7b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b01efc3853224067a3584eb63d0bc97e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "372ded0a98fd4d8783173078d7f24414": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "19aec36478e0404d8ba498e8fc8a1120": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e919abc447004aa49fd6e1f869f2ed8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "303ad95a73474fbfa05b7e660b71e40c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "21db930fea3a4b40bcf1d63a7e854f7d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "390b2fcd657341a79ecfd256645f73e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fdcda5462b2143e884483b74dd1b2178", + "IPY_MODEL_3b2c7b6fdc7d4ea99c32b423da1bd1da", + "IPY_MODEL_92ecd0701a22436a830b175113593802" + ], + "layout": "IPY_MODEL_4a3f750bdac0421fa08d78c690125efe" + } + }, + "fdcda5462b2143e884483b74dd1b2178": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c9ea6efce01f4ab6ba7a0f885dd800f3", + "placeholder": "​", + "style": "IPY_MODEL_da93d0796c4a4399bdb04ef59a95e64a", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "3b2c7b6fdc7d4ea99c32b423da1bd1da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fa1f641602514df9bde52d48d128b217", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8a038ad0cc6d4d2ab85d26873850fa07", + "value": 248477 + } + }, + "92ecd0701a22436a830b175113593802": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_422ccb4667344e4e97ef42d934b6a1e1", + "placeholder": "​", + "style": "IPY_MODEL_f7ba9115ee924ef9a4f0899c0dca7d4a", + "value": " 248k/248k [00:00<00:00, 396kB/s]" + } + }, + "4a3f750bdac0421fa08d78c690125efe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9ea6efce01f4ab6ba7a0f885dd800f3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "da93d0796c4a4399bdb04ef59a95e64a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fa1f641602514df9bde52d48d128b217": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a038ad0cc6d4d2ab85d26873850fa07": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "422ccb4667344e4e97ef42d934b6a1e1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f7ba9115ee924ef9a4f0899c0dca7d4a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1f715fa597de44a2901233ac30bb1fc7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8d2ef0665fd248f28da08d0732c75af6", + "IPY_MODEL_6db878b2c84e41cf8a699dea906108df", + "IPY_MODEL_b98abcc25ec24032931a83091b34b19b" + ], + "layout": "IPY_MODEL_1f397aa7f5f444c2bfbe68a7cdb868da" + } + }, + "8d2ef0665fd248f28da08d0732c75af6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_69cd57825814465d94ce332a98b4df19", + "placeholder": "​", + "style": "IPY_MODEL_8f92a913526740078249fa0cca8a6663", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "6db878b2c84e41cf8a699dea906108df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_897bfc44e06d4ed5a6501692b69f16b8", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b923d69cdb6e485db6ac7f3d055a70fb", + "value": 751504 + } + }, + "b98abcc25ec24032931a83091b34b19b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b47f6eb794384c00b6a7968e7a27a485", + "placeholder": "​", + "style": "IPY_MODEL_3fef3b41b8a645269a1de3d3889044e1", + "value": " 752k/752k [00:00<00:00, 886kB/s]" + } + }, + "1f397aa7f5f444c2bfbe68a7cdb868da": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69cd57825814465d94ce332a98b4df19": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8f92a913526740078249fa0cca8a6663": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "897bfc44e06d4ed5a6501692b69f16b8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b923d69cdb6e485db6ac7f3d055a70fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b47f6eb794384c00b6a7968e7a27a485": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3fef3b41b8a645269a1de3d3889044e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e7dc43c222ac4262aa0fd57f6d931a9e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3bd178a4f5d74aef8507a37bff6c47c9", + "IPY_MODEL_fc6f190d3d51445a833748784c696cdd", + "IPY_MODEL_ab1b1102c9eb4702a1121dd5d48c2323" + ], + "layout": "IPY_MODEL_fb9ac1c4c4054a44b068346d59ba288c" + } + }, + "3bd178a4f5d74aef8507a37bff6c47c9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee68720b95ff44c4b1d67e3c83eda925", + "placeholder": "​", + "style": "IPY_MODEL_eefa3cd6233d432bb55792d1d89d6b20", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "fc6f190d3d51445a833748784c696cdd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6dc4e8954aae4dc98a22b270dce23708", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b6b4f7dfc89b4c99ad994022d641309b", + "value": 173 + } + }, + "ab1b1102c9eb4702a1121dd5d48c2323": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_68733a2cd91947b993ed95de1a65e83a", + "placeholder": "​", + "style": "IPY_MODEL_433ac7c1614549e5a8b33fb1ca7cc7f2", + "value": " 173/173 [00:00<00:00, 13.6kB/s]" + } + }, + "fb9ac1c4c4054a44b068346d59ba288c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee68720b95ff44c4b1d67e3c83eda925": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eefa3cd6233d432bb55792d1d89d6b20": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6dc4e8954aae4dc98a22b270dce23708": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6b4f7dfc89b4c99ad994022d641309b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "68733a2cd91947b993ed95de1a65e83a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "433ac7c1614549e5a8b33fb1ca7cc7f2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3064f9a643454426bb7e9cbf385b4123": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8ef05693bdc747abb89173918573996a", + "IPY_MODEL_d60988752d5c4ea89115a23e943140b1", + "IPY_MODEL_d33e4b1be84d4efdbe69b66c6a1a01f3" + ], + "layout": "IPY_MODEL_8ae6497852e24e4ab7b2a3cc745d60fa" + } + }, + "8ef05693bdc747abb89173918573996a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dce7fb5c4d2a43c9a138c15b94d28cfd", + "placeholder": "​", + "style": "IPY_MODEL_28b0f48d418341d19b852d28fe9789c2", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "d60988752d5c4ea89115a23e943140b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a20d5966e27a4a2bb8c5512a1ee9318d", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e046044c2a8042909b10f4518bad0585", + "value": 375 + } + }, + "d33e4b1be84d4efdbe69b66c6a1a01f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fdcaa24b9c6741d6aec6c3c0c6689dc0", + "placeholder": "​", + "style": "IPY_MODEL_91126e3887684238b4b27db5983bc5ac", + "value": " 375/375 [00:00<00:00, 15.7kB/s]" + } + }, + "8ae6497852e24e4ab7b2a3cc745d60fa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dce7fb5c4d2a43c9a138c15b94d28cfd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "28b0f48d418341d19b852d28fe9789c2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a20d5966e27a4a2bb8c5512a1ee9318d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e046044c2a8042909b10f4518bad0585": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fdcaa24b9c6741d6aec6c3c0c6689dc0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91126e3887684238b4b27db5983bc5ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "280d26a4bf874576aa9845120dd9ceab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4521a1414ac94897823e393f56d99ccf", + "IPY_MODEL_abc3e5ba446946d9833c42c9187bf12f", + "IPY_MODEL_d5bcb3035f054a77982bd1bf3b4feef4" + ], + "layout": "IPY_MODEL_237dda0559974f5daa75953086eedd27" + } + }, + "4521a1414ac94897823e393f56d99ccf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4f1d49556c5e4dc38d9d174cc12e453c", + "placeholder": "​", + "style": "IPY_MODEL_c0959ea8a6e54b21b0b2f05fdfb2cb8a", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "abc3e5ba446946d9833c42c9187bf12f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cf5951dcf9e84383aff0e075f88dd72f", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c3c2df63508e4c1ea38c204c8c7db566", + "value": 248477 + } + }, + "d5bcb3035f054a77982bd1bf3b4feef4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79d65b2fd5de4ca1ae4555819f814467", + "placeholder": "​", + "style": "IPY_MODEL_5d0cd69018d54263b9d120bca287c92b", + "value": " 248k/248k [00:00<00:00, 10.2MB/s]" + } + }, + "237dda0559974f5daa75953086eedd27": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4f1d49556c5e4dc38d9d174cc12e453c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c0959ea8a6e54b21b0b2f05fdfb2cb8a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cf5951dcf9e84383aff0e075f88dd72f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c3c2df63508e4c1ea38c204c8c7db566": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "79d65b2fd5de4ca1ae4555819f814467": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5d0cd69018d54263b9d120bca287c92b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "59a8f09e54904ac08e2da1fc7265203c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_764ccc6a164e4230afc7542168c66a8f", + "IPY_MODEL_a11b7e82dcb746ebb08fab45da17be5c", + "IPY_MODEL_d0a26f193e3d4bbca46d72f952aa5c83" + ], + "layout": "IPY_MODEL_8a75fd69f0324cde94e4250adbf6b1c9" + } + }, + "764ccc6a164e4230afc7542168c66a8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e012c027c4394690aaa0092df279d934", + "placeholder": "​", + "style": "IPY_MODEL_9eccb73fa6004bfca88549eb33d5c7f8", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "a11b7e82dcb746ebb08fab45da17be5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_16b2b5f60f874896b7834ee41f41d1db", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_78134bba456a448d960f55b54a4df0b4", + "value": 751504 + } + }, + "d0a26f193e3d4bbca46d72f952aa5c83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bedf16d0a93a42019a3971b4a6b3a8ad", + "placeholder": "​", + "style": "IPY_MODEL_97fbe0677ea84a318d0b9c713013fef9", + "value": " 752k/752k [00:00<00:00, 1.19MB/s]" + } + }, + "8a75fd69f0324cde94e4250adbf6b1c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e012c027c4394690aaa0092df279d934": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9eccb73fa6004bfca88549eb33d5c7f8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "16b2b5f60f874896b7834ee41f41d1db": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "78134bba456a448d960f55b54a4df0b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bedf16d0a93a42019a3971b4a6b3a8ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "97fbe0677ea84a318d0b9c713013fef9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "36cc854c669f44bc85a37d708a27b2ae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ccf8d25ac6e34a0faf7226c4109a571a", + "IPY_MODEL_cb9b2de1687e46d09e44a1b8d6b316c2", + "IPY_MODEL_bca3ddc918434d84a31498d284400c28" + ], + "layout": "IPY_MODEL_d520e508c89449fb9795d721f43d93b5" + } + }, + "ccf8d25ac6e34a0faf7226c4109a571a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e7a5ca4ca8cf403d8f8c5404269f7fde", + "placeholder": "​", + "style": "IPY_MODEL_76cefa5bb4a24d1f9ba5b5f3aede7a92", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "cb9b2de1687e46d09e44a1b8d6b316c2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c14e1e88ac9c4ebea4df6764e26d317c", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b2ebe96e233a43adb18d52cccce39dba", + "value": 173 + } + }, + "bca3ddc918434d84a31498d284400c28": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7bd9d93bd99e40cca8e701bb50f3f0fb", + "placeholder": "​", + "style": "IPY_MODEL_b985a1a576774607bf205de2a30aaf0c", + "value": " 173/173 [00:00<00:00, 14.0kB/s]" + } + }, + "d520e508c89449fb9795d721f43d93b5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e7a5ca4ca8cf403d8f8c5404269f7fde": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "76cefa5bb4a24d1f9ba5b5f3aede7a92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c14e1e88ac9c4ebea4df6764e26d317c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b2ebe96e233a43adb18d52cccce39dba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7bd9d93bd99e40cca8e701bb50f3f0fb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b985a1a576774607bf205de2a30aaf0c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "109505da6b0f4464aab035b410b1e156": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e68da79ecc304fbda9fd988e3a4472c5", + "IPY_MODEL_1d839974325744f594f22a5cb8c47223", + "IPY_MODEL_c4ea9bee06294000a176fb4db1e0bca6" + ], + "layout": "IPY_MODEL_e4dcc950c9064f488cf267ed10c949c2" + } + }, + "e68da79ecc304fbda9fd988e3a4472c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f596eba71ba64a509f2537fafd82a8dc", + "placeholder": "​", + "style": "IPY_MODEL_ea57c949c3b14925b725066e1e68594e", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "1d839974325744f594f22a5cb8c47223": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_212c1e3e34294785ba0bfb555dd6d4ad", + "max": 375, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fbcb67df6a344c34874de5d2c1fd1792", + "value": 375 + } + }, + "c4ea9bee06294000a176fb4db1e0bca6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_78c279b4ac444b7da318b3cc6cc9d870", + "placeholder": "​", + "style": "IPY_MODEL_e924e67dfcbb490c97b793d012d37dba", + "value": " 375/375 [00:00<00:00, 18.3kB/s]" + } + }, + "e4dcc950c9064f488cf267ed10c949c2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f596eba71ba64a509f2537fafd82a8dc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ea57c949c3b14925b725066e1e68594e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "212c1e3e34294785ba0bfb555dd6d4ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fbcb67df6a344c34874de5d2c1fd1792": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "78c279b4ac444b7da318b3cc6cc9d870": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e924e67dfcbb490c97b793d012d37dba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f801c9352ff1492f92da2d18cf4b6bde": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_59b847e47b1d4d708b1ca589d842c17c", + "IPY_MODEL_2f0ed7d4395545498fc98d6f0c16cd32", + "IPY_MODEL_d65b52eb1c61429cb4b94b8712dbc950" + ], + "layout": "IPY_MODEL_f67b2ebcb49343818eadeea6450dfe2a" + } + }, + "59b847e47b1d4d708b1ca589d842c17c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dffeb6ace5d64fbd8008ae089b80f06f", + "placeholder": "​", + "style": "IPY_MODEL_4be5360d35554e859f529f945c215a41", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "2f0ed7d4395545498fc98d6f0c16cd32": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_66e33eba5ec1429583678e6947736b95", + "max": 248477, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e847471da91f4f29a5626f432f8a4020", + "value": 248477 + } + }, + "d65b52eb1c61429cb4b94b8712dbc950": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e8d474f7bb5248d2b8ff1bca96b5206c", + "placeholder": "​", + "style": "IPY_MODEL_50a314c64eae4daabf8b5a078b74a2a6", + "value": " 248k/248k [00:00<00:00, 1.18MB/s]" + } + }, + "f67b2ebcb49343818eadeea6450dfe2a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dffeb6ace5d64fbd8008ae089b80f06f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4be5360d35554e859f529f945c215a41": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "66e33eba5ec1429583678e6947736b95": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e847471da91f4f29a5626f432f8a4020": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e8d474f7bb5248d2b8ff1bca96b5206c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "50a314c64eae4daabf8b5a078b74a2a6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a97b8cc75d74828b853d09b43300734": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_8b9f305975da4bcd9e3fe15630975e4c", + "IPY_MODEL_737ddcd484d644069213c24fa5e1eac2", + "IPY_MODEL_ab3d48b9025e4400aaa9ecbaeeb06299" + ], + "layout": "IPY_MODEL_6148576ce5a6468ea3c6f96779609c00" + } + }, + "8b9f305975da4bcd9e3fe15630975e4c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1f2dccf4784446f68adb4b2271934068", + "placeholder": "​", + "style": "IPY_MODEL_efe0e408da784f3c9cbfad1a3259a2dc", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "737ddcd484d644069213c24fa5e1eac2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2bddec1a008345fa96389371feb5c703", + "max": 751504, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c7a2a72b5ebc48ff946b4e4fe309cb7f", + "value": 751504 + } + }, + "ab3d48b9025e4400aaa9ecbaeeb06299": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_90917be6bb2347f2bb0f1585c679401b", + "placeholder": "​", + "style": "IPY_MODEL_f7953b75bfe2473cbbf0ba0b12084efb", + "value": " 752k/752k [00:00<00:00, 3.55MB/s]" + } + }, + "6148576ce5a6468ea3c6f96779609c00": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1f2dccf4784446f68adb4b2271934068": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "efe0e408da784f3c9cbfad1a3259a2dc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2bddec1a008345fa96389371feb5c703": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c7a2a72b5ebc48ff946b4e4fe309cb7f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "90917be6bb2347f2bb0f1585c679401b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f7953b75bfe2473cbbf0ba0b12084efb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "048ec54d70fe4a509f74bc351d8019fa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cece75dadfe34dc29e63e4a6dc1b598d", + "IPY_MODEL_ed01c515ab7845c38969200931734a8f", + "IPY_MODEL_63d4c118424e481d8ce4f3fb876914bf" + ], + "layout": "IPY_MODEL_ae206a6008ca4818acfcdf8b73fba0f7" + } + }, + "cece75dadfe34dc29e63e4a6dc1b598d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f72c2db5c3624c26b68ed073ade0739d", + "placeholder": "​", + "style": "IPY_MODEL_643d9d6b4f4e44ffbfb64e10230e3041", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "ed01c515ab7845c38969200931734a8f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e67ea28fcf14a3cbfad5b12834702d6", + "max": 173, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_82d4780447df49829a598538484ee7e3", + "value": 173 + } + }, + "63d4c118424e481d8ce4f3fb876914bf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_606cc334601e4c6ebdd62b5dbbd9dba3", + "placeholder": "​", + "style": "IPY_MODEL_fde7538b33d44263b71d529ef4dfe5c6", + "value": " 173/173 [00:00<00:00, 8.94kB/s]" + } + }, + "ae206a6008ca4818acfcdf8b73fba0f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f72c2db5c3624c26b68ed073ade0739d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "643d9d6b4f4e44ffbfb64e10230e3041": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4e67ea28fcf14a3cbfad5b12834702d6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "82d4780447df49829a598538484ee7e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "606cc334601e4c6ebdd62b5dbbd9dba3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fde7538b33d44263b71d529ef4dfe5c6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e6dce7e4829b4689a2c3cf86cf4384ba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_008d4a83a1c64ea2bd938a78bba59d5f", + "IPY_MODEL_efd95703dccb4f30834e3e26b1bc355e", + "IPY_MODEL_0dcec34d40374f6cba16f30aab183953" + ], + "layout": "IPY_MODEL_74770bf2a57348c0ac16dd6619a8c86d" + } + }, + "008d4a83a1c64ea2bd938a78bba59d5f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6c8c01e4db904a019957a26da2957bf7", + "placeholder": "​", + "style": "IPY_MODEL_8805b35f396545b686f918ec2ea1edf3", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "efd95703dccb4f30834e3e26b1bc355e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_605d392a7d2a4cd5b85e632057041385", + "max": 616, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d8ef2574e20746a893e2b87f25694966", + "value": 616 + } + }, + "0dcec34d40374f6cba16f30aab183953": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_70fce17f9a9848d98f00fb5d85512e97", + "placeholder": "​", + "style": "IPY_MODEL_b725a47baaaf4cf49ae44ef82697d652", + "value": " 616/616 [00:00<00:00, 44.4kB/s]" + } + }, + "74770bf2a57348c0ac16dd6619a8c86d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6c8c01e4db904a019957a26da2957bf7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8805b35f396545b686f918ec2ea1edf3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "605d392a7d2a4cd5b85e632057041385": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d8ef2574e20746a893e2b87f25694966": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "70fce17f9a9848d98f00fb5d85512e97": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b725a47baaaf4cf49ae44ef82697d652": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8c9f1051e90c4222924af3ac004e70af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_963b1cdf94e64114b2911a1a43ed5fac", + "IPY_MODEL_25c080fad710488281bef0dd0e0c09c6", + "IPY_MODEL_b5eafc0b43844767ba3cdfbf225479e3" + ], + "layout": "IPY_MODEL_3953720dcc724bf7ae56ef88b3fadf02" + } + }, + "963b1cdf94e64114b2911a1a43ed5fac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_758741b553894d928e48428f285aa554", + "placeholder": "​", + "style": "IPY_MODEL_c79f2c6c905e469292ed6af7345fea3b", + "value": "Downloading (…)tencepiece.bpe.model: 100%" + } + }, + "25c080fad710488281bef0dd0e0c09c6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_78095a6716024141a82f7f643836bac3", + "max": 5069051, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ffc86b8e357e4225ae3f353b57a64783", + "value": 5069051 + } + }, + "b5eafc0b43844767ba3cdfbf225479e3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_968e79bef9944067bf0f12f557318429", + "placeholder": "​", + "style": "IPY_MODEL_7fdc53fd54e04fff9d7ea20abeb75a5d", + "value": " 5.07M/5.07M [00:00<00:00, 8.03MB/s]" + } + }, + "3953720dcc724bf7ae56ef88b3fadf02": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "758741b553894d928e48428f285aa554": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c79f2c6c905e469292ed6af7345fea3b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "78095a6716024141a82f7f643836bac3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ffc86b8e357e4225ae3f353b57a64783": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "968e79bef9944067bf0f12f557318429": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7fdc53fd54e04fff9d7ea20abeb75a5d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c4bb1d422fca4f839b5adb42ce7f9932": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f2be641755d04335a4efdd30a21de1ec", + "IPY_MODEL_d500010b5a0a44d5be107c3dfe4bdc67", + "IPY_MODEL_6aa5f8427f86489ba9bf7b29306568ac" + ], + "layout": "IPY_MODEL_78c672dcb2a84c679a4c1268149f7916" + } + }, + "f2be641755d04335a4efdd30a21de1ec": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0176c86ef802424e8a0be51a775f6a6f", + "placeholder": "​", + "style": "IPY_MODEL_34be8750f2264bb2accd4d5e469e3fd7", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "d500010b5a0a44d5be107c3dfe4bdc67": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_522bf04451424070be58baa6ea546ee2", + "max": 9096718, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d673f7ecc3224ff581ac592a515a8217", + "value": 9096718 + } + }, + "6aa5f8427f86489ba9bf7b29306568ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1650f6430e544abc9c708ad162d88040", + "placeholder": "​", + "style": "IPY_MODEL_95bacaa3ed4744499a33db615d5da6bc", + "value": " 9.10M/9.10M [00:00<00:00, 10.6MB/s]" + } + }, + "78c672dcb2a84c679a4c1268149f7916": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0176c86ef802424e8a0be51a775f6a6f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "34be8750f2264bb2accd4d5e469e3fd7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "522bf04451424070be58baa6ea546ee2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d673f7ecc3224ff581ac592a515a8217": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1650f6430e544abc9c708ad162d88040": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "95bacaa3ed4744499a33db615d5da6bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b79cd2a7a6fb490183d4e3454b8bf61f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c1b533d4eb464df8b6a697b2eeee50cd", + "IPY_MODEL_fed9189d75e4400e9cbf6af091e9ab6c", + "IPY_MODEL_7c64230bd8354c7da7f8ba40fb18d244" + ], + "layout": "IPY_MODEL_e5105e48878545f899a995b7a19a526c" + } + }, + "c1b533d4eb464df8b6a697b2eeee50cd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dae8c2e3d4df4c1c9c394ca8db948f7e", + "placeholder": "​", + "style": "IPY_MODEL_f3d7596cd7f442108b0f300a97432b9e", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "fed9189d75e4400e9cbf6af091e9ab6c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8d2368144ac54bb8bf5eea46ae20e582", + "max": 28, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_6087f9058e2a4cb683e73ede9985ba0f", + "value": 28 + } + }, + "7c64230bd8354c7da7f8ba40fb18d244": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e4d90b843113418f8ad39cebac91cad6", + "placeholder": "​", + "style": "IPY_MODEL_d6993e6319f64dd3a1531ca1812dc399", + "value": " 28.0/28.0 [00:00<00:00, 1.89kB/s]" + } + }, + "e5105e48878545f899a995b7a19a526c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dae8c2e3d4df4c1c9c394ca8db948f7e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f3d7596cd7f442108b0f300a97432b9e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8d2368144ac54bb8bf5eea46ae20e582": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6087f9058e2a4cb683e73ede9985ba0f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e4d90b843113418f8ad39cebac91cad6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d6993e6319f64dd3a1531ca1812dc399": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9e311b6073454fbaa1a978ffeff8e6df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_99ebac6b399f4ec1a78f4724b8450c6d", + "IPY_MODEL_f8a359d73f214f04bdbe2c40a65e18bc", + "IPY_MODEL_c0ed1c0c238440558c134a9c6a4adfc1" + ], + "layout": "IPY_MODEL_d55828c2f0bf43cf9174693ec21b943c" + } + }, + "99ebac6b399f4ec1a78f4724b8450c6d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3c1edbdb5f54438f9a7ba0ac211ad8c3", + "placeholder": "​", + "style": "IPY_MODEL_0e93be16aa2b4caa887a7fe2a042fad6", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "f8a359d73f214f04bdbe2c40a65e18bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e7f0be2962db455d9b377b41cb860b5c", + "max": 625, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d4ce6bd48c5e4589a987b413143980b9", + "value": 625 + } + }, + "c0ed1c0c238440558c134a9c6a4adfc1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fa0a160cdcbc4650a833829071ad2eb7", + "placeholder": "​", + "style": "IPY_MODEL_b708d01208c34885a2bf1ba4325893f3", + "value": " 625/625 [00:00<00:00, 15.3kB/s]" + } + }, + "d55828c2f0bf43cf9174693ec21b943c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3c1edbdb5f54438f9a7ba0ac211ad8c3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0e93be16aa2b4caa887a7fe2a042fad6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e7f0be2962db455d9b377b41cb860b5c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4ce6bd48c5e4589a987b413143980b9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "fa0a160cdcbc4650a833829071ad2eb7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b708d01208c34885a2bf1ba4325893f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e2df55b1f3db4f24af648f5e129f0825": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b4c3fe1da5604b48aa8e9ec1ee767f84", + "IPY_MODEL_7a51cb21a8fb47b1a18d867d01f4128a", + "IPY_MODEL_fb8de23dbba34e518daaa54895b4b8fb" + ], + "layout": "IPY_MODEL_a4a0f00e1e44457db1ee8c14b900efb6" + } + }, + "b4c3fe1da5604b48aa8e9ec1ee767f84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0bf796104ab347419b421aba80e2ea5e", + "placeholder": "​", + "style": "IPY_MODEL_8ed1b4ca0aee424098570b9d8b03e5b0", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "7a51cb21a8fb47b1a18d867d01f4128a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f55fdfd49ee8474980d2ba1bef0c2733", + "max": 871891, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_570805a38b0149adb37596f90fdd5f39", + "value": 871891 + } + }, + "fb8de23dbba34e518daaa54895b4b8fb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0dccee61f95a4440bf896c4f7839c90e", + "placeholder": "​", + "style": "IPY_MODEL_dc55bc95895048c68b595bb62e417350", + "value": " 872k/872k [00:00<00:00, 1.37MB/s]" + } + }, + "a4a0f00e1e44457db1ee8c14b900efb6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0bf796104ab347419b421aba80e2ea5e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8ed1b4ca0aee424098570b9d8b03e5b0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f55fdfd49ee8474980d2ba1bef0c2733": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "570805a38b0149adb37596f90fdd5f39": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0dccee61f95a4440bf896c4f7839c90e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dc55bc95895048c68b595bb62e417350": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c0da66b3026d48aa96fa9c551e65f3df": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2edbf2b488604680b4576c5036d2294e", + "IPY_MODEL_52349d67ea8e459ba5e4624af5b5101f", + "IPY_MODEL_378b2512547a432c96a7cbfbcaaa0b10" + ], + "layout": "IPY_MODEL_35f98de8bd3d46898a67761b6fe62b03" + } + }, + "2edbf2b488604680b4576c5036d2294e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a3a9cb9b3e84565bffdf683a213903b", + "placeholder": "​", + "style": "IPY_MODEL_1c98373c13b640c68fb607e7970247a9", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "52349d67ea8e459ba5e4624af5b5101f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5f791941a45c4bf691deb7c8c48552cc", + "max": 1715180, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aaa92270fdc64d5d9c9f5e84f9284f0a", + "value": 1715180 + } + }, + "378b2512547a432c96a7cbfbcaaa0b10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ddbfa7dd6e8a43a8a4147c50e33a4548", + "placeholder": "​", + "style": "IPY_MODEL_4b132f43e5b749dd84dc614abbe76672", + "value": " 1.72M/1.72M [00:01<00:00, 1.64MB/s]" + } + }, + "35f98de8bd3d46898a67761b6fe62b03": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a3a9cb9b3e84565bffdf683a213903b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1c98373c13b640c68fb607e7970247a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5f791941a45c4bf691deb7c8c48552cc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aaa92270fdc64d5d9c9f5e84f9284f0a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ddbfa7dd6e8a43a8a4147c50e33a4548": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4b132f43e5b749dd84dc614abbe76672": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1fd7f1e2b00a4b6eb3ddfdfc150059d3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_62399a7de6f1460ea5dccb05d44c4cc1", + "IPY_MODEL_b802ad8d5f53420cad376fc42e290260", + "IPY_MODEL_c60e0c4265ce46d98b213eac941d0ee1" + ], + "layout": "IPY_MODEL_f3aa47355778482aae55c3b44aca4273" + } + }, + "62399a7de6f1460ea5dccb05d44c4cc1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ba688b1063d7483ba4b30e900b14385b", + "placeholder": "​", + "style": "IPY_MODEL_e1af7116138049deb3dbfa89d8a260bb", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "b802ad8d5f53420cad376fc42e290260": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7a4c1373a8de446081d028bf12edb4c2", + "max": 426, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_71b518ae1c4443139d3950078842fd68", + "value": 426 + } + }, + "c60e0c4265ce46d98b213eac941d0ee1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_da6ec0e73d414b248f19bad266b3148b", + "placeholder": "​", + "style": "IPY_MODEL_dfa5c351c3574593a5561885b7422f8c", + "value": " 426/426 [00:00<00:00, 24.0kB/s]" + } + }, + "f3aa47355778482aae55c3b44aca4273": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ba688b1063d7483ba4b30e900b14385b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e1af7116138049deb3dbfa89d8a260bb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7a4c1373a8de446081d028bf12edb4c2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "71b518ae1c4443139d3950078842fd68": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "da6ec0e73d414b248f19bad266b3148b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dfa5c351c3574593a5561885b7422f8c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "72bf2b77001b4c0697dc0a7032eb27c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_54f9964ac1b540438eed60c5fcb1831d", + "IPY_MODEL_8e0a0a7735c84fdab60b8952ffebd433", + "IPY_MODEL_ffe65bc47d2b4948b81fbda1526ea299" + ], + "layout": "IPY_MODEL_27ebca023c1048f29f8ff05735e5e25a" + } + }, + "54f9964ac1b540438eed60c5fcb1831d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5aca4ceb73634249945884be389514d0", + "placeholder": "​", + "style": "IPY_MODEL_ae36612dc22948408953ef4126f63822", + "value": "Downloading pytorch_model.bin: 100%" + } + }, + "8e0a0a7735c84fdab60b8952ffebd433": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8bf1ae25ff6143ef99728b35156e4227", + "max": 368792146, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_859f6226c2d34f1aa8463797f62e7b4e", + "value": 368792146 + } + }, + "ffe65bc47d2b4948b81fbda1526ea299": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_866496e3cd964d6aaf8abb2321586b21", + "placeholder": "​", + "style": "IPY_MODEL_7e411a6f162b40cb9de440f1c5939a2e", + "value": " 369M/369M [00:01<00:00, 259MB/s]" + } + }, + "27ebca023c1048f29f8ff05735e5e25a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5aca4ceb73634249945884be389514d0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ae36612dc22948408953ef4126f63822": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8bf1ae25ff6143ef99728b35156e4227": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "859f6226c2d34f1aa8463797f62e7b4e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "866496e3cd964d6aaf8abb2321586b21": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7e411a6f162b40cb9de440f1c5939a2e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "기존 코드는 GPU에 너무 큰 부담을 줌\n", + "그래서 앙상블 대신 monologg/kobert 모델만 사용하되, 이전에 했떤 코드를 필사하면서 진행" + ], + "metadata": { + "id": "wr83NCEJ5Ddb" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "z-OdlouOytXq", + "outputId": "9088b195-b68d-4c9b-b10f-43e1396ffd5b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting torch_optimizer\n", + " Downloading torch_optimizer-0.3.0-py3-none-any.whl (61 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m61.9/61.9 kB\u001b[0m \u001b[31m315.6 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: torch>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from torch_optimizer) (2.0.0+cu118)\n", + "Collecting pytorch-ranger>=0.1.1 (from torch_optimizer)\n", + " Downloading pytorch_ranger-0.1.1-py3-none-any.whl (14 kB)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (3.12.0)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (4.5.0)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (1.11.1)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (3.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (3.1.2)\n", + "Requirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.5.0->torch_optimizer) (2.0.0)\n", + "Requirement already satisfied: cmake in /usr/local/lib/python3.10/dist-packages (from triton==2.0.0->torch>=1.5.0->torch_optimizer) (3.25.2)\n", + "Requirement already satisfied: lit in /usr/local/lib/python3.10/dist-packages (from triton==2.0.0->torch>=1.5.0->torch_optimizer) (16.0.2)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.5.0->torch_optimizer) (2.1.2)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.5.0->torch_optimizer) (1.3.0)\n", + "Installing collected packages: pytorch-ranger, torch_optimizer\n", + "Successfully installed pytorch-ranger-0.1.1 torch_optimizer-0.3.0\n" + ] + } + ], + "source": [ + "#torch_optimizer : 파이토치 기반. 딥러닝 모델 최적화를 위한 여러 알고리즘 제공\n", + "!pip install torch_optimizer" + ] + }, + { + "cell_type": "code", + "source": [ + "#transformers : 딥러닝 NLP 모델 구현 라이브러리\n", + "#사전 훈련(pre-trained) 언어 모델(LM)을 제공하고, 이후에 이걸 특정 자연어 처리 업무에 맞게 fine-tunning을 하는 것임\n", + "!pip install transformers" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0R8EkYlwzrmz", + "outputId": "b77aefd6-904f-4df1-dd4b-094f131167a0" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting transformers\n", + " Downloading transformers-4.28.1-py3-none-any.whl (7.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.0/7.0 MB\u001b[0m \u001b[31m67.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n", + "Collecting huggingface-hub<1.0,>=0.11.0 (from transformers)\n", + " Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m31.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n", + "Collecting tokenizers!=0.11.3,<0.14,>=0.11.1 (from transformers)\n", + " Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m107.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n", + "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n", + "Installing collected packages: tokenizers, huggingface-hub, transformers\n", + "Successfully installed huggingface-hub-0.14.1 tokenizers-0.13.3 transformers-4.28.1\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "- pre-trained\n", + " - 사전 학습 모델 : 대규모 데이터셋에서 미리 학습된 모델\n", + " - 다른 자연어 처리 task에서도 유용하게 됨.\n", + " - 학습시간을 줄이고 소규모 데이터셋에서도 고성능 결과 얻을 수 있음\n", + "- fine-tunning\n", + " - 사전 훈련 모델을 사용해 특정 자연어 처리 업무에 맞는 모델을 만드는 과정" + ], + "metadata": { + "id": "_zb_a3cmz98y" + } + }, + { + "cell_type": "markdown", + "source": [ + "# 시작" + ], + "metadata": { + "id": "gXcvawLJ0YIC" + } + }, + { + "cell_type": "code", + "source": [ + "#importing libraries\n", + "import numpy as np\n", + "import os\n", + "import pickle\n", + "import sys\n", + "import pandas as pd\n", + "import re\n", + "import cv2" + ], + "metadata": { + "id": "XFgKGsjcz6J4" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "- pickle : 파이썬 객체를 직렬화/역직렬화 하기 위한 모듈. 파이썬 객체를 디스크에 저장하고 로드할 수 있는 기능\n", + "- sys : '인터프리터가 쓰거나 유지 및 관리하는 일부변수'와 인터프리터 간 상호작용 함수를 제공\n", + "- OpenCV(cv2) : 컴퓨터 비전 및 이미지 처리를 위한 라이브러리" + ], + "metadata": { + "id": "KYUq_8RJ0xuF" + } + }, + { + "cell_type": "code", + "source": [ + "import torch #인공신경망 네트워크를 설계할 때 쓰는 오픈 소스 머신러닝 프레임워크, 파이토치.\n", + "#tensor 연산자, 인공신경망 모델, 여러 최적화 알고리즘을 제공함\n", + "import torch.cuda.amp as amp\n", + "#Automatic Mixed Precision\n", + "#: 단정밀도 및 반정밀도 부동 소수점 연산의 조합을 씀 -> GPU 메모리 사용량을 줄이고 학습 속도를 높임" + ], + "metadata": { + "id": "Og_GTAaM0VoS" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import torch.nn as nn\n", + "#파이토치의 Neural Network 모듈" + ], + "metadata": { + "id": "MJxZWuk6wo1v" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from torch.optim.optimizer import Optimizer, required\n", + "#Optimizer : 최적화 알고리즘을 파이토치에서 구현 및 사용하고자 제공되는 공통 인터페이스를 가져옴\n", + "#required : 함수에 필요한 인수를 지정할 때 사용되는 필수 함수를 가져옴\n", + "import torch_optimizer as optim\n", + "#torch_optimizer : 파이토치용 서드 파티 라이브러리. 추가 최적화 알고리즘을 제공함." + ], + "metadata": { + "id": "6kpmYkGs7QW2" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#데이터 로딩을 위한 라이브러리들#\n", + "\n", + "\n", + "from torch.utils.data import DataLoader\n", + "#DataLoader : 파이토치 데이터셋에 대한 반복자를 제공\n", + "# -> 데이터셋에서 한 번에 하나의 샘플을 가져와 처리하기보다 배치 단위로 처리하는 게 효율적이라서\n", + "# 데이터셋의 모든 샘플을 각 반복자가 데이터셋의 한 배치를 순차적으로 반환해줌.\n", + "\n", + "from torch.utils.data.dataset import Dataset\n", + "#Dataset : 파이토치에서 데이터셋을 나타내는 추상 클래스\n", + "#데이터 샘플에 대한 액세스를 제공하기 위해 어떤 하위 클래스든지 __len__ 및 __getitem__ 두 가지 메서드를 구현해야 함\n", + "##그래서 이후 model 코드 작성할 때 두 메서드 구현하는 내용이 나옴.\n", + "\n", + "from torch.utils.data.sampler import *\n", + "#Sampler: 데이터셋에서 요소를 샘플링하는 전략을 나타내는 추상 클래스\n", + "# DataLoader 클래스와 함께 사용하여 데이터 로드 중 샘플링 동작을 사용자 정의할 수 있음\n", + "'''\n", + "파이토치는 RandomSampler(요소를 무작위로 샘플링),\n", + "SequentialSampler(요소를 순차적으로 샘플링) 및 SubsetRandomSampler(요소의 일부를 무작위로 샘플링)\n", + "과 같은 Sampler 클래스의 여러 구현을 제공함'''" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "id": "ojWp5EvN0Vk4", + "outputId": "01bd8c0b-8224-4396-f8ec-a2fd3169893d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'\\n파이토치는 RandomSampler(요소를 무작위로 샘플링), \\nSequentialSampler(요소를 순차적으로 샘플링) 및 SubsetRandomSampler(요소의 일부를 무작위로 샘플링)\\n과 같은 Sampler 클래스의 여러 구현을 제공함'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 7 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import math\n", + "#수학적인 함수 및 상수를 제공\n", + "\n", + "from collections import defaultdict\n", + "#collections.defaultdict : 기본값을 갖는 딕셔너리.\n", + "#딕셔너리에 존재하지 않는 키를 조회하면 딕셔너리에 있는 기본값을 반환해줌으로써\n", + "#KeyError를 방지하고 코드를 더 간결하게 만듦\n", + "\n", + "import itertools as it\n", + "#반복자(iterator)를 생성하고 연산하는 함수들의 모음\n", + "#반복적인 작업을 진행할 때 메모리 사용량을 최소화할 수 있음\n", + "\n", + "import tqdm\n", + "#진행 바 같은 걸 시각화해줌" + ], + "metadata": { + "id": "4B0bQfct0Via" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import random #난수 생성, 무작위 샘플링에서 사용됨\n", + "import matplotlib.pyplot as plt #시각화를 위함\n", + "from timeit import default_timer as timer\n", + "#코드 실행 시간을 측정하는 함수 제공해서, 알고리즘 효율성을 파악할 수 있음" + ], + "metadata": { + "id": "vkgBuBXn0Vbt" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.model_selection import KFold #kfold\n", + "from sklearn.metrics import f1_score #f1-score\n", + "from sklearn.preprocessing import LabelEncoder #라벨인코딩.\n", + "from sklearn.preprocessing import StandardScaler #표준화\n", + "\n", + "from sklearn.metrics import accuracy_score #정확도 측정" + ], + "metadata": { + "id": "V2gPbR1R0VYN" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#transformer 모델들과 tokenizer를 import\n", + "##모델들은 다 사전학습되어있음.\n", + "from transformers import XLMPreTrainedModel, XLMRobertaModel, XLMRobertaConfig, XLMRobertaTokenizer\n", + "#XLMPreTrainedModel : XLM 모델을 기반으로 하는 모든 Pretrained Model의 베이스 클래스\n", + "\n", + "\n", + "from transformers import XLMRobertaForSequenceClassification, BertForSequenceClassification\n", + "from transformers import AutoTokenizer\n", + "from transformers import BertForSequenceClassification, DistilBertForSequenceClassification, XLNetForSequenceClassification,\\\n", + "XLMRobertaForSequenceClassification, XLMForSequenceClassification, RobertaForSequenceClassification" + ], + "metadata": { + "id": "UoCed-c00VWH" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#AdamW 최적화 알고리즘을 사용\n", + "from transformers import AdamW\n", + "#학습률 조절에 사용하는 함수\n", + "from transformers import get_linear_schedule_with_warmup" + ], + "metadata": { + "id": "amuHC6En0VT1" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# class args\n", + "class args: #여러 학습 인자의 값을 설정\n", + " # ---- factor ---- #\n", + " debug=False #디버그 모드 여부\n", + " amp = True #mixed precision을 사용할 지 여부\n", + " gpu = '0' #GPU 번호\n", + "\n", + " epochs=10 #에포크 수\n", + " batch_size=1 #배치 크기\n", + " weight_decay=1e-6 #가중치 감소 값\n", + " n_fold=5 #교차 검증(fold) 수\n", + " fold=3 # [0, 1, 2, 3, 4] # 원래는 3\n", + "\n", + " exp_name = 'experiment_name_folder'\n", + " dir_ = f'./saved_models/'\n", + " pt = 'your_model_name'\n", + " max_len = 33 #모델 입력 시퀀스의 최대 길이 설정\n", + " #학습률을 설정하는 파라미터\n", + " start_lr = 1e-5#1e-3,5e-5 #학습시 초기학습률 값을 의미. 학습 초기에 빠르게 수렴할 가능성이 있지만, 값이 너무 크면 수렴이 불안정해짐\n", + " min_lr=1e-6 #학습 중 학습율이 더이상 작아지지 않게 제한하는 값. 해당 값 이하로 떨어지지 않게 보장함.\n", + " # ---- Dataset ---- #\n", + "\n", + " # ---- Else ---- #\n", + " num_workers=8\n", + " seed=2021\n", + " scheduler = None#모델의 학습률을 조정하는 방법을 지정. 방법은 사용하지 않겠지만, 다른 변수를 이용해 학습률 조정 방식을 선택할 수 있음.\n", + "\n", + "\n", + "data_dir = './' # 데이터가 저장된 디렉토리 경로를 나타냄\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"] = args.gpu #args.gpu : 코드 실행 시 지정된 GPU의 인덱스\n", + "device = torch.device(f\"cuda\" if torch.cuda.is_available() else \"cpu\") #디바이스 유형 설정.\n", + "#만약 CUDA 디바이스가 사용 가능하면 \"cuda\"로 설정하고, 그렇지 않으면 \"cpu\"로 설정함. 이를 통해 디바이스 유형에 맞게 모델을 초기화할 수 있음.\n", + "\n", + "##모델 학습 시 랜덤 시드를 설정해 재현성을 보장\n", + "def set_seeds(seed=42):\n", + " random.seed(seed)\n", + " os.environ['PYTHONHASHSEED'] = str(seed)\n", + " np.random.seed(seed)\n", + " torch.manual_seed(seed)\n", + " torch.cuda.manual_seed(seed)\n", + " torch.cuda.manual_seed_all(seed)\n", + " #torch.backends.cudnn : NVIDIA cuDNN 라이브러리를 사용해서 PyTorch 연산의 실행 속도를 높이는 데 사용됨.\n", + " #cuDNN : Deep Neural Network 라이브러리, NVIDIA GPU에서 딥러닝 모델을 학습 및 추론할 때 연산속도를 높이기 위한 최적화된 기능을 제공\n", + " #torch.backends.cudnn을 쓰면 이런 최적화를 활용해 PyTorch 연산 속도를 높일 수 있음.\n", + " torch.backends.cudnn.deterministic = True #기본값이 True. 연산 실행 시간을 단축하고자 cuDNN 라이브러리가 실행 시간을 측정하고 최적화를 수행하는 걸 의미\n", + " torch.backends.cudnn.benchmark = False # 연산 결과가 항상 동일하지 않을 수 있다는 걸 의미함. -> 연산 속도 및 학습을 빠르게함\n", + "\n", + "set_seeds(seed=args.seed)\n" + ], + "metadata": { + "id": "dJFCGJZ50VRR" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# - util - #\n", + "def get_learning_rate(optimizer): #현재 학습률을 가져와서 반환하는 함수\n", + " lr=[]\n", + " for param_group in optimizer.param_groups:\n", + " #param_groups : optimizer의 학습률과 weight decay 같은 하이퍼파라미터 관리\n", + " lr +=[ param_group['lr'] ]\n", + "\n", + " assert(len(lr)==1)\n", + " #'lr'의 길이가 1인지 확인하는데, 이건 현재 이 코드에서 하나의 학습률만 사용하기 때문임.\n", + " lr = lr[0]\n", + "\n", + " return lr\n", + "\n", + "def load_data(): #데이터 로드 합수\n", + " train=pd.read_csv('./train_data.csv')\n", + " test=pd.read_csv('./test_data.csv')\n", + "\n", + " #일부 column을 지정\n", + " train=train[['title','topic_idx']]\n", + " test=test[['title']]\n", + " #5-fold 교차 검증 수행\n", + " from sklearn.model_selection import StratifiedKFold\n", + " skf = StratifiedKFold(n_splits=5, random_state=42, shuffle=True)\n", + " train['fold'] = -1\n", + " for n_fold, (_,v_idx) in enumerate(skf.split(train, train['topic_idx'])):\n", + " train.loc[v_idx, 'fold'] = n_fold\n", + " #train 데이터에 fold와 id열을 추가\n", + " train['id'] = [x for x in range(len(train))]\n", + "\n", + " return train, test" + ], + "metadata": { + "id": "_xjzqVpL0VOu" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# 전처리" + ], + "metadata": { + "id": "dmD4Lb5YgyoF" + } + }, + { + "cell_type": "code", + "source": [ + "# make KoBertTokenizer\n", + "# 한글을 토큰화할 수 있는 KoBert 모델용 custom tokenizer를 만드는 데 사용함.\n", + "import logging\n", + "import os\n", + "import unicodedata #유니코드 문자 처리를 위함\n", + "from shutil import copyfile #파일 복사\n", + "\n", + "from transformers import PreTrainedTokenizer\n", + "\n", + "logger = logging.getLogger(__name__)\n", + "#logger : 스크립트 실행되는 동안 메세지를 기록하는 데 사용함.\n", + "# 로거명을 __name__로 설정하면 현재 모듈명을 로거의 이름으로 사용함\n", + "# 이렇게 하면 각 모듈이 자체 로거를 가질 수 있으므로 대규모 애플리케이션에서 로그 메세지를 더 잘 구성할 수 있음.\n", + "\n", + "VOCAB_FILES_NAMES = {\"vocab_file\": \"tokenizer_78b3253a26.model\", # 어휘파일의 위치 지정\n", + " \"vocab_txt\": \"vocab.txt\"} # 어휘에 대한 토큰-index mapping 사전을 구축하는 데 쓰임.\n", + "#PRETRAINED_VOCAB_FILES_MAP 변수를 정의하는 코드\n", + "# hugging face의 transformer 라이브러리에서 사용되고, 사전 학습된 모델의 tokenizer와 관련된 파일들의 URL을 매핑함\n", + "#즉, 해당 모델에 대한 토크나이저와 어휘파일을 쉽게 다운로드할 수 있음.\n", + "PRETRAINED_VOCAB_FILES_MAP = {\n", + " #vocab_file과 vocab_txt는 각각 토크나이저 파이과 어휘 파일의 URL을 가리키는 사전임\n", + " \"vocab_file\": {\n", + " \"monologg/kobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert/tokenizer_78b3253a26.model\",\n", + " #각각의 어휘파일의 링크가 제공됨.\n", + " #이 링크들은 Hugging Face에서 제공하는 S3 버킷에서 해당 어휘 파일을 다운로드할 수 있는 주소를 제공함.\n", + " \"monologg/kobert-lm\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert-lm/tokenizer_78b3253a26.model\",\n", + " \"monologg/distilkobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/distilkobert/tokenizer_78b3253a26.model\"\n", + " #세 개의 다른 모델명, 각각 해당 모델에 대한 토크나이저와 어휘 파일을 가짐.\n", + " },\n", + " \"vocab_txt\": {\n", + " \"monologg/kobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert/vocab.txt\",\n", + " \"monologg/kobert-lm\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/kobert-lm/vocab.txt\",\n", + " \"monologg/distilkobert\": \"https://s3.amazonaws.com/models.huggingface.co/bert/monologg/distilkobert/vocab.txt\"\n", + " }\n", + "}\n", + "\n", + "#KoBERT의 tokenizer와 관련된 변수들을 정의하는 부분\n", + "#positional embedding의 크기를 지정\n", + "PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {\n", + " \"monologg/kobert\": 512,\n", + " \"monologg/kobert-lm\": 512,\n", + " \"monologg/distilkobert\": 512\n", + "}\n", + "#초기화 설정값 지정.\n", + "PRETRAINED_INIT_CONFIGURATION = {\n", + " \"monologg/kobert\": {\"do_lower_case\": False}, #do_lower_case를 False로 설정하면 대소문자를 구분함.\n", + " \"monologg/kobert-lm\": {\"do_lower_case\": False},\n", + " \"monologg/distilkobert\": {\"do_lower_case\": False}\n", + "}\n", + "\n", + "SPIECE_UNDERLINE = u'▁'\n", + "#KOBERT tokenizer에서 사용되는 특수 토큰.\n", + "#\"__\"은 subword를 나타내며, 이는 단어 일부분이 다른 단어와 함께 subword 단위로 나눠지는 경우 사용됨.\n", + "\n", + "class KoBertTokenizer(PreTrainedTokenizer):\n", + " # KoBertTokenizer 클래스 : 문장 조각 기반 tokenizer를 구축하는 데 사용하는 transformer library의 PreTrainedTokenizer class를 상속받음\n", + " \"\"\"\n", + " SentencePiece based tokenizer. Peculiarities:\n", + " - requires `SentencePiece `_\n", + " \"\"\"\n", + " vocab_files_names = VOCAB_FILES_NAMES\n", + " pretrained_vocab_files_map = PRETRAINED_VOCAB_FILES_MAP\n", + " pretrained_init_configuration = PRETRAINED_INIT_CONFIGURATION\n", + " max_model_input_sizes = PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES\n", + "\n", + " def __init__(\n", + " self,\n", + " vocab_file,\n", + " vocab_txt,\n", + " do_lower_case=False,\n", + " remove_space=True,\n", + " keep_accents=False,\n", + " unk_token=\"[UNK]\",\n", + " sep_token=\"[SEP]\",\n", + " pad_token=\"[PAD]\",\n", + " cls_token=\"[CLS]\",\n", + " mask_token=\"[MASK]\",\n", + " **kwargs):\n", + " super().__init__(\n", + " unk_token=unk_token,\n", + " sep_token=sep_token,\n", + " pad_token=pad_token,\n", + " cls_token=cls_token,\n", + " mask_token=mask_token,\n", + " **kwargs\n", + " )\n", + "\n", + " # Build vocab\n", + " self.token2idx = dict()\n", + " self.idx2token = []\n", + " with open(vocab_txt, 'r', encoding='utf-8') as f:\n", + " #vocabtxt 파일을 열어서 어휘(vocabulary) 만듦.\n", + " #해당 텍스트 파일은 각 단어가 한 줄씩 적혀 있음\n", + " for idx, token in enumerate(f):\n", + " token = token.strip()\n", + " self.token2idx[token] = idx\n", + " self.idx2token.append(token)\n", + "\n", + " #self.max_len_single_sentence = self.max_len - 2 # take into account special tokens\n", + " #self.max_len_sentences_pair = self.max_len - 3 # take into account special tokens\n", + "\n", + " #sentencepiece 패키지를 이용해, SentencePiece모델 파일(tokenizer_78b3253a26.model)을 로드함.\n", + " #이 모델 파일은 BytePairEncoding 기반의 subword tokenization 정보를 담고 있으며,\n", + " #각 subwork token을 생서하기 위한 기준 정보를 담음\n", + " try:\n", + " import sentencepiece as spm\n", + " except ImportError:\n", + " logger.warning(\"You need to install SentencePiece to use KoBertTokenizer: https://github.com/google/sentencepiece\"\n", + " \"pip install sentencepiece\")\n", + "\n", + " #KoBertTokenizer 객체의 어휘 변수로 어휘 파일(vocab_txt), SentencePiece 모델 파일(vocab_file) 경로,\n", + " #대소문자 구분 여부(do_lower_case), 공백 제거 여부(remove_space), 악센트 유지 여부(keep_accents) 등이 저장됨\n", + " self.do_lower_case = do_lower_case\n", + " self.remove_space = remove_space\n", + " self.keep_accents = keep_accents\n", + " self.vocab_file = vocab_file\n", + " self.vocab_txt = vocab_txt\n", + "\n", + " self.sp_model = spm.SentencePieceProcessor() #sentencepiece 패키지를 사용하여 SentencePieceProcessor 객체를 초기화\n", + " self.sp_model.Load(vocab_file)\n", + "\n", + " @property\n", + " #메서드를 클래스 속성의 \"getter\"로 정의할 수 있는 파이썬 데코레이터.\n", + " #메서드 저의 앞에서 @property를 쓰면 해당 메서드를 클래스 인스턴스의 속성으로 접근 가능함.\n", + " #(ex. KoBertTokenizer 클래스에서 vocab_size는 속성이지만,\n", + " #KoBertTokenizer 인스턴스의 속성처럼 전근 가능하되 실제 토큰화 어휘의 길이를 반환하는 method)\n", + " def vocab_size(self):\n", + " return len(self.idx2token)\n", + "\n", + " def __getstate__(self):\n", + " state = self.__dict__.copy()\n", + " state[\"sp_model\"] = None\n", + " return state\n", + "\n", + " def __setstate__(self, d):\n", + " self.__dict__ = d\n", + " try:\n", + " import sentencepiece as spm\n", + " except ImportError:\n", + " logger.warning(\"You need to install SentencePiece to use KoBertTokenizer: https://github.com/google/sentencepiece\"\n", + " \"pip install sentencepiece\")\n", + " self.sp_model = spm.SentencePieceProcessor()\n", + " self.sp_model.Load(self.vocab_file)\n", + "\n", + " def preprocess_text(self, inputs):\n", + " if self.remove_space:\n", + " outputs = \" \".join(inputs.strip().split())\n", + " else:\n", + " outputs = inputs\n", + " outputs = outputs.replace(\"``\", '\"').replace(\"''\", '\"')\n", + "\n", + " if not self.keep_accents:\n", + " outputs = unicodedata.normalize('NFKD', outputs)\n", + " outputs = \"\".join([c for c in outputs if not unicodedata.combining(c)])\n", + " if self.do_lower_case:\n", + " outputs = outputs.lower()\n", + "\n", + " return outputs\n", + "\n", + " def _tokenize(self, text, return_unicode=True, sample=False):\n", + " \"\"\" Tokenize a string. \"\"\"\n", + " text = self.preprocess_text(text)\n", + "\n", + " if not sample:\n", + " pieces = self.sp_model.EncodeAsPieces(text)\n", + " else:\n", + " pieces = self.sp_model.SampleEncodeAsPieces(text, 64, 0.1)\n", + " new_pieces = []\n", + " for piece in pieces:\n", + " if len(piece) > 1 and piece[-1] == str(\",\") and piece[-2].isdigit():\n", + " cur_pieces = self.sp_model.EncodeAsPieces(piece[:-1].replace(SPIECE_UNDERLINE, \"\"))\n", + " if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE:\n", + " if len(cur_pieces[0]) == 1:\n", + " cur_pieces = cur_pieces[1:]\n", + " else:\n", + " cur_pieces[0] = cur_pieces[0][1:]\n", + " cur_pieces.append(piece[-1])\n", + " new_pieces.extend(cur_pieces)\n", + " else:\n", + " new_pieces.append(piece)\n", + "\n", + " return new_pieces\n", + "\n", + " def _convert_token_to_id(self, token):\n", + " \"\"\" 어휘를 사용하여 아이디의 토큰(문자열/유니코드)을 변환함 \"\"\"\n", + " return self.token2idx.get(token, self.token2idx[self.unk_token])\n", + "\n", + " def _convert_id_to_token(self, index, return_unicode=True):\n", + " \"\"\"어휘를 사용하여 인덱스(정수)를 토큰(문자열/유니코드)으로 변환함\"\"\"\n", + " return self.idx2token[index]\n", + "\n", + " def convert_tokens_to_string(self, tokens):\n", + " \"\"\"토큰 시퀀스(하위 단어의 문자열)를 단일 문자열로 변환함\"\"\"\n", + " out_string = \"\".join(tokens).replace(SPIECE_UNDERLINE, \" \").strip()\n", + " return out_string\n", + "\n", + " def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None):\n", + " \"\"\"\n", + " 특수 토큰을 연결하고 추가하여 시퀀스 또는 시퀀스 쌍에서 시퀀스 분류 작업을 위한 모델 입력을 구축함.\n", + " RoBERTa 시퀀스의 형식은 다음과 같다:\n", + " single sequence: [CLS] X [SEP]\n", + " pair of sequences: [CLS] A [SEP] B [SEP]\n", + " \"\"\"\n", + " if token_ids_1 is None:\n", + " return [self.cls_token_id] + token_ids_0 + [self.sep_token_id]\n", + " cls = [self.cls_token_id]\n", + " sep = [self.sep_token_id]\n", + " return cls + token_ids_0 + sep + token_ids_1 + sep\n", + "\n", + " def get_special_tokens_mask(self, token_ids_0, token_ids_1=None, already_has_special_tokens=False):\n", + " \"\"\"\n", + " 특수 토큰이 추가되지 않은 토큰 목록에서 시퀀스 ID를 검색함.\n", + " 이 메서드는 토큰화기 ``prepare_for_model`` 또는 ``encode_plus`` 메서드를 사용하여 특수 토큰을 추가할 때 호출됨.\n", + " Args:\n", + " token_ids_0: ID 목록(특수 토큰을 포함하지 않아야 함)\n", + " token_ids_1: 시퀀스 쌍에 대한 시퀀스 ID를 가져올 때 필요한 선택적 ID 목록(특수 토큰을 포함하지 않아야 함)\n", + " already_has_special_tokens: (default False) 토큰 목록이 모델에 대한 특수 토큰으로 이미 형식화되어 있으면 True로 설정\n", + " Returns:\n", + " [0, 1] 범위의 정수 목록: 특수 토큰은 0, 시퀀스 토큰은 1\n", + " \"\"\"\n", + "\n", + " if already_has_special_tokens:\n", + " if token_ids_1 is not None:\n", + " raise ValueError(\n", + " \"You should not supply a second sequence if the provided sequence of \"\n", + " \"ids is already formated with special tokens for the model.\"\n", + " )\n", + " return list(map(lambda x: 1 if x in [self.sep_token_id, self.cls_token_id] else 0, token_ids_0))\n", + "\n", + " if token_ids_1 is not None:\n", + " return [1] + ([0] * len(token_ids_0)) + [1] + ([0] * len(token_ids_1)) + [1]\n", + " return [1] + ([0] * len(token_ids_0)) + [1]\n", + "\n", + " def create_token_type_ids_from_sequences(self, token_ids_0, token_ids_1=None):\n", + " \"\"\"\n", + " 전달된 두 시퀀스로부터 시퀀스 쌍 분류 작업에 사용할 마스크를 만듦.\n", + " BERT 시퀀스 쌍 마스크의 형식은 다음과 같음:\n", + " 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1\n", + " | first sequence | second sequence\n", + " token_ids_1이 None이면 마스크의 첫 번째 부분(0)만 반환함\n", + " \"\"\"\n", + " sep = [self.sep_token_id]\n", + " cls = [self.cls_token_id]\n", + " if token_ids_1 is None:\n", + " return len(cls + token_ids_0 + sep) * [0]\n", + " return len(cls + token_ids_0 + sep) * [0] + len(token_ids_1 + sep) * [1]\n", + "\n", + " def save_vocabulary(self, save_directory):\n", + " \"\"\" 문장 조각 어휘(원본 파일 복사)와 특수 토큰 파일을 디렉토리에 저장\"\"\"\n", + " if not os.path.isdir(save_directory):\n", + " logger.error(\"Vocabulary path ({}) should be a directory\".format(save_directory))\n", + " return\n", + "\n", + " # 1. Save sentencepiece model\n", + " out_vocab_model = os.path.join(save_directory, VOCAB_FILES_NAMES[\"vocab_file\"])\n", + "\n", + " if os.path.abspath(self.vocab_file) != os.path.abspath(out_vocab_model):\n", + " copyfile(self.vocab_file, out_vocab_model)\n", + "\n", + " # 2. Save vocab.txt\n", + " index = 0\n", + " out_vocab_txt = os.path.join(save_directory, VOCAB_FILES_NAMES[\"vocab_txt\"])\n", + " with open(out_vocab_txt, \"w\", encoding=\"utf-8\") as writer:\n", + " for token, token_index in sorted(self.token2idx.items(), key=lambda kv: kv[1]):\n", + " if index != token_index:\n", + " logger.warning(\n", + " \"{}에 어휘 저장:어휘 인덱스가 연속적이지 않음.\"\n", + " \" 어휘가 손상되지 않았는지 확인하세요!\".format(out_vocab_txt)\n", + " )\n", + " index = token_index\n", + " writer.write(token + \"\\n\")\n", + " index += 1\n", + "\n", + " return out_vocab_model, out_vocab_txt" + ], + "metadata": { + "id": "WJTbZzMm0VMS" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#bert_tokenizer는 preprocessing_train() 및 preprocessing_test() 함수에서 각 문장을 토큰화 및 인코딩하는 데 사용됨.\n", + "#이 함수는 문장, MAX_LEN 매개변수, 토큰화 객체를 입력으로 받아 input_ids, attention_mask, token_type_ids 텐서를 반환함\n", + "def bert_tokenizer(sent, MAX_LEN, tokenizer):\n", + "\n", + " encoded_dict=tokenizer.encode_plus(\n", + " text = sent,\n", + " add_special_tokens=True,\n", + " max_length=MAX_LEN,\n", + " pad_to_max_length=True,\n", + " return_attention_mask=True,\n", + " truncation = True)\n", + "\n", + " input_id=encoded_dict['input_ids']\n", + " attention_mask=encoded_dict['attention_mask']\n", + " #token_type_id = encoded_dict['token_type_ids']\n", + " token_type_id = 0\n", + "\n", + " return input_id, attention_mask, token_type_id\n", + "#텍스트 분류 작업을 위해서, 각각 훈련데이터와 테스트 데이터의 전처리 단계를 수행하는\n", + "#preprocessing_train() 및 preprocessing_test()의 두 가지 함수를 정의\n", + "\n", + "'''\n", + "이 함수들은 BERT 기반 토큰화기를 사용하여 입력 텍스트를 토큰화하고\n", + "토큰을 BERT 기반 모델을 미세 조정하는 데 필요한 입력인 input_ids, attention_masks, token_type_ids로 인코딩함\n", + "\n", + "인코딩된 입력은 훈련 세트의 경우 train_data, 테스트 세트의 경우 test_data라는 딕셔너리에 저장된 다음 피클 파일 형식으로 디스크에 저장됨\n", + "파일 저장 경로는 사전 학습된 모델 이름 또는 디렉터리인 args.pt 매개변수를 기반으로 함.\n", + "'''\n", + "def preprocessing_train():\n", + "\n", + " pt = args.pt#'monologg/kobert'\n", + "\n", + " if 'kobert' in pt:\n", + " tokenizer = KoBertTokenizer.from_pretrained(pt, cache_dir='bert_ckpt', do_lower_case=False) #do_lower_case : 모든 문자를 소문자로 변환할지 여부설정\n", + " print('load kobert')\n", + " else:\n", + " tokenizer = AutoTokenizer.from_pretrained(args.pt)\n", + "\n", + " MAX_LEN = args.max_len\n", + " #MAX_LEN 매개변수는 입력 시퀀스의 최대 길이를 지정하며, 토큰화기는 이 길이에 맞게 시퀀스를 자르거나 패딩\n", + " train = pd.read_csv('./train_data.csv')\n", + " train=train[['title','topic_idx']]\n", + "\n", + " input_ids =[]\n", + " attention_masks =[]\n", + " token_type_ids =[]\n", + " train_data_labels = []\n", + "\n", + " for train_sent, train_label in tqdm.tqdm(zip(train['title'], train['topic_idx'])):\n", + " try:\n", + " input_id, attention_mask,_ = bert_tokenizer(train_sent, MAX_LEN=MAX_LEN, tokenizer=tokenizer)\n", + "\n", + " input_ids.append(input_id)\n", + " attention_masks.append(attention_mask)\n", + " token_type_ids.append(0)\n", + " #########################################\n", + " train_data_labels.append(train_label)\n", + "\n", + " except Exception as e:\n", + " print(e)\n", + " pass\n", + "\n", + " train_input_ids=np.array(input_ids, dtype=int)\n", + " train_attention_masks=np.array(attention_masks, dtype=int)\n", + " train_token_type_ids=np.array(token_type_ids, dtype=int)\n", + " ###########################################################\n", + " train_inputs=(train_input_ids, train_attention_masks, train_token_type_ids)\n", + " train_labels=np.asarray(train_data_labels, dtype=np.int32)\n", + "\n", + " # save\n", + " train_data = {}\n", + "\n", + " train_data['input_ids'] = train_input_ids\n", + " train_data['attention_mask'] = train_attention_masks\n", + " train_data['token_type_ids'] = train_token_type_ids\n", + " train_data['targets'] = np.asarray(train_data_labels, dtype=np.int32)\n", + "\n", + " os.makedirs(f'./data/{pt}/', exist_ok=True)\n", + " with open(f'./data/{pt}/train_data_{MAX_LEN}.pickle', 'wb') as f:\n", + " pickle.dump(train_data, f, pickle.HIGHEST_PROTOCOL)\n", + "\n", + "def preprocessing_test():\n", + "\n", + " pt = args.pt\n", + " if 'kobert' in pt:\n", + " tokenizer = KoBertTokenizer.from_pretrained(pt, cache_dir='bert_ckpt', do_lower_case=False)\n", + " print('load kobert')\n", + " else:\n", + " tokenizer = AutoTokenizer.from_pretrained(args.pt)\n", + " MAX_LEN = args.max_len\n", + "\n", + " test = pd.read_csv('./test_data.csv')\n", + " test=test[['title']]\n", + "\n", + " input_ids =[]\n", + " attention_masks =[]\n", + " token_type_ids =[]\n", + "\n", + " for test_sent in tqdm.tqdm(test['title']):\n", + " try:\n", + " input_id, attention_mask,_ = bert_tokenizer(test_sent, MAX_LEN=MAX_LEN, tokenizer=tokenizer)\n", + "\n", + " input_ids.append(input_id)\n", + " attention_masks.append(attention_mask)\n", + " token_type_ids.append(0)\n", + " #########################################\n", + "\n", + " except Exception as e:\n", + " print(e)\n", + " pass\n", + "\n", + " test_input_ids=np.array(input_ids, dtype=int)\n", + " test_attention_masks=np.array(attention_masks, dtype=int)\n", + " test_token_type_ids=np.array(token_type_ids, dtype=int)\n", + " ###########################################################\n", + " test_inputs=(test_input_ids, test_attention_masks, test_token_type_ids)\n", + "\n", + "\n", + " # save\n", + " test_data = {}\n", + "\n", + " test_data['input_ids'] = test_input_ids\n", + " test_data['attention_mask'] = test_attention_masks\n", + " test_data['token_type_ids'] = test_token_type_ids\n", + "\n", + " os.makedirs(f'./data/{pt}/', exist_ok=True)\n", + " with open(f'./data/{pt}/test_data_{MAX_LEN}.pickle', 'wb') as f:\n", + " pickle.dump(test_data, f, pickle.HIGHEST_PROTOCOL)\n", + "" + ], + "metadata": { + "id": "-MwNsSJi0VJs" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install sentencepiece # spm은 KoBertTokenizer class의 일부이고, args.pt 변수 값에 따라 다른 토크나이저가 선택됨.\n", + "#오류 메세지가 떴을 때는 KoBertTokenizer 대신에 BertTokenizer가 선택되어 있는데, 이는 KoBertTokenizer가 의존하는 SentencePiece 패키지가 안 설치 되어 있기 때문임" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9d9LCeGsiPWN", + "outputId": "02cb6a2c-fa51-4694-c12b-16557b5ef29a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting sentencepiece\n", + " Downloading sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m58.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: sentencepiece\n", + "Successfully installed sentencepiece-0.1.99\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6RwJgBwHktYI", + "outputId": "510c517d-ff1f-478e-c643-8ea3c6191974" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/drive\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "%cd /content/drive/MyDrive/JJJJ" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jM-QoDYOijaW", + "outputId": "68375f9b-4b62-477f-f9a2-b840ac66fd0e" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content/drive/MyDrive/JJJJ\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "##이름과 입력값을 보면 주어진 사전 학습된 모델에 사용하기 위해 훈련 및 테스트 데이터에 대해 일종의 전처리를 수행##\n", + "for pt, max_len in zip(['monologg/kobert','klue/roberta-base','klue/roberta-small','klue/roberta-large','xlm-roberta-large',\n", + " 'bert-base-multilingual-uncased', 'klue/roberta-large'],[33,33,33,33,33,33,28]):\n", + " #각 반복마다 args.max_len 및 args.pt 변수를 각각 max_len 및 pt 값으로 설정\n", + " args.max_len = max_len\n", + " args.pt = pt\n", + " #그런 다음 업데이트된 args 변수를 사용하여 preprocessing_train() 및 preprocessing_test() 함수를 호출\n", + " preprocessing_train()\n", + " preprocessing_test()\n", + " #마지막으로 현재 모델에 대한 전처리가 완료되었음을 나타내는 메시지를 인쇄\n", + " print(f'{args.pt} 모델 전처리 완료')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "f534bed4fe7448eb91578f67245ecac0", + "d4a2359a15044033884b4313f9d1d778", + "bbaf30af30ef4d189ed4ab329af1d3e1", + "322f25b0c08449c78112c4fd752077d6", + "8d191cda699440f18333e6c25ce71b7b", + "b01efc3853224067a3584eb63d0bc97e", + "372ded0a98fd4d8783173078d7f24414", + "19aec36478e0404d8ba498e8fc8a1120", + "e919abc447004aa49fd6e1f869f2ed8f", + "303ad95a73474fbfa05b7e660b71e40c", + "21db930fea3a4b40bcf1d63a7e854f7d", + "390b2fcd657341a79ecfd256645f73e1", + "fdcda5462b2143e884483b74dd1b2178", + "3b2c7b6fdc7d4ea99c32b423da1bd1da", + "92ecd0701a22436a830b175113593802", + "4a3f750bdac0421fa08d78c690125efe", + "c9ea6efce01f4ab6ba7a0f885dd800f3", + "da93d0796c4a4399bdb04ef59a95e64a", + "fa1f641602514df9bde52d48d128b217", + "8a038ad0cc6d4d2ab85d26873850fa07", + "422ccb4667344e4e97ef42d934b6a1e1", + "f7ba9115ee924ef9a4f0899c0dca7d4a", + "1f715fa597de44a2901233ac30bb1fc7", + "8d2ef0665fd248f28da08d0732c75af6", + "6db878b2c84e41cf8a699dea906108df", + "b98abcc25ec24032931a83091b34b19b", + "1f397aa7f5f444c2bfbe68a7cdb868da", + "69cd57825814465d94ce332a98b4df19", + "8f92a913526740078249fa0cca8a6663", + "897bfc44e06d4ed5a6501692b69f16b8", + "b923d69cdb6e485db6ac7f3d055a70fb", + "b47f6eb794384c00b6a7968e7a27a485", + "3fef3b41b8a645269a1de3d3889044e1", + "e7dc43c222ac4262aa0fd57f6d931a9e", + "3bd178a4f5d74aef8507a37bff6c47c9", + "fc6f190d3d51445a833748784c696cdd", + "ab1b1102c9eb4702a1121dd5d48c2323", + "fb9ac1c4c4054a44b068346d59ba288c", + "ee68720b95ff44c4b1d67e3c83eda925", + "eefa3cd6233d432bb55792d1d89d6b20", + "6dc4e8954aae4dc98a22b270dce23708", + "b6b4f7dfc89b4c99ad994022d641309b", + "68733a2cd91947b993ed95de1a65e83a", + "433ac7c1614549e5a8b33fb1ca7cc7f2", + "3064f9a643454426bb7e9cbf385b4123", + "8ef05693bdc747abb89173918573996a", + "d60988752d5c4ea89115a23e943140b1", + "d33e4b1be84d4efdbe69b66c6a1a01f3", + "8ae6497852e24e4ab7b2a3cc745d60fa", + "dce7fb5c4d2a43c9a138c15b94d28cfd", + "28b0f48d418341d19b852d28fe9789c2", + "a20d5966e27a4a2bb8c5512a1ee9318d", + "e046044c2a8042909b10f4518bad0585", + "fdcaa24b9c6741d6aec6c3c0c6689dc0", + "91126e3887684238b4b27db5983bc5ac", + "280d26a4bf874576aa9845120dd9ceab", + "4521a1414ac94897823e393f56d99ccf", + "abc3e5ba446946d9833c42c9187bf12f", + "d5bcb3035f054a77982bd1bf3b4feef4", + "237dda0559974f5daa75953086eedd27", + "4f1d49556c5e4dc38d9d174cc12e453c", + "c0959ea8a6e54b21b0b2f05fdfb2cb8a", + "cf5951dcf9e84383aff0e075f88dd72f", + "c3c2df63508e4c1ea38c204c8c7db566", + "79d65b2fd5de4ca1ae4555819f814467", + "5d0cd69018d54263b9d120bca287c92b", + "59a8f09e54904ac08e2da1fc7265203c", + "764ccc6a164e4230afc7542168c66a8f", + "a11b7e82dcb746ebb08fab45da17be5c", + "d0a26f193e3d4bbca46d72f952aa5c83", + "8a75fd69f0324cde94e4250adbf6b1c9", + "e012c027c4394690aaa0092df279d934", + "9eccb73fa6004bfca88549eb33d5c7f8", + "16b2b5f60f874896b7834ee41f41d1db", + "78134bba456a448d960f55b54a4df0b4", + "bedf16d0a93a42019a3971b4a6b3a8ad", + "97fbe0677ea84a318d0b9c713013fef9", + "36cc854c669f44bc85a37d708a27b2ae", + "ccf8d25ac6e34a0faf7226c4109a571a", + "cb9b2de1687e46d09e44a1b8d6b316c2", + "bca3ddc918434d84a31498d284400c28", + "d520e508c89449fb9795d721f43d93b5", + "e7a5ca4ca8cf403d8f8c5404269f7fde", + "76cefa5bb4a24d1f9ba5b5f3aede7a92", + "c14e1e88ac9c4ebea4df6764e26d317c", + "b2ebe96e233a43adb18d52cccce39dba", + "7bd9d93bd99e40cca8e701bb50f3f0fb", + "b985a1a576774607bf205de2a30aaf0c", + "109505da6b0f4464aab035b410b1e156", + "e68da79ecc304fbda9fd988e3a4472c5", + "1d839974325744f594f22a5cb8c47223", + "c4ea9bee06294000a176fb4db1e0bca6", + "e4dcc950c9064f488cf267ed10c949c2", + "f596eba71ba64a509f2537fafd82a8dc", + "ea57c949c3b14925b725066e1e68594e", + "212c1e3e34294785ba0bfb555dd6d4ad", + "fbcb67df6a344c34874de5d2c1fd1792", + "78c279b4ac444b7da318b3cc6cc9d870", + "e924e67dfcbb490c97b793d012d37dba", + "f801c9352ff1492f92da2d18cf4b6bde", + "59b847e47b1d4d708b1ca589d842c17c", + "2f0ed7d4395545498fc98d6f0c16cd32", + "d65b52eb1c61429cb4b94b8712dbc950", + "f67b2ebcb49343818eadeea6450dfe2a", + "dffeb6ace5d64fbd8008ae089b80f06f", + "4be5360d35554e859f529f945c215a41", + "66e33eba5ec1429583678e6947736b95", + "e847471da91f4f29a5626f432f8a4020", + "e8d474f7bb5248d2b8ff1bca96b5206c", + "50a314c64eae4daabf8b5a078b74a2a6", + "3a97b8cc75d74828b853d09b43300734", + "8b9f305975da4bcd9e3fe15630975e4c", + "737ddcd484d644069213c24fa5e1eac2", + "ab3d48b9025e4400aaa9ecbaeeb06299", + "6148576ce5a6468ea3c6f96779609c00", + "1f2dccf4784446f68adb4b2271934068", + "efe0e408da784f3c9cbfad1a3259a2dc", + "2bddec1a008345fa96389371feb5c703", + "c7a2a72b5ebc48ff946b4e4fe309cb7f", + "90917be6bb2347f2bb0f1585c679401b", + "f7953b75bfe2473cbbf0ba0b12084efb", + "048ec54d70fe4a509f74bc351d8019fa", + "cece75dadfe34dc29e63e4a6dc1b598d", + "ed01c515ab7845c38969200931734a8f", + "63d4c118424e481d8ce4f3fb876914bf", + "ae206a6008ca4818acfcdf8b73fba0f7", + "f72c2db5c3624c26b68ed073ade0739d", + "643d9d6b4f4e44ffbfb64e10230e3041", + "4e67ea28fcf14a3cbfad5b12834702d6", + "82d4780447df49829a598538484ee7e3", + "606cc334601e4c6ebdd62b5dbbd9dba3", + "fde7538b33d44263b71d529ef4dfe5c6", + "e6dce7e4829b4689a2c3cf86cf4384ba", + "008d4a83a1c64ea2bd938a78bba59d5f", + "efd95703dccb4f30834e3e26b1bc355e", + "0dcec34d40374f6cba16f30aab183953", + "74770bf2a57348c0ac16dd6619a8c86d", + "6c8c01e4db904a019957a26da2957bf7", + "8805b35f396545b686f918ec2ea1edf3", + "605d392a7d2a4cd5b85e632057041385", + "d8ef2574e20746a893e2b87f25694966", + "70fce17f9a9848d98f00fb5d85512e97", + "b725a47baaaf4cf49ae44ef82697d652", + "8c9f1051e90c4222924af3ac004e70af", + "963b1cdf94e64114b2911a1a43ed5fac", + "25c080fad710488281bef0dd0e0c09c6", + "b5eafc0b43844767ba3cdfbf225479e3", + "3953720dcc724bf7ae56ef88b3fadf02", + "758741b553894d928e48428f285aa554", + "c79f2c6c905e469292ed6af7345fea3b", + "78095a6716024141a82f7f643836bac3", + "ffc86b8e357e4225ae3f353b57a64783", + "968e79bef9944067bf0f12f557318429", + "7fdc53fd54e04fff9d7ea20abeb75a5d", + "c4bb1d422fca4f839b5adb42ce7f9932", + "f2be641755d04335a4efdd30a21de1ec", + "d500010b5a0a44d5be107c3dfe4bdc67", + "6aa5f8427f86489ba9bf7b29306568ac", + "78c672dcb2a84c679a4c1268149f7916", + "0176c86ef802424e8a0be51a775f6a6f", + "34be8750f2264bb2accd4d5e469e3fd7", + "522bf04451424070be58baa6ea546ee2", + "d673f7ecc3224ff581ac592a515a8217", + "1650f6430e544abc9c708ad162d88040", + "95bacaa3ed4744499a33db615d5da6bc", + "b79cd2a7a6fb490183d4e3454b8bf61f", + "c1b533d4eb464df8b6a697b2eeee50cd", + "fed9189d75e4400e9cbf6af091e9ab6c", + "7c64230bd8354c7da7f8ba40fb18d244", + "e5105e48878545f899a995b7a19a526c", + "dae8c2e3d4df4c1c9c394ca8db948f7e", + "f3d7596cd7f442108b0f300a97432b9e", + "8d2368144ac54bb8bf5eea46ae20e582", + "6087f9058e2a4cb683e73ede9985ba0f", + "e4d90b843113418f8ad39cebac91cad6", + "d6993e6319f64dd3a1531ca1812dc399", + "9e311b6073454fbaa1a978ffeff8e6df", + "99ebac6b399f4ec1a78f4724b8450c6d", + "f8a359d73f214f04bdbe2c40a65e18bc", + "c0ed1c0c238440558c134a9c6a4adfc1", + "d55828c2f0bf43cf9174693ec21b943c", + "3c1edbdb5f54438f9a7ba0ac211ad8c3", + "0e93be16aa2b4caa887a7fe2a042fad6", + "e7f0be2962db455d9b377b41cb860b5c", + "d4ce6bd48c5e4589a987b413143980b9", + "fa0a160cdcbc4650a833829071ad2eb7", + "b708d01208c34885a2bf1ba4325893f3", + "e2df55b1f3db4f24af648f5e129f0825", + "b4c3fe1da5604b48aa8e9ec1ee767f84", + "7a51cb21a8fb47b1a18d867d01f4128a", + "fb8de23dbba34e518daaa54895b4b8fb", + "a4a0f00e1e44457db1ee8c14b900efb6", + "0bf796104ab347419b421aba80e2ea5e", + "8ed1b4ca0aee424098570b9d8b03e5b0", + "f55fdfd49ee8474980d2ba1bef0c2733", + "570805a38b0149adb37596f90fdd5f39", + "0dccee61f95a4440bf896c4f7839c90e", + "dc55bc95895048c68b595bb62e417350", + "c0da66b3026d48aa96fa9c551e65f3df", + "2edbf2b488604680b4576c5036d2294e", + "52349d67ea8e459ba5e4624af5b5101f", + "378b2512547a432c96a7cbfbcaaa0b10", + "35f98de8bd3d46898a67761b6fe62b03", + "7a3a9cb9b3e84565bffdf683a213903b", + "1c98373c13b640c68fb607e7970247a9", + "5f791941a45c4bf691deb7c8c48552cc", + "aaa92270fdc64d5d9c9f5e84f9284f0a", + "ddbfa7dd6e8a43a8a4147c50e33a4548", + "4b132f43e5b749dd84dc614abbe76672" + ] + }, + "id": "EjpXPdEG0U9U", + "outputId": "1bd08b75-6d28-41c2-8aa5-7a2c20aa2996" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "The tokenizer class you load from this checkpoint is not the same type as the class this function is called from. It may result in unexpected tokenization. \n", + "The tokenizer class you load from this checkpoint is 'BertTokenizer'. \n", + "The class this function is called from is 'KoBertTokenizer'.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "load kobert\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "0it [00:00, ?it/s]/usr/local/lib/python3.10/dist-packages/transformers/tokenization_utils_base.py:2354: FutureWarning: The `pad_to_max_length` argument is deprecated and will be removed in a future version, use `padding=True` or `padding='longest'` to pad to the longest sequence in the batch, or use `padding='max_length'` to pad to a max length. In this case, you can give a specific length with `max_length` (e.g. `max_length=45`) or leave max_length to None to pad to the maximal input size of the model (e.g. 512 for Bert).\n", + " warnings.warn(\n", + "45654it [00:15, 2856.12it/s]\n", + "The tokenizer class you load from this checkpoint is not the same type as the class this function is called from. It may result in unexpected tokenization. \n", + "The tokenizer class you load from this checkpoint is 'BertTokenizer'. \n", + "The class this function is called from is 'KoBertTokenizer'.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "load kobert\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " 0%| | 0/9131 [00:001:\n", + " net = nn.DataParallel(net)\n", + "\n", + " # ------------------------\n", + " # loss\n", + " # ------------------------\n", + " loss_fn = nn.CrossEntropyLoss()\n", + "\n", + " # ------------------------\n", + " # Optimizer\n", + " # ------------------------\n", + " optimizer = optim.Lookahead(optim.RAdam(filter(lambda p: p.requires_grad,net.parameters()), lr=args.start_lr), alpha=0.5, k=5)\n", + "\n", + " scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 0, num_training_steps = len(trainloader)*args.epochs)\n", + "\n", + "\n", + " # ----\n", + " start_timer = timer()\n", + " best_score = 0\n", + "\n", + " for epoch in range(1, args.epochs+1):\n", + " train_loss = 0\n", + " valid_loss = 0\n", + "\n", + " target_lst = []\n", + " pred_lst = []\n", + " lr = get_learning_rate(optimizer)\n", + " print(f'-------------------')\n", + " print(f'{epoch}epoch start')\n", + " print(f'-------------------'+'\\n')\n", + " print(f'learning rate : {lr : .6f}')\n", + " for t, data in enumerate(tqdm.tqdm(trainloader)):\n", + "\n", + " # one iteration update -------------\n", + " ids = data['ids'].to(device)\n", + " mask = data['mask'].to(device)\n", + " tokentype = data['token_type_ids'].to(device)\n", + " target = data['targets'].to(device)\n", + "\n", + " # ------------\n", + " net.train()\n", + " optimizer.zero_grad()\n", + "\n", + "\n", + " if args.amp:\n", + " with amp.autocast():\n", + " # output\n", + " output = net(ids, mask)\n", + " output = output[0]\n", + "\n", + " # loss\n", + " loss = loss_fn(output, target)\n", + " train_loss += loss\n", + "\n", + "\n", + " scaler.scale(loss).backward()\n", + " scaler.step(optimizer)\n", + " scaler.update()\n", + "\n", + " else:\n", + " # output\n", + " output = net(ids, mask)\n", + "\n", + " # loss\n", + " loss = loss_fn(output, target)\n", + " train_loss += loss\n", + "\n", + " # update\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + "\n", + " # for calculate f1 score\n", + " target_lst.extend(target.detach().cpu().numpy())\n", + " pred_lst.extend(output.argmax(dim=1).tolist())\n", + "\n", + "\n", + " if scheduler is not None:\n", + " scheduler.step()\n", + " train_loss = train_loss / len(trainloader)\n", + " train_score = f1_score(y_true=target_lst, y_pred=pred_lst, average='macro')\n", + " train_acc = accuracy_score(y_true=target_lst, y_pred=pred_lst)\n", + "\n", + " # validation\n", + " valid_loss, valid_score, valid_acc, _ = do_valid(net, validloader)\n", + "\n", + "\n", + " if valid_acc > best_score:\n", + " best_score = valid_acc\n", + " best_epoch = epoch\n", + " best_loss = valid_loss\n", + "\n", + " torch.save(net.state_dict(), out_dir + f'/{folds}f_{epoch}e_{best_score:.4f}_s.pth')\n", + " print('best model saved'+'\\n')\n", + "\n", + "\n", + " print(f'train loss : {train_loss:.4f}, train f1 score : {train_score : .4f}, train acc : {train_acc : .4f}'+'\\n')\n", + " print(f'valid loss : {valid_loss:.4f}, valid f1 score : {valid_score : .4f}, valid acc : {valid_acc : .4f}'+'\\n')\n", + "\n", + "\n", + " print(f'best valid loss : {best_loss : .4f}'+'\\n')\n", + " print(f'best epoch : {best_epoch }'+'\\n')\n", + " print(f'best accuracy : {best_score : .4f}'+'\\n')\n", + "\n", + "def run_predict(model_path):\n", + " ## dataset ------------------------------------\n", + " # load\n", + " with open(f'./data/{args.pt}/test_data_{args.max_len}.pickle', 'rb') as f:\n", + " test_dict = pickle.load(f)\n", + "\n", + " print('test load')\n", + " test_dataset = KobertDataSet(data = test_dict, test=True)\n", + " testloader = DataLoader(dataset=test_dataset, batch_size=args.batch_size,\n", + " num_workers=8, shuffle=False, pin_memory=True)\n", + " print('set testloader')\n", + " ## net ----------------------------------------\n", + " scaler = amp.GradScaler()\n", + " if 'xlm-roberta' in args.pt:\n", + " net = XLMRobertaForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + "\n", + " elif 'klue/roberta' in args.pt:\n", + " net = RobertaForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + " else:\n", + " net = BertForSequenceClassification.from_pretrained(args.pt, num_labels = 7)\n", + "\n", + " net.to(device)\n", + "\n", + " if len(args.gpu)>1:\n", + " net = nn.DataParallel(net)\n", + "\n", + " f = torch.load(model_path)\n", + " net.load_state_dict(f, strict=True) # True\n", + " print('load saved models')\n", + " # ------------------------\n", + " # validation\n", + " preds, logit = do_predict(net, testloader) #outputs\n", + "\n", + " print('complete predict')\n", + "\n", + " return preds, np.array(logit)\n", + "# 예측된 레이블과 로그는 각각 pred_lst 및 logit 목록에 저장\n", + "" + ], + "metadata": { + "id": "FtKebqIVh-lC" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "\"\"\"5fold 전용\"\"\"\n", + "if __name__ == '__main__':\n", + " #스크립트를 모듈로 가져오는 것이 아니라 직접 실행할 때만 실행해야 하는 코드를 지정할 수 있는 Python 코드의 일반적인 패턴\n", + "\n", + " for pt, max_len in zip(['monologg/kobert'],[33]):\n", + " #일부 매개변수(args.max_len, args.pt, args.exp_name)를 정의한 다음\n", + " args.max_len = max_len\n", + " args.pt = pt\n", + " args.exp_name = str(args.pt) + '_' + str(args.max_len)\n", + " #교차 유효성 검사의 5배수에 걸쳐 pt와 max_len의 각 조합에 대해 run_train 함수를 호출\n", + " #for i in [0,1,2,3,4]: # 5fold\n", + " for i in [0]: #1fold\n", + " run_train(folds=i)\n", + " #5 교차 유효성 검사를 사용해 다양한 최대 시퀀스 길이(max_len)을 가진 사전 학습 언어 모델(pt)에 학습 스크립트를 실행하는 루프" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 322, + "referenced_widgets": [ + "1fd7f1e2b00a4b6eb3ddfdfc150059d3", + "62399a7de6f1460ea5dccb05d44c4cc1", + "b802ad8d5f53420cad376fc42e290260", + "c60e0c4265ce46d98b213eac941d0ee1", + "f3aa47355778482aae55c3b44aca4273", + "ba688b1063d7483ba4b30e900b14385b", + "e1af7116138049deb3dbfa89d8a260bb", + "7a4c1373a8de446081d028bf12edb4c2", + "71b518ae1c4443139d3950078842fd68", + "da6ec0e73d414b248f19bad266b3148b", + "dfa5c351c3574593a5561885b7422f8c", + "72bf2b77001b4c0697dc0a7032eb27c0", + "54f9964ac1b540438eed60c5fcb1831d", + "8e0a0a7735c84fdab60b8952ffebd433", + "ffe65bc47d2b4948b81fbda1526ea299", + "27ebca023c1048f29f8ff05735e5e25a", + "5aca4ceb73634249945884be389514d0", + "ae36612dc22948408953ef4126f63822", + "8bf1ae25ff6143ef99728b35156e4227", + "859f6226c2d34f1aa8463797f62e7b4e", + "866496e3cd964d6aaf8abb2321586b21", + "7e411a6f162b40cb9de440f1c5939a2e" + ] + }, + "id": "E4qLSXshh-iW", + "outputId": "e48324f9-77d9-4368-9859-0e1660870ee7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/torch/utils/data/dataloader.py:561: UserWarning: This DataLoader will create 8 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n", + " warnings.warn(_create_warning_msg(\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (…)lve/main/config.json: 0%| | 0.00/426 [00:00