Jorj2064 commited on
Commit
2e73711
1 Parent(s): 90969e9

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +190 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """Gradio_GPT_bot.ipynb
3
+ import os
4
+ os.system ('export TRANSFORMERS_CACHE = /my/cache/dir')
5
+ Automatically generated by Colaboratory.
6
+
7
+ Original file is located at
8
+ https://colab.research.google.com/drive/18CH6wtcr46hWqBqpzieH_oBOmJHecOVl
9
+
10
+ # Imports
11
+ """
12
+
13
+ # Commented out IPython magic to ensure Python compatibility.
14
+ # %%capture
15
+ # # установка gradio для написания веб интерефейса
16
+ # # установка transformers для использования языковых моделей с платформы HF
17
+ #!pip install gradio transformers
18
+
19
+ import random
20
+ import time
21
+ from typing import List, Dict, Tuple, Union
22
+ #from IPython import display
23
+
24
+ import gradio as gr
25
+ import torch
26
+ import transformers
27
+
28
+
29
+
30
+ """# Tokenizer and Model
31
+
32
+ **Инициализация модели**
33
+ Страница модели
34
+ https://huggingface.co/ai-forever/rugpt3medium_based_on_gpt2
35
+ """
36
+
37
+ from transformers import pipeline
38
+ from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
39
+
40
+ # # инициализация через pipeline
41
+ # model_name = "ai-forever/rugpt3medium_based_on_gpt2"
42
+ # pipe = pipeline("text-generation", model=model_name)
43
+ # sample = pipeline('test test', pad_token_id=generator.tokenizer.eos_token_id)
44
+
45
+ model_name = "ai-forever/rugpt3medium_based_on_gpt2"
46
+ model = AutoModelForCausalLM.from_pretrained(model_name)
47
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
48
+ tokenizer.pad_token_id = tokenizer.eos_token_id
49
+
50
+ DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
51
+ model = model.to(DEVICE)
52
+
53
+ """Генерация текста"""
54
+
55
+ # Commented out IPython magic to ensure Python compatibility.
56
+ # %%time
57
+ #
58
+ # # токенизация текста в индексы токенов и маски внимания
59
+ # text_promt = 'меня засосала опасная трясина '
60
+ # inputs = tokenizer(text_promt, return_tensors="pt").to(DEVICE)
61
+ #
62
+ # # конфиг словарь для генерации текста
63
+ # gen_config_dict = dict(
64
+ # do_sample=True, # делать ли случайное семплирование с параметрами ниже (если False то выскочит предупреждение)
65
+ # max_new_tokens=30, # сколько максимум новых токенов надо генерировать
66
+ # top_k=50, # семплировать только из top_k самых вероятных токенов
67
+ # top_p=0.9, # семплировать только из токенов сумма вероятностей которых не больше top_p
68
+ # temperature=2.0, # температура для софтмакса
69
+ # num_beams=3, # параметр алгоритма Beam search
70
+ # repetition_penalty=2.0, # штраф за то что модель повторяется
71
+ # pad_token_id=tokenizer.pad_token_id, # установить токен pad чтобы не было предупреждения
72
+ # )
73
+ # # конфиг для генерации текста из словаря
74
+ # generation_config = GenerationConfig(**gen_config_dict)
75
+ #
76
+ # # генерация текста (индексы токенов)
77
+ # output = model.generate(**inputs, generation_config=generation_config)
78
+ #
79
+ # # сопостовление идексам токенов слов из словаря токенайзера
80
+ # generated_text = tokenizer.decode(output[0], skip_special_tokens=False)
81
+ #
82
+ # # удаление исходного промта из ответа потому что он тоже возвращается
83
+ # generated_text = generated_text[len(text_promt):]
84
+ # generated_text
85
+
86
+ """Функция для генерации"""
87
+
88
+ # функция принимает текстовый запрос и словарь параметров генерации
89
+ def generate_text(text_promt: str, gen_config_dict: Dict[str, Union[float, int]]) -> str:
90
+ inputs = tokenizer(text_promt, return_tensors="pt").to(DEVICE)
91
+ generation_config = GenerationConfig(**gen_config_dict)
92
+ output = model.generate(**inputs, pad_token_id=tokenizer.eos_token_id, generation_config=generation_config)
93
+ generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
94
+ generated_text = generated_text[len(text_promt):]
95
+ return generated_text
96
+
97
+
98
+ # конфиг словарь для генерации текста
99
+ gen_config_dict = dict(
100
+ do_sample=True, # делать ли случайное семплирование с параметрами ниже (если False то выскочит предупреждение)
101
+ max_new_tokens=20, # сколько максимум новых токенов надо генерировать
102
+ top_k=50, # семплировать только из top_k самых вероятных токенов
103
+ top_p=0.9, # семплировать только из токенов сумма вероятностей которых не больше top_p
104
+ temperature=2.0, # температура для софтмакса
105
+ num_beams=3, # параметр алгоритма Beam search
106
+ repetition_penalty=2.0, # штраф за то что модель повторяется
107
+ pad_token_id=tokenizer.pad_token_id, # установить токен pad чтобы не было предупреждения
108
+ )
109
+
110
+
111
+ text_promt = 'в небесной канцелярии выходной'
112
+ generated_text = generate_text(text_promt, gen_config_dict)
113
+ generated_text
114
+
115
+ """# Gradio App
116
+
117
+ ## Новый интерфейс Чат-бота
118
+
119
+ Вариант с системным промтом и разными входными аргументами и настройками
120
+ """
121
+
122
+ import gradio as gr
123
+
124
+ # функция будет вызыватся при нажатии на Enter в окошке вовода текста
125
+ # кроме обычных аргументов - сообщения пользователя и истории - принимает еще параметры для конфига генерации
126
+ def generate(message, history, *components):
127
+ # print(system_promt)
128
+ # обновление словаря новыми агрументами и создание конфига генерации текста
129
+ gen_config.update(dict(zip(gen_config.keys(), components)))
130
+ gen_config['top_k'] = int(gen_config['top_k'])
131
+ gen_config['num_beams'] = int(gen_config['num_beams'])
132
+ generation_config = GenerationConfig(**gen_config)
133
+
134
+ # добавить системный промт в начало запроса и сгенерировать текст
135
+ promt = message
136
+ inputs = tokenizer(promt, return_tensors="pt").to(DEVICE)
137
+ output = model.generate(**inputs, generation_config=generation_config, pad_token_id=tokenizer.eos_token_id)
138
+ generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
139
+ generated_text = generated_text[len(promt):]
140
+ # имитация набора сообщения чат-ботом (посимвольня генерация через yield в цикле)
141
+ for i in range(len(generated_text)):
142
+ time.sleep(0.05) # задержка с которой бот вводит текст
143
+ yield generated_text[:i+1]
144
+
145
+ # словарь для конфига генерации текста
146
+ gen_config = dict(
147
+ do_sample=False,
148
+ max_length=60,
149
+ top_k=50,
150
+ top_p=0.9,
151
+ temperature=2.0,
152
+ num_beams=3,
153
+ repetition_penalty=2.0,
154
+ )
155
+
156
+
157
+ # компоненты настройки конфига генерации текста
158
+ components = [
159
+ gr.Checkbox(label="do_sample", value=gen_config["do_sample"]),
160
+ gr.Slider(label="max_length", value=gen_config["max_length"], minimum=1, maximum=300, step=10),
161
+ gr.Number(label="top_k", value=gen_config["top_k"], minimum=0, maximum=50, step=10),
162
+ gr.Number(label="top_p", value=gen_config["top_p"], minimum=0, maximum=1, step=0.1),
163
+ gr.Number(label="temperature", value=gen_config["temperature"], minimum=0, maximum=10, step=0.1),
164
+ gr.Number(label="num_beams", value=gen_config["num_beams"], minimum=0, maximum=5, step=1),
165
+ gr.Number(label="repetition_penalty", value=gen_config["repetition_penalty"], minimum=0, maximum=5, step=0.1),
166
+ ]
167
+
168
+ # при нажатии Enter в чате будет вызыватся функция generate
169
+ interface = gr.ChatInterface(
170
+ generate,
171
+ chatbot=gr.Chatbot(height=300), # вход для функции generate: message
172
+ textbox=gr.Textbox(placeholder="Задайте любой вопрос", container=False, scale=2), # выходной бокс для текста
173
+
174
+ # дополнительные входы для функции generate (*components)
175
+ additional_inputs=components,
176
+
177
+ # настройки оформления
178
+ title="Чат-бот T10", # название страницы
179
+ description="Окно переписки с ботом", # описание окошка переписки
180
+ theme="Glass", # темы: Glass, Monochrome, Soft
181
+ # examples=["Hello", "Am I cool?", "Are tomatoes vegetables?"], # примеры должны быть множественными если аргументов много
182
+ # cache_examples=True, # кешировать примеры
183
+
184
+ # дполнительные кнопки (если не нужна какая либо кнопка ставим None)
185
+ submit_btn='Отправить',
186
+ retry_btn='Повторить вопрос',
187
+ undo_btn="Удалить предыдущий вопрос",
188
+ clear_btn="Очистить историю",
189
+ )
190
+
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ torch
3
+ torchaudio
4
+ transformtrs