LencoDigitexer commited on
Commit
aebfc44
·
1 Parent(s): 94d1024

add programs

Browse files
GPT_introduction.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
GROB.md ADDED
The diff for this file is too large to render. See raw diff
 
GROB.txt ADDED
The diff for this file is too large to render. See raw diff
 
TRAIN_GPT.ipynb ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {
6
+ "colab_type": "text",
7
+ "id": "view-in-github"
8
+ },
9
+ "source": [
10
+ "<a href=\"https://colab.research.google.com/gist/LencoDigitexer/b1f3602547b99e3bc7478c3188c65024/.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "markdown",
15
+ "metadata": {
16
+ "id": "0RFUxrlMNIkx"
17
+ },
18
+ "source": [
19
+ "#Импорты"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": 9,
25
+ "metadata": {
26
+ "id": "0lhkuNdOoqvq"
27
+ },
28
+ "outputs": [],
29
+ "source": [
30
+ "import pandas as pd\n",
31
+ "import numpy as np"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "code",
36
+ "execution_count": null,
37
+ "metadata": {
38
+ "colab": {
39
+ "base_uri": "https://localhost:8080/"
40
+ },
41
+ "id": "d8fP5y2Ipsln",
42
+ "outputId": "1096c5a5-7ef6-401c-b0d9-b59e6cf9fc86"
43
+ },
44
+ "outputs": [],
45
+ "source": [
46
+ "!pip install transformers==4.19.0"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": 24,
52
+ "metadata": {},
53
+ "outputs": [
54
+ {
55
+ "name": "stdout",
56
+ "output_type": "stream",
57
+ "text": [
58
+ "Requirement already satisfied: transformers in c:\\github\\train_gpt\\.conda\\lib\\site-packages (4.19.0)\n",
59
+ "Collecting transformers\n",
60
+ " Downloading transformers-4.36.1-py3-none-any.whl.metadata (126 kB)\n",
61
+ " ---------------------------------------- 0.0/126.8 kB ? eta -:--:--\n",
62
+ " --- ------------------------------------ 10.2/126.8 kB ? eta -:--:--\n",
63
+ " --- ------------------------------------ 10.2/126.8 kB ? eta -:--:--\n",
64
+ " -------- ---------------------------- 30.7/126.8 kB 145.2 kB/s eta 0:00:01\n",
65
+ " -------- ---------------------------- 30.7/126.8 kB 145.2 kB/s eta 0:00:01\n",
66
+ " ----------------- ------------------- 61.4/126.8 kB 233.8 kB/s eta 0:00:01\n",
67
+ " ------------------------------- ---- 112.6/126.8 kB 364.4 kB/s eta 0:00:01\n",
68
+ " ------------------------------------ 126.8/126.8 kB 373.4 kB/s eta 0:00:00\n",
69
+ "Requirement already satisfied: filelock in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (3.13.1)\n",
70
+ "Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (0.19.4)\n",
71
+ "Requirement already satisfied: numpy>=1.17 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (1.26.1)\n",
72
+ "Requirement already satisfied: packaging>=20.0 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (23.0)\n",
73
+ "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (6.0.1)\n",
74
+ "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (2023.10.3)\n",
75
+ "Requirement already satisfied: requests in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (2.28.2)\n",
76
+ "Collecting tokenizers<0.19,>=0.14 (from transformers)\n",
77
+ " Using cached tokenizers-0.15.0-cp311-none-win_amd64.whl.metadata (6.8 kB)\n",
78
+ "Requirement already satisfied: safetensors>=0.3.1 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (0.4.0)\n",
79
+ "Requirement already satisfied: tqdm>=4.27 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from transformers) (4.66.1)\n",
80
+ "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (2023.10.0)\n",
81
+ "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (4.8.0)\n",
82
+ "Requirement already satisfied: colorama in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from tqdm>=4.27->transformers) (0.4.6)\n",
83
+ "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from requests->transformers) (3.1.0)\n",
84
+ "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from requests->transformers) (3.4)\n",
85
+ "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from requests->transformers) (1.26.15)\n",
86
+ "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\addmi\\appdata\\roaming\\python\\python311\\site-packages (from requests->transformers) (2022.12.7)\n",
87
+ "Downloading transformers-4.36.1-py3-none-any.whl (8.3 MB)\n",
88
+ " ---------------------------------------- 0.0/8.3 MB ? eta -:--:--\n",
89
+ " --------------------------------------- 0.1/8.3 MB 3.3 MB/s eta 0:00:03\n",
90
+ " --------------------------------------- 0.2/8.3 MB 2.0 MB/s eta 0:00:05\n",
91
+ " - -------------------------------------- 0.2/8.3 MB 2.2 MB/s eta 0:00:04\n",
92
+ " - -------------------------------------- 0.3/8.3 MB 1.8 MB/s eta 0:00:05\n",
93
+ " -- ------------------------------------- 0.5/8.3 MB 2.5 MB/s eta 0:00:04\n",
94
+ " ---- ----------------------------------- 0.8/8.3 MB 3.0 MB/s eta 0:00:03\n",
95
+ " ----- ---------------------------------- 1.2/8.3 MB 3.7 MB/s eta 0:00:02\n",
96
+ " -------- ------------------------------- 1.7/8.3 MB 4.6 MB/s eta 0:00:02\n",
97
+ " ---------- ----------------------------- 2.2/8.3 MB 5.3 MB/s eta 0:00:02\n",
98
+ " ------------ --------------------------- 2.6/8.3 MB 5.5 MB/s eta 0:00:02\n",
99
+ " --------------- ------------------------ 3.2/8.3 MB 5.9 MB/s eta 0:00:01\n",
100
+ " --------------- ------------------------ 3.2/8.3 MB 6.0 MB/s eta 0:00:01\n",
101
+ " --------------- ------------------------ 3.2/8.3 MB 6.0 MB/s eta 0:00:01\n",
102
+ " --------------- ------------------------ 3.2/8.3 MB 6.0 MB/s eta 0:00:01\n",
103
+ " --------------- ------------------------ 3.2/8.3 MB 6.0 MB/s eta 0:00:01\n",
104
+ " ---------------- ----------------------- 3.5/8.3 MB 4.7 MB/s eta 0:00:02\n",
105
+ " ---------------- ----------------------- 3.5/8.3 MB 4.7 MB/s eta 0:00:02\n",
106
+ " ------------------ --------------------- 3.8/8.3 MB 4.4 MB/s eta 0:00:02\n",
107
+ " --------------------- ------------------ 4.5/8.3 MB 5.2 MB/s eta 0:00:01\n",
108
+ " ---------------------------- ----------- 5.9/8.3 MB 6.2 MB/s eta 0:00:01\n",
109
+ " ------------------------------- -------- 6.5/8.3 MB 6.4 MB/s eta 0:00:01\n",
110
+ " --------------------------------- ------ 6.9/8.3 MB 6.5 MB/s eta 0:00:01\n",
111
+ " ----------------------------------- ---- 7.4/8.3 MB 6.7 MB/s eta 0:00:01\n",
112
+ " ------------------------------------- -- 7.8/8.3 MB 6.8 MB/s eta 0:00:01\n",
113
+ " --------------------------------------- 8.3/8.3 MB 7.0 MB/s eta 0:00:01\n",
114
+ " ---------------------------------------- 8.3/8.3 MB 6.8 MB/s eta 0:00:00\n",
115
+ "Using cached tokenizers-0.15.0-cp311-none-win_amd64.whl (2.2 MB)\n",
116
+ "Installing collected packages: tokenizers, transformers\n",
117
+ " Attempting uninstall: tokenizers\n",
118
+ " Found existing installation: tokenizers 0.12.1\n",
119
+ " Uninstalling tokenizers-0.12.1:\n",
120
+ " Successfully uninstalled tokenizers-0.12.1\n",
121
+ " Attempting uninstall: transformers\n",
122
+ " Found existing installation: transformers 4.19.0\n",
123
+ " Uninstalling transformers-4.19.0:\n",
124
+ " Successfully uninstalled transformers-4.19.0\n",
125
+ "Successfully installed tokenizers-0.15.0 transformers-4.36.1\n"
126
+ ]
127
+ },
128
+ {
129
+ "name": "stderr",
130
+ "output_type": "stream",
131
+ "text": [
132
+ " WARNING: Failed to remove contents in a temporary directory 'C:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\~okenizers'.\n",
133
+ " You can safely remove it manually.\n"
134
+ ]
135
+ }
136
+ ],
137
+ "source": [
138
+ "!pip install -U transformers"
139
+ ]
140
+ },
141
+ {
142
+ "cell_type": "code",
143
+ "execution_count": 25,
144
+ "metadata": {
145
+ "id": "O6ujFUYBl2Fj"
146
+ },
147
+ "outputs": [],
148
+ "source": [
149
+ "from transformers import GPT2LMHeadModel, GPT2Tokenizer\n",
150
+ "import torch\n",
151
+ "from torch.utils.data import Dataset # this is the pytorch class import\n",
152
+ "from transformers import DataCollatorForLanguageModeling\n",
153
+ "from transformers import TrainingArguments, Trainer\n",
154
+ "from transformers import StoppingCriteria, StoppingCriteriaList"
155
+ ]
156
+ },
157
+ {
158
+ "cell_type": "code",
159
+ "execution_count": 26,
160
+ "metadata": {
161
+ "id": "k7cC6BjGmhWm"
162
+ },
163
+ "outputs": [],
164
+ "source": [
165
+ "DEVICE = torch.device(\"cuda\") if torch.cuda.is_available() else None"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "code",
170
+ "execution_count": null,
171
+ "metadata": {
172
+ "colab": {
173
+ "base_uri": "https://localhost:8080/"
174
+ },
175
+ "id": "BFdrbagdcFSQ",
176
+ "outputId": "8d98ad2f-dd04-4d5a-ab15-1cfbfcb06f79"
177
+ },
178
+ "outputs": [],
179
+ "source": [
180
+ "!pip install openpyxl"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "markdown",
185
+ "metadata": {
186
+ "id": "4Br1yvNgNBCx"
187
+ },
188
+ "source": [
189
+ "\n",
190
+ "#Обучение модельки"
191
+ ]
192
+ },
193
+ {
194
+ "cell_type": "code",
195
+ "execution_count": 27,
196
+ "metadata": {
197
+ "id": "3ZtL62M80QJF"
198
+ },
199
+ "outputs": [],
200
+ "source": [
201
+ "my_path = 'content/'"
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "code",
206
+ "execution_count": null,
207
+ "metadata": {
208
+ "colab": {
209
+ "base_uri": "https://localhost:8080/"
210
+ },
211
+ "id": "PDtJ6TVDpyVr",
212
+ "outputId": "1fa22c1d-64f9-4a5d-d046-8f64a57a2bc9"
213
+ },
214
+ "outputs": [],
215
+ "source": [
216
+ "!wget https://www.dropbox.com/s/89rmm4wucjve2ll/news.csv?dl=0 -O /content/news.csv"
217
+ ]
218
+ },
219
+ {
220
+ "cell_type": "code",
221
+ "execution_count": 28,
222
+ "metadata": {
223
+ "id": "_oaLt4broJKd"
224
+ },
225
+ "outputs": [],
226
+ "source": [
227
+ "data = pd.read_csv(f'{my_path}news.csv')\n",
228
+ "data.drop_duplicates(subset = ['title'],inplace=True)\n",
229
+ "data.dropna(inplace=True)"
230
+ ]
231
+ },
232
+ {
233
+ "cell_type": "code",
234
+ "execution_count": 29,
235
+ "metadata": {
236
+ "id": "X6JZphFn_WlM"
237
+ },
238
+ "outputs": [],
239
+ "source": [
240
+ "def clear_data(text: str):\n",
241
+ " if 'Что такое' in text:\n",
242
+ " return np.nan\n",
243
+ " if len( text.split(' ')) < 20:\n",
244
+ " return np.nan\n",
245
+ " return text"
246
+ ]
247
+ },
248
+ {
249
+ "cell_type": "code",
250
+ "execution_count": 30,
251
+ "metadata": {
252
+ "id": "DWOQE6P2AdW2"
253
+ },
254
+ "outputs": [],
255
+ "source": [
256
+ "data['text'] = data['text'].apply(clear_data)\n",
257
+ "data.dropna(subset=['text'], inplace=True)"
258
+ ]
259
+ },
260
+ {
261
+ "cell_type": "code",
262
+ "execution_count": null,
263
+ "metadata": {
264
+ "colab": {
265
+ "base_uri": "https://localhost:8080/"
266
+ },
267
+ "id": "C9P12BUCgshN",
268
+ "outputId": "fbb04d40-6f50-4b65-e26d-2d033fbc745c"
269
+ },
270
+ "outputs": [
271
+ {
272
+ "name": "stdout",
273
+ "output_type": "stream",
274
+ "text": [
275
+ "Fri Jan 20 17:48:31 2023 \n",
276
+ "+-----------------------------------------------------------------------------+\n",
277
+ "| NVIDIA-SMI 516.94 Driver Version: 516.94 CUDA Version: 11.7 |\n",
278
+ "|-------------------------------+----------------------+----------------------+\n",
279
+ "| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
280
+ "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n",
281
+ "| | | MIG M. |\n",
282
+ "|===============================+======================+======================|\n",
283
+ "| 0 NVIDIA GeForce ... WDDM | 00000000:01:00.0 Off | N/A |\n",
284
+ "| 31% 54C P0 61W / 200W | 483MiB / 8192MiB | 0% Default |\n",
285
+ "| | | N/A |\n",
286
+ "+-------------------------------+----------------------+----------------------+\n",
287
+ " \n",
288
+ "+-----------------------------------------------------------------------------+\n",
289
+ "| Processes: |\n",
290
+ "| GPU GI CI PID Type Process name GPU Memory |\n",
291
+ "| ID ID Usage |\n",
292
+ "|=============================================================================|\n",
293
+ "| 0 N/A N/A 2520 C+G ...lPanel\\SystemSettings.exe N/A |\n",
294
+ "| 0 N/A N/A 3056 C+G ...e\\PhoneExperienceHost.exe N/A |\n",
295
+ "| 0 N/A N/A 7284 C+G C:\\Windows\\explorer.exe N/A |\n",
296
+ "| 0 N/A N/A 8860 C+G ...me\\Application\\chrome.exe N/A |\n",
297
+ "| 0 N/A N/A 8876 C+G ...wekyb3d8bbwe\\Video.UI.exe N/A |\n",
298
+ "| 0 N/A N/A 9024 C+G ...5n1h2txyewy\\SearchApp.exe N/A |\n",
299
+ "| 0 N/A N/A 9844 C+G ...perience\\NVIDIA Share.exe N/A |\n",
300
+ "| 0 N/A N/A 10504 C+G ...cw5n1h2txyewy\\LockApp.exe N/A |\n",
301
+ "| 0 N/A N/A 11820 C+G ...2txyewy\\TextInputHost.exe N/A |\n",
302
+ "| 0 N/A N/A 12652 C+G ...sv5v3m8wq0b2\\ExcelApp.exe N/A |\n",
303
+ "| 0 N/A N/A 12912 C+G ...m Files\\iTunes\\iTunes.exe N/A |\n",
304
+ "| 0 N/A N/A 13020 C+G ...y\\ShellExperienceHost.exe N/A |\n",
305
+ "| 0 N/A N/A 14760 C+G ...8wekyb3d8bbwe\\Cortana.exe N/A |\n",
306
+ "| 0 N/A N/A 15212 C+G ...ck\\app-4.29.149\\slack.exe N/A |\n",
307
+ "| 0 N/A N/A 16220 C+G ...zpdnekdrzrea0\\Spotify.exe N/A |\n",
308
+ "| 0 N/A N/A 16712 C+G ...5n1h2txyewy\\SearchApp.exe N/A |\n",
309
+ "| 0 N/A N/A 17004 C+G ...lls\\wgc_renderer_host.exe N/A |\n",
310
+ "+-----------------------------------------------------------------------------+\n"
311
+ ]
312
+ }
313
+ ],
314
+ "source": [
315
+ "!nvidia-smi"
316
+ ]
317
+ },
318
+ {
319
+ "cell_type": "code",
320
+ "execution_count": 33,
321
+ "metadata": {
322
+ "id": "Jsqm0FLOpyoS"
323
+ },
324
+ "outputs": [
325
+ {
326
+ "name": "stderr",
327
+ "output_type": "stream",
328
+ "text": [
329
+ "Downloading: 100%|██████████| 1.54M/1.54M [00:00<00:00, 2.68MB/s]\n",
330
+ "Downloading: 100%|██████████| 1.21M/1.21M [00:00<00:00, 2.22MB/s]\n",
331
+ "Downloading: 100%|██████████| 574/574 [00:00<00:00, 287kB/s]\n",
332
+ "Downloading: 100%|██████████| 1.22k/1.22k [00:00<00:00, 612kB/s]\n",
333
+ "Downloading: 100%|██████████| 761/761 [00:00<00:00, 190kB/s]\n",
334
+ "Downloading: 100%|██████████| 1.61G/1.61G [02:47<00:00, 10.3MB/s]\n"
335
+ ]
336
+ }
337
+ ],
338
+ "source": [
339
+ "model_name_or_path = \"ai-forever/rugpt3medium_based_on_gpt2\"\n",
340
+ "tokenizer = GPT2Tokenizer.from_pretrained(model_name_or_path)\n",
341
+ "model = GPT2LMHeadModel.from_pretrained(model_name_or_path).to(DEVICE)"
342
+ ]
343
+ },
344
+ {
345
+ "cell_type": "markdown",
346
+ "metadata": {
347
+ "id": "w11Hq5Lvwcdu"
348
+ },
349
+ "source": [
350
+ "## Add special tokens"
351
+ ]
352
+ },
353
+ {
354
+ "cell_type": "code",
355
+ "execution_count": 34,
356
+ "metadata": {
357
+ "colab": {
358
+ "base_uri": "https://localhost:8080/"
359
+ },
360
+ "id": "7ImM0Aq0dE8q",
361
+ "outputId": "c6fc436f-364e-461c-d908-cee9aa68eeeb"
362
+ },
363
+ "outputs": [
364
+ {
365
+ "data": {
366
+ "text/plain": [
367
+ "Embedding(50260, 1024)"
368
+ ]
369
+ },
370
+ "execution_count": 34,
371
+ "metadata": {},
372
+ "output_type": "execute_result"
373
+ }
374
+ ],
375
+ "source": [
376
+ "SPECIAL_TOKENS = {'bos_token':'<bos>','eos_token' :'<eos>', 'pad_token':'<pad>', 'sep_token': '<sep>'}\n",
377
+ "tokenizer.add_special_tokens(SPECIAL_TOKENS)\n",
378
+ "model.resize_token_embeddings(len(tokenizer))"
379
+ ]
380
+ },
381
+ {
382
+ "cell_type": "markdown",
383
+ "metadata": {
384
+ "id": "DejAhD7dwjwX"
385
+ },
386
+ "source": [
387
+ "## Greate a Dataset"
388
+ ]
389
+ },
390
+ {
391
+ "cell_type": "code",
392
+ "execution_count": 35,
393
+ "metadata": {
394
+ "id": "vKsDqthMdxna"
395
+ },
396
+ "outputs": [],
397
+ "source": [
398
+ "torch.manual_seed(42)\n",
399
+ "\n",
400
+ "class myDataset(Dataset):\n",
401
+ "\n",
402
+ " def __init__(self, data, tokenizer, gpt2_type=\"gpt2\", max_length=150):\n",
403
+ " self.tokenizer = tokenizer # the gpt2 tokenizer we instantiated\n",
404
+ " self.input_ids = []\n",
405
+ " self.attn_masks = []\n",
406
+ "\n",
407
+ " for i in data.index.to_list():\n",
408
+ " title = data['title'][i]\n",
409
+ " description = data['text'][i] if type(data['text'][i]) == str else ''\n",
410
+ "\n",
411
+ " encodings_dict = tokenizer('<bos>'+ title + '<sep>' + description + '<eos>',\n",
412
+ " truncation=True,\n",
413
+ " max_length=max_length,\n",
414
+ " padding=\"max_length\")\n",
415
+ "\n",
416
+ " self.input_ids.append(torch.tensor(encodings_dict['input_ids']))\n",
417
+ " self.attn_masks.append(torch.tensor(encodings_dict['attention_mask']))\n",
418
+ "\n",
419
+ " def __len__(self):\n",
420
+ " return len(self.input_ids)\n",
421
+ "\n",
422
+ " def __getitem__(self, idx):\n",
423
+ " return {\n",
424
+ " 'input_ids': self.input_ids[idx],\n",
425
+ " 'attn_masks': self.attn_masks[idx]\n",
426
+ " }"
427
+ ]
428
+ },
429
+ {
430
+ "cell_type": "code",
431
+ "execution_count": 36,
432
+ "metadata": {
433
+ "id": "607w_pnJMW5e"
434
+ },
435
+ "outputs": [],
436
+ "source": [
437
+ "train_dataset = myDataset(data, tokenizer)"
438
+ ]
439
+ },
440
+ {
441
+ "cell_type": "code",
442
+ "execution_count": 37,
443
+ "metadata": {
444
+ "colab": {
445
+ "base_uri": "https://localhost:8080/"
446
+ },
447
+ "id": "nK8r7CJr743J",
448
+ "outputId": "159787c7-cf79-4575-cb2c-91472c4cdebb"
449
+ },
450
+ "outputs": [
451
+ {
452
+ "data": {
453
+ "text/plain": [
454
+ "{'input_ids': tensor([ 18, 39952, 16, 374, 27275, 47, 37, 840, 3215, 1904,\n",
455
+ " 1827, 5170, 428, 5554, 4426, 16686, 3250, 15366, 536, 36982,\n",
456
+ " 2480, 7768, 18, 365, 7570, 27275, 47, 37, 44030, 7872,\n",
457
+ " 519, 34308, 8482, 282, 1808, 18, 391, 42, 56, 3110,\n",
458
+ " 16, 374, 4866, 2147, 5304, 23322, 309, 12295, 519, 10367,\n",
459
+ " 8482, 18, 27275, 47, 37, 9727, 21691, 5512, 3672, 1134,\n",
460
+ " 16374, 30, 12604, 2009, 36272, 289, 24971, 473, 58, 56,\n",
461
+ " 31693, 934, 367, 827, 329, 1304, 912, 3772, 294, 13099,\n",
462
+ " 315, 17, 293, 4654, 660, 1941, 29216, 16, 502, 4347,\n",
463
+ " 942, 3836, 428, 6413, 37787, 36272, 289, 24971, 18, 2052,\n",
464
+ " 2050, 4921, 4266, 16, 374, 541, 3594, 7294, 2854, 32720,\n",
465
+ " 14813, 9971, 8253, 26282, 18, 16251, 5305, 29620, 434, 6566,\n",
466
+ " 482, 7385, 18460, 31495, 651, 1409, 14550, 2634, 4662, 651,\n",
467
+ " 10787, 282, 965, 14874, 10383, 933, 835, 16, 3118, 5456,\n",
468
+ " 4651, 309, 3504, 21499, 289, 31572, 5172, 416, 8408, 50258]),\n",
469
+ " 'attn_masks': tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
470
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
471
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
472
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
473
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
474
+ " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
475
+ " 1, 1, 1, 1, 1, 1])}"
476
+ ]
477
+ },
478
+ "execution_count": 37,
479
+ "metadata": {},
480
+ "output_type": "execute_result"
481
+ }
482
+ ],
483
+ "source": [
484
+ "train_dataset[10]"
485
+ ]
486
+ },
487
+ {
488
+ "cell_type": "markdown",
489
+ "metadata": {
490
+ "id": "3H1pAm4Qwmvc"
491
+ },
492
+ "source": [
493
+ "## Add Datacollator"
494
+ ]
495
+ },
496
+ {
497
+ "cell_type": "code",
498
+ "execution_count": 38,
499
+ "metadata": {
500
+ "id": "soPxrXgQpFZQ"
501
+ },
502
+ "outputs": [],
503
+ "source": [
504
+ "data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)"
505
+ ]
506
+ },
507
+ {
508
+ "cell_type": "markdown",
509
+ "metadata": {
510
+ "id": "kktpNyfnwrPY"
511
+ },
512
+ "source": [
513
+ "## Training"
514
+ ]
515
+ },
516
+ {
517
+ "cell_type": "code",
518
+ "execution_count": 39,
519
+ "metadata": {
520
+ "id": "iX2cSazzlm8E"
521
+ },
522
+ "outputs": [],
523
+ "source": [
524
+ "training_args = TrainingArguments(\n",
525
+ " output_dir=f'{my_path}Checkouts', #The output directory\n",
526
+ " overwrite_output_dir = True, #overwrite the content of the output directory\n",
527
+ " num_train_epochs = 10, # number of training epochs\n",
528
+ " per_device_train_batch_size = 3, # batch size for training\n",
529
+ " per_device_eval_batch_size = 3, # batch size for evaluation\n",
530
+ " warmup_steps = 100,# number of warmup steps for learning rate scheduler\n",
531
+ " gradient_accumulation_steps = 1, # to make \"virtual\" batch size larger\n",
532
+ " save_steps = 3000\n",
533
+ " )\n",
534
+ "\n",
535
+ "\n",
536
+ "trainer = Trainer(\n",
537
+ " model=model,\n",
538
+ " args=training_args,\n",
539
+ " data_collator=data_collator,\n",
540
+ " train_dataset=train_dataset,\n",
541
+ " optimizers = (torch.optim.AdamW(model.parameters(),lr=1e-5),None) # Optimizer and lr scheduler\n",
542
+ ")"
543
+ ]
544
+ },
545
+ {
546
+ "cell_type": "code",
547
+ "execution_count": 43,
548
+ "metadata": {
549
+ "colab": {
550
+ "base_uri": "https://localhost:8080/",
551
+ "height": 1000,
552
+ "referenced_widgets": [
553
+ "43a300cd4f3b4f26b5ef46bf4a7b4500",
554
+ "3cae9bd0f3e34a018f1c1770a65fb52f",
555
+ "d5607a93190249ce87179ea2456630f6",
556
+ "8bab8300f98b4df9a5ece6dafa8daba1",
557
+ "e88887e4031f4851ac6f5fd5e7f7b933",
558
+ "160d666ebc934016a0f30892832f37f0",
559
+ "2f49fd3cb2e2461eb562c403009c4acc",
560
+ "b510b835db64457d8e49ba3e965918de",
561
+ "15592d007be2409fa0dc6aaff0727554",
562
+ "1b63c50c01ca463487b94bd2ca3139f5",
563
+ "f1c2c1dc5cdd4e9ab3456d0e9bbb553d"
564
+ ]
565
+ },
566
+ "id": "OVtvq4sLq9EG",
567
+ "outputId": "88ea174a-5feb-4f4b-c4eb-0f34627b5cba"
568
+ },
569
+ "outputs": [
570
+ {
571
+ "name": "stderr",
572
+ "output_type": "stream",
573
+ "text": [
574
+ "***** Running training *****\n",
575
+ " Num examples = 10476\n",
576
+ " Num Epochs = 10\n",
577
+ " Instantaneous batch size per device = 3\n",
578
+ " Total train batch size (w. parallel, distributed & accumulation) = 3\n",
579
+ " Gradient Accumulation steps = 1\n",
580
+ " Total optimization steps = 34920\n",
581
+ " 0%| | 11/34920 [09:52<522:07:09, 53.84s/it]"
582
+ ]
583
+ },
584
+ {
585
+ "name": "stderr",
586
+ "output_type": "stream",
587
+ "text": [
588
+ "\n",
589
+ "The following columns in the training set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: attn_masks. If attn_masks are not expected by `GPT2LMHeadModel.forward`, you can safely ignore this message.\n"
590
+ ]
591
+ },
592
+ {
593
+ "ename": "KeyboardInterrupt",
594
+ "evalue": "",
595
+ "output_type": "error",
596
+ "traceback": [
597
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
598
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
599
+ "Cell \u001b[1;32mIn[43], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
600
+ "File \u001b[1;32mc:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\transformers\\trainer.py:1317\u001b[0m, in \u001b[0;36mtrain\u001b[1;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[0;32m 1314\u001b[0m dtype \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mbfloat16 \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39muse_cpu_amp \u001b[38;5;28;01melse\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mfloat32\n\u001b[0;32m 1315\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mipex_optimize_model(model, training, dtype\u001b[38;5;241m=\u001b[39mdtype)\n\u001b[1;32m-> 1317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_sagemaker_mp_enabled():\n\u001b[0;32m 1318\u001b[0m \u001b[38;5;66;03m# Wrapping the base model twice in a DistributedModel will raise an error.\u001b[39;00m\n\u001b[0;32m 1319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_wrapped, smp\u001b[38;5;241m.\u001b[39mmodel\u001b[38;5;241m.\u001b[39mDistributedModel):\n\u001b[0;32m 1320\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_wrapped\n",
601
+ "File \u001b[1;32mc:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\transformers\\trainer.py:1619\u001b[0m, in \u001b[0;36m_inner_training_loop\u001b[1;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[0;32m 1616\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlr_scheduler \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1617\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_created_lr_scheduler \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m-> 1619\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_deepspeed_enabled:\n\u001b[0;32m 1620\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptimizer, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlr_scheduler \u001b[38;5;241m=\u001b[39m deepspeed_init(\u001b[38;5;28mself\u001b[39m, num_training_steps\u001b[38;5;241m=\u001b[39mmax_steps)\n\u001b[0;32m 1622\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m delay_optimizer_creation:\n",
602
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\lr_scheduler.py:68\u001b[0m, in \u001b[0;36mLRScheduler.__init__.<locals>.with_counter.<locals>.wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 66\u001b[0m instance\u001b[38;5;241m.\u001b[39m_step_count \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m 67\u001b[0m wrapped \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__get__\u001b[39m(instance, \u001b[38;5;28mcls\u001b[39m)\n\u001b[1;32m---> 68\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mwrapped\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
603
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\optimizer.py:373\u001b[0m, in \u001b[0;36mOptimizer.profile_hook_step.<locals>.wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 368\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 369\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[0;32m 370\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m must return None or a tuple of (new_args, new_kwargs), but got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresult\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 371\u001b[0m )\n\u001b[1;32m--> 373\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 374\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_optimizer_step_code()\n\u001b[0;32m 376\u001b[0m \u001b[38;5;66;03m# call optimizer step post hooks\u001b[39;00m\n",
604
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\optimizer.py:76\u001b[0m, in \u001b[0;36m_use_grad_for_differentiable.<locals>._use_grad\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 74\u001b[0m torch\u001b[38;5;241m.\u001b[39mset_grad_enabled(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdefaults[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdifferentiable\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 75\u001b[0m torch\u001b[38;5;241m.\u001b[39m_dynamo\u001b[38;5;241m.\u001b[39mgraph_break()\n\u001b[1;32m---> 76\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 77\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 78\u001b[0m torch\u001b[38;5;241m.\u001b[39m_dynamo\u001b[38;5;241m.\u001b[39mgraph_break()\n",
605
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\adamw.py:184\u001b[0m, in \u001b[0;36mAdamW.step\u001b[1;34m(self, closure)\u001b[0m\n\u001b[0;32m 171\u001b[0m beta1, beta2 \u001b[38;5;241m=\u001b[39m group[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbetas\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 173\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_init_group(\n\u001b[0;32m 174\u001b[0m group,\n\u001b[0;32m 175\u001b[0m params_with_grad,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 181\u001b[0m state_steps,\n\u001b[0;32m 182\u001b[0m )\n\u001b[1;32m--> 184\u001b[0m \u001b[43madamw\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 185\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams_with_grad\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 186\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 187\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp_avgs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 188\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp_avg_sqs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 189\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_exp_avg_sqs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 190\u001b[0m \u001b[43m \u001b[49m\u001b[43mstate_steps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 191\u001b[0m \u001b[43m \u001b[49m\u001b[43mamsgrad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mamsgrad\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 192\u001b[0m \u001b[43m \u001b[49m\u001b[43mbeta1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbeta1\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 193\u001b[0m \u001b[43m \u001b[49m\u001b[43mbeta2\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbeta2\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 194\u001b[0m \u001b[43m \u001b[49m\u001b[43mlr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mlr\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 195\u001b[0m \u001b[43m \u001b[49m\u001b[43mweight_decay\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mweight_decay\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 196\u001b[0m \u001b[43m \u001b[49m\u001b[43meps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43meps\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43mmaximize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmaximize\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[43mforeach\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mforeach\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 199\u001b[0m \u001b[43m \u001b[49m\u001b[43mcapturable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcapturable\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 200\u001b[0m \u001b[43m \u001b[49m\u001b[43mdifferentiable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdifferentiable\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 201\u001b[0m \u001b[43m \u001b[49m\u001b[43mfused\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfused\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 202\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrad_scale\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mgrad_scale\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 203\u001b[0m \u001b[43m \u001b[49m\u001b[43mfound_inf\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfound_inf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 204\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 206\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m loss\n",
606
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\adamw.py:335\u001b[0m, in \u001b[0;36madamw\u001b[1;34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, foreach, capturable, differentiable, fused, grad_scale, found_inf, amsgrad, beta1, beta2, lr, weight_decay, eps, maximize)\u001b[0m\n\u001b[0;32m 332\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 333\u001b[0m func \u001b[38;5;241m=\u001b[39m _single_tensor_adamw\n\u001b[1;32m--> 335\u001b[0m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 337\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrads\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 338\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp_avgs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 339\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp_avg_sqs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 340\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_exp_avg_sqs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 341\u001b[0m \u001b[43m \u001b[49m\u001b[43mstate_steps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 342\u001b[0m \u001b[43m \u001b[49m\u001b[43mamsgrad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mamsgrad\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 343\u001b[0m \u001b[43m \u001b[49m\u001b[43mbeta1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbeta1\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 344\u001b[0m \u001b[43m \u001b[49m\u001b[43mbeta2\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbeta2\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 345\u001b[0m \u001b[43m \u001b[49m\u001b[43mlr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlr\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 346\u001b[0m \u001b[43m \u001b[49m\u001b[43mweight_decay\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mweight_decay\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 347\u001b[0m \u001b[43m \u001b[49m\u001b[43meps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 348\u001b[0m \u001b[43m \u001b[49m\u001b[43mmaximize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmaximize\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 349\u001b[0m \u001b[43m \u001b[49m\u001b[43mcapturable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcapturable\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 350\u001b[0m \u001b[43m \u001b[49m\u001b[43mdifferentiable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdifferentiable\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 351\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrad_scale\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgrad_scale\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 352\u001b[0m \u001b[43m \u001b[49m\u001b[43mfound_inf\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfound_inf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 353\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
607
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\optim\\adamw.py:413\u001b[0m, in \u001b[0;36m_single_tensor_adamw\u001b[1;34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, grad_scale, found_inf, amsgrad, beta1, beta2, lr, weight_decay, eps, maximize, capturable, differentiable)\u001b[0m\n\u001b[0;32m 411\u001b[0m \u001b[38;5;66;03m# Decay the first and second moment running average coefficient\u001b[39;00m\n\u001b[0;32m 412\u001b[0m exp_avg\u001b[38;5;241m.\u001b[39mlerp_(grad, \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m-\u001b[39m beta1)\n\u001b[1;32m--> 413\u001b[0m \u001b[43mexp_avg_sq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmul_\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbeta2\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39maddcmul_(grad, grad, value\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m-\u001b[39m beta2)\n\u001b[0;32m 415\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m capturable \u001b[38;5;129;01mor\u001b[39;00m differentiable:\n\u001b[0;32m 416\u001b[0m step \u001b[38;5;241m=\u001b[39m step_t\n",
608
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
609
+ ]
610
+ }
611
+ ],
612
+ "source": [
613
+ "trainer.train()"
614
+ ]
615
+ },
616
+ {
617
+ "cell_type": "markdown",
618
+ "metadata": {
619
+ "id": "7zL7BghWwtZH"
620
+ },
621
+ "source": [
622
+ "## Save models"
623
+ ]
624
+ },
625
+ {
626
+ "cell_type": "code",
627
+ "execution_count": 41,
628
+ "metadata": {
629
+ "colab": {
630
+ "base_uri": "https://localhost:8080/"
631
+ },
632
+ "id": "R3CTFbR3lqOE",
633
+ "outputId": "1bfca296-21f8-4ede-d545-7f567d11f10c"
634
+ },
635
+ "outputs": [
636
+ {
637
+ "name": "stderr",
638
+ "output_type": "stream",
639
+ "text": [
640
+ "Saving model checkpoint to content/model_with_summary\n",
641
+ "Configuration saved in content/model_with_summary\\config.json\n"
642
+ ]
643
+ },
644
+ {
645
+ "name": "stderr",
646
+ "output_type": "stream",
647
+ "text": [
648
+ "Model weights saved in content/model_with_summary\\pytorch_model.bin\n"
649
+ ]
650
+ }
651
+ ],
652
+ "source": [
653
+ "trainer.save_model(f'{my_path}model_with_summary')"
654
+ ]
655
+ },
656
+ {
657
+ "cell_type": "code",
658
+ "execution_count": 42,
659
+ "metadata": {
660
+ "colab": {
661
+ "base_uri": "https://localhost:8080/"
662
+ },
663
+ "id": "-Dm5J3Ywieys",
664
+ "outputId": "e23711c3-67eb-48dc-dd07-6abc0ee090b6"
665
+ },
666
+ "outputs": [
667
+ {
668
+ "name": "stderr",
669
+ "output_type": "stream",
670
+ "text": [
671
+ "Vocabulary path (content/tokenizer) should be a directory\n"
672
+ ]
673
+ }
674
+ ],
675
+ "source": [
676
+ "tokenizer.save_vocabulary(f'{my_path}tokenizer')"
677
+ ]
678
+ },
679
+ {
680
+ "cell_type": "markdown",
681
+ "metadata": {
682
+ "id": "xxkC-HnujEQu"
683
+ },
684
+ "source": [
685
+ "#Generation"
686
+ ]
687
+ },
688
+ {
689
+ "cell_type": "code",
690
+ "execution_count": null,
691
+ "metadata": {
692
+ "id": "pJtoWx-WMY6W"
693
+ },
694
+ "outputs": [],
695
+ "source": [
696
+ "tokenizer = GPT2Tokenizer.from_pretrained(f'{my_path}tokenizer')\n",
697
+ "model = GPT2LMHeadModel.from_pretrained(f'{my_path}model_with_summary').to(DEVICE)"
698
+ ]
699
+ },
700
+ {
701
+ "cell_type": "code",
702
+ "execution_count": null,
703
+ "metadata": {
704
+ "colab": {
705
+ "base_uri": "https://localhost:8080/"
706
+ },
707
+ "id": "TKzQfU7wleKK",
708
+ "outputId": "92e40eb9-00c8-40a5-f649-01d87954a8ef"
709
+ },
710
+ "outputs": [
711
+ {
712
+ "data": {
713
+ "text/plain": [
714
+ "3"
715
+ ]
716
+ },
717
+ "execution_count": 11,
718
+ "metadata": {},
719
+ "output_type": "execute_result"
720
+ }
721
+ ],
722
+ "source": [
723
+ "SPECIAL_TOKENS = {'bos_token':'<bos>','eos_token' :'<eos>', 'pad_token':'<pad>', 'sep_token': '<sep>'}\n",
724
+ "tokenizer.add_special_tokens(SPECIAL_TOKENS)"
725
+ ]
726
+ },
727
+ {
728
+ "cell_type": "code",
729
+ "execution_count": null,
730
+ "metadata": {
731
+ "id": "kofX6i57RcLd"
732
+ },
733
+ "outputs": [],
734
+ "source": [
735
+ "class KeywordsStoppingCriteria(StoppingCriteria):\n",
736
+ " def __init__(self, keywords_ids:list):\n",
737
+ " self.keywords = keywords_ids\n",
738
+ "\n",
739
+ " def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:\n",
740
+ " if input_ids[0][-1] in self.keywords:\n",
741
+ " print(input_ids)\n",
742
+ " return True\n",
743
+ " return False"
744
+ ]
745
+ },
746
+ {
747
+ "cell_type": "code",
748
+ "execution_count": null,
749
+ "metadata": {
750
+ "id": "npykPtVhRcLd"
751
+ },
752
+ "outputs": [],
753
+ "source": [
754
+ "stop_criteria = KeywordsStoppingCriteria(tokenizer.encode(tokenizer.eos_token, return_tensors=\"pt\").to(DEVICE))"
755
+ ]
756
+ },
757
+ {
758
+ "cell_type": "markdown",
759
+ "metadata": {
760
+ "id": "-TVOwDiNmwqw"
761
+ },
762
+ "source": [
763
+ "## Задай свое начало предложения:\n",
764
+ "\n"
765
+ ]
766
+ },
767
+ {
768
+ "cell_type": "code",
769
+ "execution_count": null,
770
+ "metadata": {
771
+ "colab": {
772
+ "base_uri": "https://localhost:8080/"
773
+ },
774
+ "id": "upBkDzPkFtD0",
775
+ "outputId": "d248d2e0-4476-46f7-80a7-61963738ef67"
776
+ },
777
+ "outputs": [
778
+ {
779
+ "name": "stdout",
780
+ "output_type": "stream",
781
+ "text": [
782
+ "Введите начало заголовка или просто нажмите Enter:\n"
783
+ ]
784
+ }
785
+ ],
786
+ "source": [
787
+ "inp = input('Введите начало заголовка или просто нажмите Enter:')"
788
+ ]
789
+ },
790
+ {
791
+ "cell_type": "code",
792
+ "execution_count": null,
793
+ "metadata": {
794
+ "id": "VLaeBnu1RcLe"
795
+ },
796
+ "outputs": [],
797
+ "source": [
798
+ "inp = inp if len(inp) > 0 else tokenizer.bos_token #токен начала предложения\n",
799
+ "input_ids = tokenizer.encode(inp, return_tensors=\"pt\").to(DEVICE)"
800
+ ]
801
+ },
802
+ {
803
+ "cell_type": "code",
804
+ "execution_count": null,
805
+ "metadata": {
806
+ "colab": {
807
+ "base_uri": "https://localhost:8080/"
808
+ },
809
+ "id": "xclcUo5cRcLf",
810
+ "outputId": "05a741f0-6d9a-496f-ec28-c54c5e0d9807"
811
+ },
812
+ "outputs": [
813
+ {
814
+ "name": "stderr",
815
+ "output_type": "stream",
816
+ "text": [
817
+ "Setting `pad_token_id` to `eos_token_id`:50258 for open-end generation.\n"
818
+ ]
819
+ },
820
+ {
821
+ "name": "stdout",
822
+ "output_type": "stream",
823
+ "text": [
824
+ "<bos> Ученые впервые нашли венерические заболевания с помощью генной инженерии <sep> Ученые выяснили, что венерические заболевания с помощью генной терапии передаются исключительно половым путем. Это открытие может лечь в основу разработки метода контрацепции, основанного на генной терапии.&nbsp; <eos>\n"
825
+ ]
826
+ }
827
+ ],
828
+ "source": [
829
+ "with torch.no_grad():\n",
830
+ " out = model.generate(input_ids,\n",
831
+ " do_sample=True,\n",
832
+ " num_beams=3,\n",
833
+ " temperature=2.0,\n",
834
+ " top_p=0.9,\n",
835
+ " max_length = 200,\n",
836
+ " stopping_criteria=StoppingCriteriaList([stop_criteria]),\n",
837
+ " eos_token_id=tokenizer.eos_token_id,\n",
838
+ " bos_token_id=tokenizer.bos_token_id,\n",
839
+ " ).to(DEVICE)\n",
840
+ "print(tokenizer.batch_decode(out, skip_special_tokens=False)[0])"
841
+ ]
842
+ }
843
+ ],
844
+ "metadata": {
845
+ "colab": {
846
+ "include_colab_link": true,
847
+ "provenance": []
848
+ },
849
+ "kernelspec": {
850
+ "display_name": "Python 3",
851
+ "name": "python3"
852
+ },
853
+ "language_info": {
854
+ "codemirror_mode": {
855
+ "name": "ipython",
856
+ "version": 3
857
+ },
858
+ "file_extension": ".py",
859
+ "mimetype": "text/x-python",
860
+ "name": "python",
861
+ "nbconvert_exporter": "python",
862
+ "pygments_lexer": "ipython3",
863
+ "version": "3.11.5"
864
+ },
865
+ "widgets": {
866
+ "application/vnd.jupyter.widget-state+json": {
867
+ "15592d007be2409fa0dc6aaff0727554": {
868
+ "model_module": "@jupyter-widgets/controls",
869
+ "model_module_version": "1.5.0",
870
+ "model_name": "ProgressStyleModel",
871
+ "state": {
872
+ "_model_module": "@jupyter-widgets/controls",
873
+ "_model_module_version": "1.5.0",
874
+ "_model_name": "ProgressStyleModel",
875
+ "_view_count": null,
876
+ "_view_module": "@jupyter-widgets/base",
877
+ "_view_module_version": "1.2.0",
878
+ "_view_name": "StyleView",
879
+ "bar_color": null,
880
+ "description_width": ""
881
+ }
882
+ },
883
+ "160d666ebc934016a0f30892832f37f0": {
884
+ "model_module": "@jupyter-widgets/base",
885
+ "model_module_version": "1.2.0",
886
+ "model_name": "LayoutModel",
887
+ "state": {
888
+ "_model_module": "@jupyter-widgets/base",
889
+ "_model_module_version": "1.2.0",
890
+ "_model_name": "LayoutModel",
891
+ "_view_count": null,
892
+ "_view_module": "@jupyter-widgets/base",
893
+ "_view_module_version": "1.2.0",
894
+ "_view_name": "LayoutView",
895
+ "align_content": null,
896
+ "align_items": null,
897
+ "align_self": null,
898
+ "border": null,
899
+ "bottom": null,
900
+ "display": null,
901
+ "flex": null,
902
+ "flex_flow": null,
903
+ "grid_area": null,
904
+ "grid_auto_columns": null,
905
+ "grid_auto_flow": null,
906
+ "grid_auto_rows": null,
907
+ "grid_column": null,
908
+ "grid_gap": null,
909
+ "grid_row": null,
910
+ "grid_template_areas": null,
911
+ "grid_template_columns": null,
912
+ "grid_template_rows": null,
913
+ "height": null,
914
+ "justify_content": null,
915
+ "justify_items": null,
916
+ "left": null,
917
+ "margin": null,
918
+ "max_height": null,
919
+ "max_width": null,
920
+ "min_height": null,
921
+ "min_width": null,
922
+ "object_fit": null,
923
+ "object_position": null,
924
+ "order": null,
925
+ "overflow": null,
926
+ "overflow_x": null,
927
+ "overflow_y": null,
928
+ "padding": null,
929
+ "right": null,
930
+ "top": null,
931
+ "visibility": null,
932
+ "width": null
933
+ }
934
+ },
935
+ "1b63c50c01ca463487b94bd2ca3139f5": {
936
+ "model_module": "@jupyter-widgets/base",
937
+ "model_module_version": "1.2.0",
938
+ "model_name": "LayoutModel",
939
+ "state": {
940
+ "_model_module": "@jupyter-widgets/base",
941
+ "_model_module_version": "1.2.0",
942
+ "_model_name": "LayoutModel",
943
+ "_view_count": null,
944
+ "_view_module": "@jupyter-widgets/base",
945
+ "_view_module_version": "1.2.0",
946
+ "_view_name": "LayoutView",
947
+ "align_content": null,
948
+ "align_items": null,
949
+ "align_self": null,
950
+ "border": null,
951
+ "bottom": null,
952
+ "display": null,
953
+ "flex": null,
954
+ "flex_flow": null,
955
+ "grid_area": null,
956
+ "grid_auto_columns": null,
957
+ "grid_auto_flow": null,
958
+ "grid_auto_rows": null,
959
+ "grid_column": null,
960
+ "grid_gap": null,
961
+ "grid_row": null,
962
+ "grid_template_areas": null,
963
+ "grid_template_columns": null,
964
+ "grid_template_rows": null,
965
+ "height": null,
966
+ "justify_content": null,
967
+ "justify_items": null,
968
+ "left": null,
969
+ "margin": null,
970
+ "max_height": null,
971
+ "max_width": null,
972
+ "min_height": null,
973
+ "min_width": null,
974
+ "object_fit": null,
975
+ "object_position": null,
976
+ "order": null,
977
+ "overflow": null,
978
+ "overflow_x": null,
979
+ "overflow_y": null,
980
+ "padding": null,
981
+ "right": null,
982
+ "top": null,
983
+ "visibility": null,
984
+ "width": null
985
+ }
986
+ },
987
+ "2f49fd3cb2e2461eb562c403009c4acc": {
988
+ "model_module": "@jupyter-widgets/controls",
989
+ "model_module_version": "1.5.0",
990
+ "model_name": "DescriptionStyleModel",
991
+ "state": {
992
+ "_model_module": "@jupyter-widgets/controls",
993
+ "_model_module_version": "1.5.0",
994
+ "_model_name": "DescriptionStyleModel",
995
+ "_view_count": null,
996
+ "_view_module": "@jupyter-widgets/base",
997
+ "_view_module_version": "1.2.0",
998
+ "_view_name": "StyleView",
999
+ "description_width": ""
1000
+ }
1001
+ },
1002
+ "3cae9bd0f3e34a018f1c1770a65fb52f": {
1003
+ "model_module": "@jupyter-widgets/controls",
1004
+ "model_module_version": "1.5.0",
1005
+ "model_name": "HTMLModel",
1006
+ "state": {
1007
+ "_dom_classes": [],
1008
+ "_model_module": "@jupyter-widgets/controls",
1009
+ "_model_module_version": "1.5.0",
1010
+ "_model_name": "HTMLModel",
1011
+ "_view_count": null,
1012
+ "_view_module": "@jupyter-widgets/controls",
1013
+ "_view_module_version": "1.5.0",
1014
+ "_view_name": "HTMLView",
1015
+ "description": "",
1016
+ "description_tooltip": null,
1017
+ "layout": "IPY_MODEL_160d666ebc934016a0f30892832f37f0",
1018
+ "placeholder": "​",
1019
+ "style": "IPY_MODEL_2f49fd3cb2e2461eb562c403009c4acc",
1020
+ "value": "Skipping the first batches: 100%"
1021
+ }
1022
+ },
1023
+ "43a300cd4f3b4f26b5ef46bf4a7b4500": {
1024
+ "model_module": "@jupyter-widgets/controls",
1025
+ "model_module_version": "1.5.0",
1026
+ "model_name": "HBoxModel",
1027
+ "state": {
1028
+ "_dom_classes": [],
1029
+ "_model_module": "@jupyter-widgets/controls",
1030
+ "_model_module_version": "1.5.0",
1031
+ "_model_name": "HBoxModel",
1032
+ "_view_count": null,
1033
+ "_view_module": "@jupyter-widgets/controls",
1034
+ "_view_module_version": "1.5.0",
1035
+ "_view_name": "HBoxView",
1036
+ "box_style": "",
1037
+ "children": [
1038
+ "IPY_MODEL_3cae9bd0f3e34a018f1c1770a65fb52f",
1039
+ "IPY_MODEL_d5607a93190249ce87179ea2456630f6",
1040
+ "IPY_MODEL_8bab8300f98b4df9a5ece6dafa8daba1"
1041
+ ],
1042
+ "layout": "IPY_MODEL_e88887e4031f4851ac6f5fd5e7f7b933"
1043
+ }
1044
+ },
1045
+ "8bab8300f98b4df9a5ece6dafa8daba1": {
1046
+ "model_module": "@jupyter-widgets/controls",
1047
+ "model_module_version": "1.5.0",
1048
+ "model_name": "HTMLModel",
1049
+ "state": {
1050
+ "_dom_classes": [],
1051
+ "_model_module": "@jupyter-widgets/controls",
1052
+ "_model_module_version": "1.5.0",
1053
+ "_model_name": "HTMLModel",
1054
+ "_view_count": null,
1055
+ "_view_module": "@jupyter-widgets/controls",
1056
+ "_view_module_version": "1.5.0",
1057
+ "_view_name": "HTMLView",
1058
+ "description": "",
1059
+ "description_tooltip": null,
1060
+ "layout": "IPY_MODEL_1b63c50c01ca463487b94bd2ca3139f5",
1061
+ "placeholder": "​",
1062
+ "style": "IPY_MODEL_f1c2c1dc5cdd4e9ab3456d0e9bbb553d",
1063
+ "value": " 48/48 [00:00&lt;00:00, 962.01it/s]"
1064
+ }
1065
+ },
1066
+ "b510b835db64457d8e49ba3e965918de": {
1067
+ "model_module": "@jupyter-widgets/base",
1068
+ "model_module_version": "1.2.0",
1069
+ "model_name": "LayoutModel",
1070
+ "state": {
1071
+ "_model_module": "@jupyter-widgets/base",
1072
+ "_model_module_version": "1.2.0",
1073
+ "_model_name": "LayoutModel",
1074
+ "_view_count": null,
1075
+ "_view_module": "@jupyter-widgets/base",
1076
+ "_view_module_version": "1.2.0",
1077
+ "_view_name": "LayoutView",
1078
+ "align_content": null,
1079
+ "align_items": null,
1080
+ "align_self": null,
1081
+ "border": null,
1082
+ "bottom": null,
1083
+ "display": null,
1084
+ "flex": null,
1085
+ "flex_flow": null,
1086
+ "grid_area": null,
1087
+ "grid_auto_columns": null,
1088
+ "grid_auto_flow": null,
1089
+ "grid_auto_rows": null,
1090
+ "grid_column": null,
1091
+ "grid_gap": null,
1092
+ "grid_row": null,
1093
+ "grid_template_areas": null,
1094
+ "grid_template_columns": null,
1095
+ "grid_template_rows": null,
1096
+ "height": null,
1097
+ "justify_content": null,
1098
+ "justify_items": null,
1099
+ "left": null,
1100
+ "margin": null,
1101
+ "max_height": null,
1102
+ "max_width": null,
1103
+ "min_height": null,
1104
+ "min_width": null,
1105
+ "object_fit": null,
1106
+ "object_position": null,
1107
+ "order": null,
1108
+ "overflow": null,
1109
+ "overflow_x": null,
1110
+ "overflow_y": null,
1111
+ "padding": null,
1112
+ "right": null,
1113
+ "top": null,
1114
+ "visibility": null,
1115
+ "width": null
1116
+ }
1117
+ },
1118
+ "d5607a93190249ce87179ea2456630f6": {
1119
+ "model_module": "@jupyter-widgets/controls",
1120
+ "model_module_version": "1.5.0",
1121
+ "model_name": "FloatProgressModel",
1122
+ "state": {
1123
+ "_dom_classes": [],
1124
+ "_model_module": "@jupyter-widgets/controls",
1125
+ "_model_module_version": "1.5.0",
1126
+ "_model_name": "FloatProgressModel",
1127
+ "_view_count": null,
1128
+ "_view_module": "@jupyter-widgets/controls",
1129
+ "_view_module_version": "1.5.0",
1130
+ "_view_name": "ProgressView",
1131
+ "bar_style": "success",
1132
+ "description": "",
1133
+ "description_tooltip": null,
1134
+ "layout": "IPY_MODEL_b510b835db64457d8e49ba3e965918de",
1135
+ "max": 48,
1136
+ "min": 0,
1137
+ "orientation": "horizontal",
1138
+ "style": "IPY_MODEL_15592d007be2409fa0dc6aaff0727554",
1139
+ "value": 48
1140
+ }
1141
+ },
1142
+ "e88887e4031f4851ac6f5fd5e7f7b933": {
1143
+ "model_module": "@jupyter-widgets/base",
1144
+ "model_module_version": "1.2.0",
1145
+ "model_name": "LayoutModel",
1146
+ "state": {
1147
+ "_model_module": "@jupyter-widgets/base",
1148
+ "_model_module_version": "1.2.0",
1149
+ "_model_name": "LayoutModel",
1150
+ "_view_count": null,
1151
+ "_view_module": "@jupyter-widgets/base",
1152
+ "_view_module_version": "1.2.0",
1153
+ "_view_name": "LayoutView",
1154
+ "align_content": null,
1155
+ "align_items": null,
1156
+ "align_self": null,
1157
+ "border": null,
1158
+ "bottom": null,
1159
+ "display": null,
1160
+ "flex": null,
1161
+ "flex_flow": null,
1162
+ "grid_area": null,
1163
+ "grid_auto_columns": null,
1164
+ "grid_auto_flow": null,
1165
+ "grid_auto_rows": null,
1166
+ "grid_column": null,
1167
+ "grid_gap": null,
1168
+ "grid_row": null,
1169
+ "grid_template_areas": null,
1170
+ "grid_template_columns": null,
1171
+ "grid_template_rows": null,
1172
+ "height": null,
1173
+ "justify_content": null,
1174
+ "justify_items": null,
1175
+ "left": null,
1176
+ "margin": null,
1177
+ "max_height": null,
1178
+ "max_width": null,
1179
+ "min_height": null,
1180
+ "min_width": null,
1181
+ "object_fit": null,
1182
+ "object_position": null,
1183
+ "order": null,
1184
+ "overflow": null,
1185
+ "overflow_x": null,
1186
+ "overflow_y": null,
1187
+ "padding": null,
1188
+ "right": null,
1189
+ "top": null,
1190
+ "visibility": null,
1191
+ "width": null
1192
+ }
1193
+ },
1194
+ "f1c2c1dc5cdd4e9ab3456d0e9bbb553d": {
1195
+ "model_module": "@jupyter-widgets/controls",
1196
+ "model_module_version": "1.5.0",
1197
+ "model_name": "DescriptionStyleModel",
1198
+ "state": {
1199
+ "_model_module": "@jupyter-widgets/controls",
1200
+ "_model_module_version": "1.5.0",
1201
+ "_model_name": "DescriptionStyleModel",
1202
+ "_view_count": null,
1203
+ "_view_module": "@jupyter-widgets/base",
1204
+ "_view_module_version": "1.2.0",
1205
+ "_view_name": "StyleView",
1206
+ "description_width": ""
1207
+ }
1208
+ }
1209
+ }
1210
+ }
1211
+ },
1212
+ "nbformat": 4,
1213
+ "nbformat_minor": 0
1214
+ }
cached_lm_GPT2Tokenizer_64_GROB.txt ADDED
Binary file (826 kB). View file
 
cached_lm_GPT2Tokenizer_64_train_dataset.txt ADDED
Binary file (3.18 kB). View file
 
main.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
2
+ import torch
3
+ DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
4
+
5
+ # Для наглядности будем работать с русскоязычной GPT от Сбера.
6
+ # Ниже команды для загрузки и инициализации модели и токенизатора.
7
+ model_name_or_path = "ai-forever/rugpt3medium_based_on_gpt2"
8
+ tokenizer = GPT2Tokenizer.from_pretrained(model_name_or_path)
9
+ model = GPT2LMHeadModel.from_pretrained(model_name_or_path).to(DEVICE)
10
+
11
+
12
+ # prompt engineering for QA
13
+ text = "Вопрос: 'Сколько будет 2+2?'\nОтвет:"
14
+ input_ids = tokenizer.encode(text, return_tensors="pt").to(DEVICE)
15
+ out = model.generate(input_ids, do_sample=False)
16
+
17
+ generated_text = list(map(tokenizer.decode, out))[0]
18
+ print(generated_text)
19
+
test.ipynb ADDED
@@ -0,0 +1,491 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "name": "stderr",
10
+ "output_type": "stream",
11
+ "text": [
12
+ "C:\\Users\\addmi\\AppData\\Roaming\\Python\\Python311\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
13
+ " from .autonotebook import tqdm as notebook_tqdm\n"
14
+ ]
15
+ }
16
+ ],
17
+ "source": [
18
+ "from transformers import GPT2LMHeadModel, GPT2Config, GPT2Tokenizer, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments\n",
19
+ "\n",
20
+ "model_name_or_path = \"ai-forever/rugpt3small_based_on_gpt2\"\n",
21
+ "tokenizer = GPT2Tokenizer.from_pretrained(model_name_or_path)\n",
22
+ "model = GPT2LMHeadModel.from_pretrained(model_name_or_path)"
23
+ ]
24
+ },
25
+ {
26
+ "cell_type": "code",
27
+ "execution_count": 2,
28
+ "metadata": {},
29
+ "outputs": [
30
+ {
31
+ "data": {
32
+ "text/plain": [
33
+ "('4.10.0', '0.20.1')"
34
+ ]
35
+ },
36
+ "execution_count": 2,
37
+ "metadata": {},
38
+ "output_type": "execute_result"
39
+ }
40
+ ],
41
+ "source": [
42
+ "import accelerate\n",
43
+ "import transformers\n",
44
+ "\n",
45
+ "transformers.__version__, accelerate.__version__"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": 3,
51
+ "metadata": {},
52
+ "outputs": [],
53
+ "source": [
54
+ "text = \"\"\"Трогательным ножичком пытать свою плоть\n",
55
+ "Трогательным ножичком пытать свою плоть\n",
56
+ "До крови прищемить добровольные пальцы\n",
57
+ "Отважно смакуя леденцы на палочке\n",
58
+ "Целеустремлённо набивать карманы\n",
59
+ "Мёртвыми мышатами,живыми хуями\n",
60
+ "Шоколадными конфетами \n",
61
+ "И нерукотворными пиздюлями\n",
62
+ "На патриархальной свалке устаревших понятий\n",
63
+ "Использованных образов и вежливых слов\n",
64
+ "Покончив с собою,уничтожить весь мир\n",
65
+ "ПОКОНЧИВ С СОБОЮ-УНИЧТОЖИТЬ ВЕСЬ МИР!!\n",
66
+ "\n",
67
+ " ...вечность пахнет нефтью\n",
68
+ " ...вечность пахнет нефтью\n",
69
+ "\n",
70
+ "Словно иней,сердобольный смех\n",
71
+ "Словно иней,сердобольный смех\n",
72
+ "Словно иней,сердобольный смех\n",
73
+ "Славно валится на...\n",
74
+ " на...\n",
75
+ " на РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ\n",
76
+ "\n",
77
+ "География подлости\n",
78
+ "Орфография ненависти\n",
79
+ "Апология невежества\n",
80
+ "Мифология оптимизма\n",
81
+ "Законы гаубицы благонравия\n",
82
+ "Знатное пиршество благоразумия\n",
83
+ "Устами ребенка глаголет яма\n",
84
+ "Устами ребенка глаголет пуля\n",
85
+ "\n",
86
+ " ...вечность пахнет нефтью\n",
87
+ " ...вечность пахнет нефтью\n",
88
+ "\n",
89
+ "Мастерство быть излишним,подобно мне\n",
90
+ "Мастерство быть любимым,подобно петле\n",
91
+ "Мастерство быть глобальным,как печёное яблоко\n",
92
+ "Искусство вовремя уйти в сторонку\n",
93
+ " Искусство быть посторонним\n",
94
+ " Искусство быть посторонним\n",
95
+ "Новейшее средство для очистки духовок\n",
96
+ "От задохнувшихся по собственной воле\n",
97
+ "Новейшее средство для очистки верёвок\n",
98
+ "От скверного запаха немытых шей\n",
99
+ " Новейшее средство находить виновных\n",
100
+ " Новейшее средство находить виновных\n",
101
+ "\n",
102
+ " РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ\n",
103
+ "\n",
104
+ "За открывшейся дверью — пустота\n",
105
+ "Это значит,что кто-то пришёл за тобой\n",
106
+ "Это значит,что теперь ты кому-то \n",
107
+ "Понадобился\n",
108
+ "\n",
109
+ "А снег всё идёт,а снег всё идёт\n",
110
+ "Русское поле источает снег\n",
111
+ "\n",
112
+ "Иных хоронили в упаковке глазёнок\n",
113
+ "Иных хоронили в упаковке газет\n",
114
+ "\n",
115
+ "А то,что на бойне умертвили бычка \n",
116
+ "На то всеобщая радость,всеобщая гордость\n",
117
+ "Всеобщая ненависть,всеобщая воля\n",
118
+ "Всеобщая воля да всеобщая старость\n",
119
+ "\n",
120
+ "Набить до отказа собой могилу \n",
121
+ "Это значит наследовать землю\n",
122
+ "Что же такое наследовать землю\n",
123
+ "Это значит исчерпать терпение\n",
124
+ " Что и требовалось доказать\n",
125
+ " Что и требовалось доказать\n",
126
+ "\n",
127
+ "В дверной глазок — в замочную щель \n",
128
+ "Гениальные мыслишки — мировые войнушки\n",
129
+ "Неофициальные пупы земли\n",
130
+ "Эмалированные части головных систем\n",
131
+ "Инстинктивные добровольцы\n",
132
+ "Во имя вселенной и хлебной корочки\n",
133
+ "Люди с большой буквы\n",
134
+ "Слово «люди» пишется с большой буквы\n",
135
+ "\n",
136
+ "Свастика веры стянула лица\n",
137
+ "Вавилонская азбука налипла на пальцах\n",
138
+ "Исторически оправданный метод\n",
139
+ "Пожирания сырой земли\n",
140
+ " Это ли не то,что нам надо?!\n",
141
+ " Это ли не то,что нам надо?!\n",
142
+ "\n",
143
+ "А поутру они неизбежно проснулись\n",
144
+ "Не простудились — не замарались\n",
145
+ "Называли вещи своими именами\n",
146
+ "Сеяли доброе,разумное,вечное\n",
147
+ "Всё посеяли,всё назвали\n",
148
+ "Кушать подано — честь по чести\n",
149
+ "На первое были плоды просвещения\n",
150
+ "А на второе — кровавые мальчики\n",
151
+ "\n",
152
+ "Орденоносный господь победоносного мира\n",
153
+ "Заслуженный господь краснознамённого страха\n",
154
+ "Праведный праздник для правильных граждан\n",
155
+ "Отточенный серп для созревших колосьев\n",
156
+ "\n",
157
+ "Яма как принцип движения к Солнцу\n",
158
+ "Кашу слезами не испортишь нет\n",
159
+ "\n",
160
+ "Полные сани девичьим срамом\n",
161
+ "Полные простыни ребячьим смрадом\n",
162
+ "Девичьи глазки,кукушкины слёзки\n",
163
+ "А так же всякие иные предметы\n",
164
+ "\n",
165
+ "Так кто погиб в генеральном сраженьи\n",
166
+ "Кто погиб в гениальном поражении\n",
167
+ "За полную чашку жалости\n",
168
+ "В Сталинградской битве озверевшей похоти?\n",
169
+ "\n",
170
+ "Самолёт усмехнулся вдребезги\n",
171
+ "В бугорок обетованной земли\n",
172
+ "Самолёт усмехнулся вдребезги\n",
173
+ "В бугорок обетованной землицы\n",
174
+ "\n",
175
+ "А свою любовь я собственноручно\n",
176
+ "Освободил от дальнейших неизбежных огорчений\n",
177
+ "Подманил ее пряником\n",
178
+ "Подманил ее пряником \n",
179
+ "Изнасиловал пьяным жестоким ботинком\n",
180
+ "И повесил на облачке,словно ребёнок\n",
181
+ " СВОЮ НЕЛЮБИМУЮ КУКЛУ\n",
182
+ " СВОЮ НЕЛЮБИМУЮ КУКЛУ\n",
183
+ " СВОЮ НЕЛЮБИМУЮ КУКЛУ\n",
184
+ " СВОЮ НЕЛЮБИМУЮ КУКЛУ\n",
185
+ "\n",
186
+ "Словно иней,сердобольный смех \n",
187
+ "Словно иней,сердобольный смех \n",
188
+ "Словно иней,сердобольный смех \n",
189
+ "Словно иней,сердобольный смех \n",
190
+ "Славно валиться на...\n",
191
+ " на...\n",
192
+ " на РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ\n",
193
+ " \n",
194
+ " Вечность пахнет нефтью\"\"\""
195
+ ]
196
+ },
197
+ {
198
+ "cell_type": "code",
199
+ "execution_count": 3,
200
+ "metadata": {},
201
+ "outputs": [
202
+ {
203
+ "name": "stderr",
204
+ "output_type": "stream",
205
+ "text": [
206
+ "c:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\transformers\\data\\datasets\\language_modeling.py:54: FutureWarning: This dataset will be removed from the library soon, preprocessing should be handled with the 🤗 Datasets library. You can have a look at this example script for pointers: https://github.com/huggingface/transformers/blob/master/examples/pytorch/language-modeling/run_mlm.py\n",
207
+ " warnings.warn(\n"
208
+ ]
209
+ }
210
+ ],
211
+ "source": [
212
+ "# Сохраним обучающие данные в .txt файл\n",
213
+ "train_path = 'GROB.txt'\n",
214
+ "'''\n",
215
+ "with open(train_path, \"w\") as f:\n",
216
+ " f.write(text)'''\n",
217
+ "\n",
218
+ "# Создание датасета\n",
219
+ "train_dataset = TextDataset(tokenizer=tokenizer, file_path=train_path, block_size=64)\n",
220
+ "\n",
221
+ "# Создание даталодера (нарезает текст на оптимальные по длине куски)\n",
222
+ "data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)\n"
223
+ ]
224
+ },
225
+ {
226
+ "cell_type": "code",
227
+ "execution_count": 6,
228
+ "metadata": {},
229
+ "outputs": [
230
+ {
231
+ "name": "stderr",
232
+ "output_type": "stream",
233
+ "text": [
234
+ "PyTorch: setting up devices\n",
235
+ "The default value for the training argument `--report_to` will change in v5 (from all installed integrations to none). In v5, you will need to use `--report_to all` to get the same behavior as now. You should start updating your code and make this info disappear :-).\n"
236
+ ]
237
+ }
238
+ ],
239
+ "source": [
240
+ "# Подготовка параметров fine-tuning\n",
241
+ "training_args = TrainingArguments(\n",
242
+ " output_dir=\"./gpt2-finetuned\",\n",
243
+ " overwrite_output_dir=True,\n",
244
+ " num_train_epochs=10, # Количество эпох обучения\n",
245
+ " per_device_train_batch_size=32,\n",
246
+ " per_device_eval_batch_size=32,\n",
247
+ " save_steps=10_000, # Сохранять модель каждые 10000 шагов\n",
248
+ " save_total_limit=2,\n",
249
+ " gradient_accumulation_steps=16,\n",
250
+ ")\n",
251
+ "\n",
252
+ "# Создание объекта Trainer\n",
253
+ "trainer = Trainer(\n",
254
+ " model=model,\n",
255
+ " args=training_args,\n",
256
+ " data_collator=data_collator,\n",
257
+ " train_dataset=train_dataset,\n",
258
+ ")"
259
+ ]
260
+ },
261
+ {
262
+ "cell_type": "code",
263
+ "execution_count": 7,
264
+ "metadata": {},
265
+ "outputs": [
266
+ {
267
+ "name": "stderr",
268
+ "output_type": "stream",
269
+ "text": [
270
+ "***** Running training *****\n",
271
+ " Num examples = 4477\n",
272
+ " Num Epochs = 10\n",
273
+ " Instantaneous batch size per device = 32\n",
274
+ " Total train batch size (w. parallel, distributed & accumulation) = 512\n",
275
+ " Gradient Accumulation steps = 16\n",
276
+ " Total optimization steps = 80\n"
277
+ ]
278
+ },
279
+ {
280
+ "name": "stderr",
281
+ "output_type": "stream",
282
+ "text": []
283
+ },
284
+ {
285
+ "ename": "KeyboardInterrupt",
286
+ "evalue": "",
287
+ "output_type": "error",
288
+ "traceback": [
289
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
290
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
291
+ "Cell \u001b[1;32mIn[7], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Запуск fine-tuning\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
292
+ "File \u001b[1;32mc:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\transformers\\trainer.py:1284\u001b[0m, in \u001b[0;36mTrainer.train\u001b[1;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[0;32m 1282\u001b[0m tr_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining_step(model, inputs)\n\u001b[0;32m 1283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1284\u001b[0m tr_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining_step\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1285\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcurrent_flos \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mfloat\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfloating_point_ops(inputs))\n\u001b[0;32m 1287\u001b[0m \u001b[38;5;66;03m# Optimizer step for deepspeed must be called on every step regardless of the value of gradient_accumulation_steps\u001b[39;00m\n",
293
+ "File \u001b[1;32mc:\\GitHub\\TRAIN_GPT\\.conda\\Lib\\site-packages\\transformers\\trainer.py:1807\u001b[0m, in \u001b[0;36mTrainer.training_step\u001b[1;34m(self, model, inputs)\u001b[0m\n\u001b[0;32m 1805\u001b[0m loss \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdeepspeed\u001b[38;5;241m.\u001b[39mbackward(loss)\n\u001b[0;32m 1806\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1807\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1809\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m loss\u001b[38;5;241m.\u001b[39mdetach()\n",
294
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\_tensor.py:492\u001b[0m, in \u001b[0;36mTensor.backward\u001b[1;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[0;32m 482\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m 483\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[0;32m 484\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[0;32m 485\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 490\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[0;32m 491\u001b[0m )\n\u001b[1;32m--> 492\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 493\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[0;32m 494\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
295
+ "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python311\\site-packages\\torch\\autograd\\__init__.py:251\u001b[0m, in \u001b[0;36mbackward\u001b[1;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[0;32m 246\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[0;32m 248\u001b[0m \u001b[38;5;66;03m# The reason we repeat the same comment below is that\u001b[39;00m\n\u001b[0;32m 249\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[0;32m 250\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[1;32m--> 251\u001b[0m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[0;32m 252\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 253\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 254\u001b[0m \u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 255\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 256\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 257\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 258\u001b[0m \u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 259\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
296
+ "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
297
+ ]
298
+ }
299
+ ],
300
+ "source": [
301
+ "# Запуск fine-tuning\n",
302
+ "trainer.train()"
303
+ ]
304
+ },
305
+ {
306
+ "cell_type": "code",
307
+ "execution_count": 17,
308
+ "metadata": {},
309
+ "outputs": [
310
+ {
311
+ "name": "stderr",
312
+ "output_type": "stream",
313
+ "text": [
314
+ "Configuration saved in ./gpt2-finetuned\\config.json\n"
315
+ ]
316
+ },
317
+ {
318
+ "name": "stderr",
319
+ "output_type": "stream",
320
+ "text": [
321
+ "Model weights saved in ./gpt2-finetuned\\pytorch_model.bin\n",
322
+ "tokenizer config file saved in ./gpt2-finetuned\\tokenizer_config.json\n",
323
+ "Special tokens file saved in ./gpt2-finetuned\\special_tokens_map.json\n"
324
+ ]
325
+ },
326
+ {
327
+ "data": {
328
+ "text/plain": [
329
+ "('./gpt2-finetuned\\\\tokenizer_config.json',\n",
330
+ " './gpt2-finetuned\\\\special_tokens_map.json',\n",
331
+ " './gpt2-finetuned\\\\vocab.json',\n",
332
+ " './gpt2-finetuned\\\\merges.txt',\n",
333
+ " './gpt2-finetuned\\\\added_tokens.json')"
334
+ ]
335
+ },
336
+ "execution_count": 17,
337
+ "metadata": {},
338
+ "output_type": "execute_result"
339
+ }
340
+ ],
341
+ "source": [
342
+ "# Сохранение обученной модели\n",
343
+ "model.save_pretrained(\"./gpt2-finetuned\")\n",
344
+ "tokenizer.save_pretrained(\"./gpt2-finetuned\")"
345
+ ]
346
+ },
347
+ {
348
+ "cell_type": "code",
349
+ "execution_count": 22,
350
+ "metadata": {},
351
+ "outputs": [
352
+ {
353
+ "name": "stdout",
354
+ "output_type": "stream",
355
+ "text": [
356
+ "Сгенерированный вопрос: Новый год к нам мчится\n",
357
+ "Гениальные мыслишки лезут в замочную щель\n",
358
+ "Неофициальные пупы земли\n",
359
+ "Эмалированные части головных систем\n",
360
+ "Инстинктивные добровольцы\n",
361
+ "Во имя вселенной и хлебной корочки\n",
362
+ "Люди с большой буквы\n",
363
+ "Слово «люди» пишется со значком «пожиратель».\n",
364
+ "\n",
365
+ "Яма как принцип движения к Солнцу\n",
366
+ "Кашу слезами не испортишь нет\n",
367
+ " Это ли не то,что нам надо?!\n",
368
+ " на РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ\n",
369
+ "Новейшее средство для очистки духовок\n",
370
+ "От задохнувшихся по собственной воле\n",
371
+ "Сеяли доброе,разумное,вечное\n",
372
+ "Всё посеяли,всё назвали\n",
373
+ "Кушать подано — честь по чести\n",
374
+ "На первое были плоды просвещения\n",
375
+ "А на второе — кровавые мальчики\n",
376
+ " \n",
377
+ "\n",
378
+ "Орденоносный праздник для правильных граждан\n",
379
+ "За полную чашку жалости\n",
380
+ "В дверной глазок не загляни\n",
381
+ "Полные простыни надежды\n",
382
+ "Девичьи глазки,кукушкины слёзки\n",
383
+ "Иные погибали в генеральном сраженьи\n",
384
+ "Штрафбаты,войны,колониальные реформы\n",
385
+ "Мифология оптимизма\n",
386
+ "Законы гаубицы благонравия\n",
387
+ "Знатное пиршество благоразумия\n",
388
+ "Устами ребенка глаголет пуля\n",
389
+ " ...вечность пахнет нефтью\n",
390
+ " СВОЮ НЕЛЮБИМУЮ КУ\n"
391
+ ]
392
+ },
393
+ {
394
+ "ename": "",
395
+ "evalue": "",
396
+ "output_type": "error",
397
+ "traceback": [
398
+ "\u001b[1;31mПри выполнении кода в текущей ячейке или предыдущей ячейке ядро аварийно завершило работу. Проверьте код в ячейках, чтобы определить возможную причину сбоя. Щелкните <a href=\"https://aka.ms/vscodeJupyterKernelCrash\">здесь</a> для получения дополнительных сведений. Подробнее см. в <a href='command:jupyter.viewOutput'>журнале Jupyter</a>."
399
+ ]
400
+ }
401
+ ],
402
+ "source": [
403
+ "# Задаем контекст для генерации вопроса\n",
404
+ "context = \"Новый год к нам мчится\"\n",
405
+ "input_ids = tokenizer.encode(context, return_tensors=\"pt\")\n",
406
+ "\n",
407
+ "# Генерация текста (вопроса)\n",
408
+ "output = model.generate(input_ids, max_length=300, num_beams=5, no_repeat_ngram_size=2, top_k=50, top_p=0.95, temperature=0.7)\n",
409
+ "\n",
410
+ "# Декодирование сгенерированного текста\n",
411
+ "question = tokenizer.decode(output[0], skip_special_tokens=True)\n",
412
+ "\n",
413
+ "print(\"Сгенерированный вопрос:\", question)"
414
+ ]
415
+ },
416
+ {
417
+ "cell_type": "code",
418
+ "execution_count": 12,
419
+ "metadata": {},
420
+ "outputs": [],
421
+ "source": [
422
+ "import torch"
423
+ ]
424
+ },
425
+ {
426
+ "cell_type": "code",
427
+ "execution_count": 19,
428
+ "metadata": {},
429
+ "outputs": [
430
+ {
431
+ "name": "stdout",
432
+ "output_type": "stream",
433
+ "text": [
434
+ "\n",
435
+ "Трогательным ножечком пытать свою плоть!\n",
436
+ "Трогательным ножечком пытать свою плоть!\n",
437
+ "До крови прищемить добровольные пальцы\n",
438
+ "Отважно смакуя леденцы на палочке\n",
439
+ "Целеустремлённо набивать карманы\n",
440
+ "Мёртвыми мышатами,живыми хуями\n",
441
+ "Шрамом на пальцах,живыми хуями\n",
442
+ "Шрамом на пальцах,живыми хуями\n",
443
+ "\n",
444
+ "А свою любовь я собственноручно\n",
445
+ "Освободил от дальнейших неизбеж\n"
446
+ ]
447
+ }
448
+ ],
449
+ "source": [
450
+ "\n",
451
+ "# Пример вероя��ностного сэмплирвоания с ограничением\n",
452
+ "text = \"Трогательным ножечком пытать свою плоть!\\n\"\n",
453
+ "input_ids = tokenizer.encode(text, return_tensors=\"pt\")\n",
454
+ "model.eval()\n",
455
+ "with torch.no_grad():\n",
456
+ " out = model.generate(input_ids,\n",
457
+ " do_sample=True,\n",
458
+ " num_beams=2,\n",
459
+ " temperature=1.5,\n",
460
+ " top_p=0.9,\n",
461
+ " max_length=100,\n",
462
+ " )\n",
463
+ "\n",
464
+ "generated_text = list(map(tokenizer.decode, out))[0]\n",
465
+ "print()\n",
466
+ "print(generated_text)"
467
+ ]
468
+ }
469
+ ],
470
+ "metadata": {
471
+ "kernelspec": {
472
+ "display_name": "Python 3",
473
+ "language": "python",
474
+ "name": "python3"
475
+ },
476
+ "language_info": {
477
+ "codemirror_mode": {
478
+ "name": "ipython",
479
+ "version": 3
480
+ },
481
+ "file_extension": ".py",
482
+ "mimetype": "text/x-python",
483
+ "name": "python",
484
+ "nbconvert_exporter": "python",
485
+ "pygments_lexer": "ipython3",
486
+ "version": "3.11.5"
487
+ }
488
+ },
489
+ "nbformat": 4,
490
+ "nbformat_minor": 2
491
+ }
train_dataset.txt ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Трогательным ножичком пытать свою плоть
2
+ Трогательным ножичком пытать свою плоть
3
+ До крови прищемить добровольные пальцы
4
+ Отважно смакуя леденцы на палочке
5
+ Целеустремлённо набивать карманы
6
+ Мёртвыми мышатами,живыми хуями
7
+ Шоколадными конфетами
8
+ И нерукотворными пиздюлями
9
+ На патриархальной свалке устаревших понятий
10
+ Использованных образов и вежливых слов
11
+ Покончив с собою,уничтожить весь мир
12
+ ПОКОНЧИВ С СОБОЮ-УНИЧТОЖИТЬ ВЕСЬ МИР!!
13
+
14
+ ...вечность пахнет нефтью
15
+ ...вечность пахнет нефтью
16
+
17
+ Словно иней,сердобольный смех
18
+ Словно иней,сердобольный смех
19
+ Словно иней,сердобольный смех
20
+ Славно валится на...
21
+ на...
22
+ на РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ
23
+
24
+ География подлости
25
+ Орфография ненависти
26
+ Апология невежества
27
+ Мифология оптимизма
28
+ Законы гаубицы благонравия
29
+ Знатное пиршество благоразумия
30
+ Устами ребенка глаголет яма
31
+ Устами ребенка глаголет пуля
32
+
33
+ ...вечность пахнет нефтью
34
+ ...вечность пахнет нефтью
35
+
36
+ Мастерство быть излишним,подобно мне
37
+ Мастерство быть любимым,подобно петле
38
+ Мастерство быть глобальным,как печёное яблоко
39
+ Искусство вовремя уйти в сторонку
40
+ Искусство быть посторонним
41
+ Искусство быть посторонним
42
+ Новейшее средство для очистки духовок
43
+ От задохнувшихся по собственной воле
44
+ Новейшее средство для очистки верёвок
45
+ От скверного запаха немытых шей
46
+ Новейшее средство находить виновных
47
+ Новейшее средство находить виновных
48
+
49
+ РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ
50
+
51
+ За открывшейся дверью — пустота
52
+ Это значит,что кто-то пришёл за тобой
53
+ Это значит,что теперь ты кому-то
54
+ Понадобился
55
+
56
+ А снег всё идёт,а снег всё идёт
57
+ Русское поле источает снег
58
+
59
+ Иных хоронили в упаковке глазёнок
60
+ Иных хоронили в упаковке газет
61
+
62
+ А то,что на бойне умертвили бычка
63
+ На то всеобщая радость,всеобщая гордость
64
+ Всеобщая ненависть,всеобщая воля
65
+ Всеобщая воля да всеобщая старость
66
+
67
+ Набить до отказа собой могилу
68
+ Это значит наследовать землю
69
+ Что же такое наследовать землю
70
+ Это значит исчерпать терпение
71
+ Что и требовалось доказать
72
+ Что и требовалось доказать
73
+
74
+ В дверной глазок — в замочную щель
75
+ Гениальные мыслишки — мировые войнушки
76
+ Неофициальные пупы земли
77
+ Эмалированные части головных систем
78
+ Инстинктивные добровольцы
79
+ Во имя вселенной и хлебной корочки
80
+ Люди с большой буквы
81
+ Слово «люди» пишется с большой буквы
82
+
83
+ Свастика веры стянула лица
84
+ Вавилонская азбука налипла на пальцах
85
+ Исторически оправданный метод
86
+ Пожирания сырой земли
87
+ Это ли не то,что нам надо?!
88
+ Это ли не то,что нам надо?!
89
+
90
+ А поутру они неизбежно проснулись
91
+ Не простудились — не замарались
92
+ Называли вещи своими именами
93
+ Сеяли доброе,разумное,вечное
94
+ Всё посеяли,всё назвали
95
+ Кушать подано — честь по чести
96
+ На первое были плоды просвещения
97
+ А на второе — кровавые мальчики
98
+
99
+ Орденоносный господь победоносного мира
100
+ Заслуженный господь краснознамённого страха
101
+ Праведный праздник для правильных граждан
102
+ Отточенный серп для созревших колосьев
103
+
104
+ Яма как принцип движения к Солнцу
105
+ Кашу слезами не испортишь нет
106
+
107
+ Полные сани девичьим срамом
108
+ Полные простыни ребячьим смрадом
109
+ Девичьи глазки,кукушкины слёзки
110
+ А так же всякие иные предметы
111
+
112
+ Так кто погиб в генеральном сраженьи
113
+ Кто погиб в гениальном поражении
114
+ За полную чашку жалости
115
+ В Сталинградской битве озверевшей похоти?
116
+
117
+ Самолёт усмехнулся вдребезги
118
+ В бугорок обетованной земли
119
+ Самолёт усмехнулся вдребезги
120
+ В бугорок обетованной землицы
121
+
122
+ А свою любовь я собственноручно
123
+ Освободил от дальнейших неизбежных огорчений
124
+ Подманил ее пряником
125
+ Подманил ее пряником
126
+ Изнасиловал пьяным жестоким ботинком
127
+ И повесил на облачке,словно ребёнок
128
+ СВОЮ НЕЛЮБИМУЮ КУКЛУ
129
+ СВОЮ НЕЛЮБИМУЮ КУКЛУ
130
+ СВОЮ НЕЛЮБИМУЮ КУКЛУ
131
+ СВОЮ НЕЛЮБИМУЮ КУКЛУ
132
+
133
+ Словно иней,сердобольный смех
134
+ Словно иней,сердобольный смех
135
+ Словно иней,сердобольный смех
136
+ Словно иней,сердобольный смех
137
+ Славно валиться на...
138
+ на...
139
+ на РУССКОЕ ПОЛЕ ЭКСПЕРИМЕНТОВ
140
+
141
+ Вечность пахнет нефтью
unit_all_md_to_one_file.ipynb ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 2,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "name": "stdout",
10
+ "output_type": "stream",
11
+ "text": [
12
+ "Объединенный файл сохранен в 'GROB.txt'.\n"
13
+ ]
14
+ }
15
+ ],
16
+ "source": [
17
+ "import os\n",
18
+ "\n",
19
+ "def combine_md_to_txt(input_folder, output_file):\n",
20
+ " # Проверяем существование каталога\n",
21
+ " if not os.path.exists(input_folder):\n",
22
+ " print(f\"Указанный каталог '{input_folder}' не существует.\")\n",
23
+ " return\n",
24
+ "\n",
25
+ " # Получаем список файлов с расширением .md\n",
26
+ " md_files = [f for f in os.listdir(input_folder) if f.endswith('.md')]\n",
27
+ "\n",
28
+ " # Проверяем, есть ли файлы для объединения\n",
29
+ " if not md_files:\n",
30
+ " print(f\"В каталоге '{input_folder}' нет файлов с расширением .md для объединения.\")\n",
31
+ " return\n",
32
+ "\n",
33
+ " # Объединяем содержимое файлов\n",
34
+ " combined_content = \"\"\n",
35
+ " for md_file in md_files:\n",
36
+ " file_path = os.path.join(input_folder, md_file)\n",
37
+ " with open(file_path, 'r', encoding='utf-8') as file:\n",
38
+ " #combined_content += f\"# {md_file}\\n\\n\" # Добавляем заголовок с именем файла\n",
39
+ " combined_content += file.read() + \"\\n\\n\" # Добавляем содержимое файла\n",
40
+ "\n",
41
+ " # Записываем объединенный контент в файл .txt\n",
42
+ " with open(output_file, 'w', encoding='utf-8') as output:\n",
43
+ " output.write(combined_content)\n",
44
+ "\n",
45
+ " print(f\"Объединенный файл сохранен в '{output_file}'.\")\n",
46
+ "\n",
47
+ "# Укажите путь к каталогу с файлами .md и имя выходного файла .txt\n",
48
+ "input_folder_path = 'GROB'\n",
49
+ "output_file_path = 'GROB.txt'\n",
50
+ "\n",
51
+ "# Вызываем функцию для объединения файлов\n",
52
+ "combine_md_to_txt(input_folder_path, output_file_path)\n"
53
+ ]
54
+ }
55
+ ],
56
+ "metadata": {
57
+ "kernelspec": {
58
+ "display_name": "Python 3",
59
+ "language": "python",
60
+ "name": "python3"
61
+ },
62
+ "language_info": {
63
+ "codemirror_mode": {
64
+ "name": "ipython",
65
+ "version": 3
66
+ },
67
+ "file_extension": ".py",
68
+ "mimetype": "text/x-python",
69
+ "name": "python",
70
+ "nbconvert_exporter": "python",
71
+ "pygments_lexer": "ipython3",
72
+ "version": "3.11.5"
73
+ }
74
+ },
75
+ "nbformat": 4,
76
+ "nbformat_minor": 2
77
+ }