Jorj2064 commited on
Commit
1c99a10
1 Parent(s): d051ded

Upload 2 files

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