Google Colab: Революция в области машинного обучения и науки о данных
Google Colaboratory, более известный как Google Colab, представляет собой бесплатный облачный сервис от Google, который позволяет пользователям писать и выполнять произвольный код Python через браузер. Этот сервис особенно полезен для студентов, исследователей и разработчиков в области машинного обучения (ML) и науки о данных (DS), предоставляя доступ к мощным вычислительным ресурсам без необходимости сложной настройки локального окружения.
Основные преимущества Google Colab
Доступность и удобство использования
Google Colab работает прямо в браузере, не требуя от пользователей установки дополнительного программного обеспечения. Это делает его идеальным инструментом для быстрого начала работы с проектами машинного обучения, а также для обмена результатами исследований и обучающими материалами.
Бесплатный доступ к вычислительным мощностям
Одной из ключевых особенностей Colab является возможность бесплатного использования графических процессоров (GPU) и тензорных процессоров (TPU). Это значительно ускоряет процесс обучения моделей машинного обучения, делая высокопроизводительные вычисления доступными широкому кругу пользователей.
Совместная работа и обмен знаниями
Google Colab поддерживает возможности совместной работы над проектами в реальном времени, аналогично другим продуктам Google, таким как Документы и Таблицы. Пользователи могут делиться своими ноутбуками с коллегами или друзьями, предоставляя доступ к редактированию или просмотру, что способствует обмену знаниями и сотрудничеству в научном сообществе.
Интеграция с Google Drive и другими сервисами
Colab тесно интегрирован с Google Drive, что облегчает хранение и доступ к данным и ноутбукам. Также поддерживается интеграция с GitHub и другими популярными инструментами и сервисами, что делает Colab универсальным инструментом для работы над проектами машинного обучения и науки о данных.
Начало работы с Google Colab
Чтобы начать работу с Google Colab, достаточно иметь учетную запись Google. Пользователи могут создавать новые ноутбуки или загружать существующие Jupyter ноутбуки непосредственно в Colab для дальнейшей работы. Интерфейс Colab предоставляет все необходимые инструменты для написания и выполнения кода, включая возможность добавления текстовых и математических заметок для лучшего понимания и документирования проектов.
Заключение
Google Colab значительно упрощает порог входа в мир машинного обучения и науки о данных, предоставляя мощные инструменты для обучения, исследования и совместной работы. Благодаря своей доступности, мощным вычислительным ресурсам и гибкости, Colab стал незаменимым инструментом для студентов, исследователей и разработчиков по всему миру.
Код для создания модели, обучения и проверки обученной модели
from google.colab import drive drive.mount('/gdrive') %cd /gdrive
pip install transformers[torch]
pip install torch_xla
pip install accelerate -U
pip install torch torchvision torchaudio
Создание модели. GPU 14.5 gb.
from transformers import GPT2Tokenizer, GPT2Config, GPT2LMHeadModel # Загружаем предварительно созданный токенизатор tokenizer = GPT2Tokenizer.from_pretrained('/gdrive/MyDrive/TrenerGpt/tokenizer') # Создаем конфигурацию модели с нужными параметрами model_config = GPT2Config( vocab_size=tokenizer.vocab_size, n_layer=22, n_head=32, n_embd=2048, intermediate_size=3072, hidden_size=1536, max_position_embeddings=3072, num_attention_heads=32, gradient_checkpointing=True, bos_token_id=tokenizer.bos_token_id, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.pad_token_id, sep_token_id=tokenizer.sep_token_id ) # Создаем модель на основе заданной конфигурации model = GPT2LMHeadModel(config=model_config) model.set_input_embeddings(model.resize_token_embeddings(len(tokenizer))) # Сохраняем модель и токенизатор model.save_pretrained('/gdrive/MyDrive/TrenerGpt/model') tokenizer.save_pretrained('/gdrive/MyDrive/TrenerGpt/model')
Обучение МОДЕЛИ.
import argparse
import os
import torch
from torch.utils.data import DataLoader, Dataset
from transformers import GPT2Tokenizer, GPT2LMHeadModel
from torch.optim import AdamW
from torch.optim.lr_scheduler import StepLR
from tqdm import tqdm
class CustomTextDataset(Dataset):
def __init__(self, tokenizer, file_path, block_size):
with open(file_path, 'r', encoding='utf-8') as f:
lines = [line for line in f.read().splitlines() if (len(line) > 0 and not line.isspace())]
self.examples = tokenizer.batch_encode_plus(lines, add_special_tokens=True, max_length=block_size, truncation=True, padding="max_length")["input_ids"]
def __len__(self):
return len(self.examples)
def __getitem__(self, i):
return torch.tensor(self.examples[i], dtype=torch.long)
def train(model, dataset, tokenizer, device, batch_size, epochs, model_path):
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
optimizer = AdamW(model.parameters(), lr=5e-5)
scheduler = StepLR(optimizer, step_size=1, gamma=0.95)
model.train()
model.to(device)
for epoch in range(epochs):
epoch_progress = tqdm(data_loader, desc=f"Epoch {epoch+1}/{epochs}")
for batch in epoch_progress:
batch = batch.to(device)
inputs, labels = batch, batch
optimizer.zero_grad()
outputs = model(inputs, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()
epoch_progress.set_postfix(loss=loss.item())
scheduler.step()
print(f"Epoch {epoch+1}/{epochs} completed.")
model.save_pretrained(model_path)
tokenizer.save_pretrained(model_path)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--num_epochs', type=int, default=1) # коллличество эпох
parser.add_argument('--dataset_path', type=str, default="/gdrive/MyDrive/TrenerGptmini/dataset.txt")
parser.add_argument('--device', type=str, default="cuda" if torch.cuda.is_available() else "cpu")
args = parser.parse_known_args()[0]
dataset_path = args.dataset_path
model_path = "/gdrive/MyDrive/TrenerGptmini/model"
num_epochs = args.num_epochs
batch_size = 2 # должен учитывать количество ядер процессора и доступную оперативную память
device = torch.device(args.device)
try:
tokenizer = GPT2Tokenizer.from_pretrained(model_path)
model = GPT2LMHeadModel.from_pretrained(model_path)
except Exception as e:
print(f"Error loading model from {model_path}, loading GPT-2 base model instead. Error: {e}")
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
model.to(device)
dataset = CustomTextDataset(tokenizer, dataset_path, block_size=2048) # Учитывает среднюю длину текстовых фрагментов, которые модель будет обрабатывать.
train(model, dataset, tokenizer, device, batch_size, num_epochs, model_path)
if __name__ == '__main__':
main()
*Скрипт для проверки ответов.*
import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer class GPT2Generator: def __init__(self, model_path): self.tokenizer = GPT2Tokenizer.from_pretrained(model_path) self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.model = GPT2LMHeadModel.from_pretrained(model_path).to(self.device) def generate_text(self, input_text, temperature_value, length_value, num_results, no_repeat_ngram_size): input_ids = self.tokenizer.encode(input_text, return_tensors='pt').to(self.device) attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=input_ids.device) outputs = self.model.generate( input_ids=input_ids, attention_mask=attention_mask, max_length=length_value, num_return_sequences=num_results, no_repeat_ngram_size=no_repeat_ngram_size, repetition_penalty=1.5, temperature=temperature_value, do_sample=True ) result_text = "" for i, output in enumerate(outputs): generated_text = self.tokenizer.decode(output, skip_special_tokens=True) result_text += f"Результат {i+1}:\n{generated_text}\n\n" return result_text gpt2_generator = GPT2Generator("/gdrive/MyDrive/TrenerGpt/model") temperature_value = 0.1 length_value = 70 num_results = 1 ngram_value = 2 def generate_text(): input_text = input("Введи затравку: ") result_text = gpt2_generator.generate_text(input_text, temperature_value, length_value, num_results, ngram_value) print(result_text) if __name__ == "__main__": while True: user_input = input("Выберите действие (1 - сгенерировать текст, 2 - выход): ") if user_input == "1": generate_text() elif user_input == "2": break else: print("Некорректный ввод. Попробуйте снова.")