Upload 2 files
Browse files- AI.py +35 -0
- generate_multilingual.py +61 -0
AI.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from transformers import T5Config, T5ForConditionalGeneration
|
| 3 |
+
|
| 4 |
+
def create_t5_3b_model(vocab_size: int = 32128) -> T5ForConditionalGeneration:
|
| 5 |
+
"""
|
| 6 |
+
Создаёт encoder-decoder модель T5 с ~3 миллиардами параметров.
|
| 7 |
+
Параметры взяты из официальной спецификации T5-3B (v1.1).
|
| 8 |
+
"""
|
| 9 |
+
config = T5Config(
|
| 10 |
+
vocab_size=vocab_size, # Размер словаря (как в оригинальном T5)
|
| 11 |
+
d_model=1024, # Размерность скрытого слоя
|
| 12 |
+
d_kv=128, # Размерность ключей/значений в attention
|
| 13 |
+
num_heads=32, # Количество голов внимания
|
| 14 |
+
num_layers=24, # Количество слоёв в encoder и decoder
|
| 15 |
+
d_ff=16384, # Размерность feed‑forward слоя
|
| 16 |
+
dropout_rate=0.1, # Вероятность dropout
|
| 17 |
+
feed_forward_proj="gated-gelu", # Тип проекции (T5 v1.1 использует gated‑GELU)
|
| 18 |
+
tie_word_embeddings=False, # Не связываем входные и выходные эмбеддинги (обычно False для T5)
|
| 19 |
+
# Дополнительные параметры можно оставить по умолчанию
|
| 20 |
+
)
|
| 21 |
+
model = T5ForConditionalGeneration(config)
|
| 22 |
+
return model
|
| 23 |
+
|
| 24 |
+
if __name__ == "__main__":
|
| 25 |
+
# Создаём модель
|
| 26 |
+
model = create_t5_3b_model()
|
| 27 |
+
|
| 28 |
+
# Выводим число параметров
|
| 29 |
+
num_params = model.num_parameters()
|
| 30 |
+
print(f"Модель содержит {num_params:,} параметров.")
|
| 31 |
+
|
| 32 |
+
# Сохраняем конфигурацию (и веса, если нужно)
|
| 33 |
+
model.config.save_pretrained("./t5-3b-config")
|
| 34 |
+
# model.save_pretrained("./t5-3b-random") # раскомментировать для сохранения весов (около 12 ГБ)
|
| 35 |
+
print("Конфигурация сохранена в папку ./t5-3b-config")
|
generate_multilingual.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
import argparse
|
| 3 |
+
import multiprocessing as mp
|
| 4 |
+
from faker import Faker
|
| 5 |
+
import os
|
| 6 |
+
import random
|
| 7 |
+
|
| 8 |
+
def generate_chunk(chunk_id, num_examples, languages, output_dir, chunk_size=10000):
|
| 9 |
+
"""
|
| 10 |
+
Генерирует чанк датасета.
|
| 11 |
+
Если languages — список, то для каждого примера случайно выбирается язык.
|
| 12 |
+
"""
|
| 13 |
+
fakers = {lang: Faker(lang) for lang in languages}
|
| 14 |
+
filename = os.path.join(output_dir, f"chunk_{chunk_id:05d}.jsonl")
|
| 15 |
+
with open(filename, 'w', encoding='utf-8') as f:
|
| 16 |
+
for _ in range(num_examples):
|
| 17 |
+
lang = random.choice(languages)
|
| 18 |
+
fake = fakers[lang]
|
| 19 |
+
text = fake.paragraph(nb_sentences=random.randint(5, 15), variable_nb_sentences=True)
|
| 20 |
+
record = {"text": text, "language": lang}
|
| 21 |
+
f.write(json.dumps(record, ensure_ascii=False) + '\n')
|
| 22 |
+
return filename
|
| 23 |
+
|
| 24 |
+
def main():
|
| 25 |
+
parser = argparse.ArgumentParser(description="Генерация мультиязычного синтетического датасета в формате JSONL")
|
| 26 |
+
parser.add_argument("--total_examples", type=int, default=1_000_000,
|
| 27 |
+
help="Общее количество примеров (текстов) для генерации")
|
| 28 |
+
parser.add_argument("--languages", type=str, nargs='+', default=["en_US", "ru_RU", "zh_CN"],
|
| 29 |
+
help="Список локалей через пробел (например, en_US ru_RU zh_CN)")
|
| 30 |
+
parser.add_argument("--output_dir", type=str, default="./multilingual_dataset",
|
| 31 |
+
help="Директория для сохранения чанков")
|
| 32 |
+
parser.add_argument("--chunk_size", type=int, default=10000,
|
| 33 |
+
help="Количество примеров в одном файле-чанке")
|
| 34 |
+
parser.add_argument("--num_workers", type=int, default=4,
|
| 35 |
+
help="Количество параллельных процессов для генерации")
|
| 36 |
+
args = parser.parse_args()
|
| 37 |
+
|
| 38 |
+
os.makedirs(args.output_dir, exist_ok=True)
|
| 39 |
+
|
| 40 |
+
num_chunks = (args.total_examples + args.chunk_size - 1) // args.chunk_size
|
| 41 |
+
chunks = []
|
| 42 |
+
for i in range(num_chunks):
|
| 43 |
+
start = i * args.chunk_size
|
| 44 |
+
end = min(start + args.chunk_size, args.total_examples)
|
| 45 |
+
num_in_chunk = end - start
|
| 46 |
+
chunks.append((i, num_in_chunk, args.languages, args.output_dir, args.chunk_size))
|
| 47 |
+
|
| 48 |
+
pool = mp.Pool(processes=args.num_workers)
|
| 49 |
+
results = []
|
| 50 |
+
for chunk in chunks:
|
| 51 |
+
results.append(pool.apply_async(generate_chunk, chunk))
|
| 52 |
+
pool.close()
|
| 53 |
+
pool.join()
|
| 54 |
+
|
| 55 |
+
for r in results:
|
| 56 |
+
r.get()
|
| 57 |
+
|
| 58 |
+
print(f"Генерация завершена. Чанки сохранены в {args.output_dir}")
|
| 59 |
+
|
| 60 |
+
if __name__ == "main":
|
| 61 |
+
main()
|