У цій публікації ми демонструємо, як ефективно налаштувати найсучаснішу модель білкової мови (pLM) для прогнозування субклітинної локалізації білка за допомогою Amazon SageMaker.
Білки — це молекулярні механізми організму, які відповідають за все, від руху м’язів до реакції на інфекції. Незважаючи на цю різноманітність, усі білки складаються з повторюваних ланцюгів молекул, які називаються амінокислотами. Геном людини кодує 20 стандартних амінокислот, кожна з яких має дещо іншу хімічну структуру. Вони можуть бути представлені літерами алфавіту, що потім дозволяє нам аналізувати та досліджувати білки як текстовий рядок. Величезна можлива кількість білкових послідовностей і структур – це те, що дає білкам широкий спектр використання.
Білки також відіграють ключову роль у розробці ліків як потенційні мішені, а також як терапевтичні засоби. Як показано в наведеній нижче таблиці, багато найбільш продаваних ліків у 2022 році були або білками (особливо антитілами), або іншими молекулами, такими як мРНК, які транслювалися в білки в організмі. Через це багатьом дослідникам науки про життя потрібно швидше, дешевше та точніше відповідати на запитання про білки.
ІМ'Я | виробник | 2022 Глобальні продажі (млрд. дол. США) | Показання до застосування |
Комірнати | Pfizer / BioNTech | $40.8 | COVID-19 |
Спайкевакс | Сучасний | $21.8 | COVID-19 |
Humira | AbbVie | $21.6 | Артрит, хвороба Крона та інші |
Кейтруда | Merck | $21.0 | Різні онкологічні захворювання |
Джерело даних: Urquhart, L. Топ компаній і препаратів за продажами в 2022 році. Nature Reviews Drug Discovery 22, 260–260 (2023).
Оскільки ми можемо представити білки як послідовності символів, ми можемо аналізувати їх за допомогою методів, спочатку розроблених для письмової мови. Це включає в себе великі мовні моделі (LLM), попередньо навчені на величезних наборах даних, які потім можна адаптувати для конкретних завдань, таких як узагальнення тексту або чат-боти. Подібним чином, pLMs попередньо навчаються на великих базах даних білкових послідовностей за допомогою неміченого самоконтрольованого навчання. Ми можемо адаптувати їх, щоб передбачати такі речі, як 3D-структура білка або те, як він може взаємодіяти з іншими молекулами. Дослідники навіть використовували pLM для розробки нових білків з нуля. Ці інструменти не замінюють людський науковий досвід, але вони мають потенціал для прискорення доклінічної розробки та планування випробувань.
Однією з проблем цих моделей є їхній розмір. Як LLM, так і pLM зросли на порядки за останні кілька років, як показано на наступному малюнку. Це означає, що може знадобитися багато часу, щоб навчити їх до достатньої точності. Це також означає, що вам потрібно використовувати обладнання, особливо графічні процесори, з великим об’ємом пам’яті для зберігання параметрів моделі.
Довгий час навчання, плюс великі екземпляри, дорівнює високій вартості, яка може зробити цю роботу недоступною для багатьох дослідників. Наприклад, у 2023 році а дослідна група описав навчання pLM зі 100 мільярдами параметрів на 768 GPU A100 протягом 164 днів! На щастя, у багатьох випадках ми можемо заощадити час і ресурси, адаптувавши існуючий pLM до нашого конкретного завдання. Ця методика називається тонка настройка, а також дозволяє нам запозичувати розширені інструменти з інших типів мовного моделювання.
Огляд рішення
Конкретна проблема, яку ми розглядаємо в цій публікації, така субклітинна локалізація: Враховуючи послідовність білка, чи можемо ми побудувати модель, яка зможе передбачити, чи живе він назовні (клітинна мембрана) чи всередині клітини? Це важлива інформація, яка може допомогти нам зрозуміти функцію та чи стане вона хорошою мішенню для ліків.
Ми починаємо із завантаження загальнодоступного набору даних за допомогою Студія Amazon SageMaker. Потім ми використовуємо SageMaker для точного налаштування моделі білкової мови ESM-2 за допомогою ефективного методу навчання. Нарешті, ми розгортаємо модель як кінцеву точку висновку в реальному часі та використовуємо її для тестування деяких відомих білків. Наступна діаграма ілюструє цей робочий процес.
У наступних розділах ми розглядаємо кроки для підготовки даних навчання, створення сценарію навчання та запуску навчального завдання SageMaker. Весь код, представлений у цій публікації, доступний на GitHub.
Підготуйте дані для навчання
Ми використовуємо частину Набір даних DeepLoc-2, який містить кілька тисяч білків SwissProt з експериментально визначеним розташуванням. Ми фільтруємо високоякісні послідовності між 100–512 амінокислотами:
df = pd.read_csv(
"https://services.healthtech.dtu.dk/services/DeepLoc-2.0/data/Swissprot_Train_Validation_dataset.csv"
).drop(["Unnamed: 0", "Partition"], axis=1)
df["Membrane"] = df["Membrane"].astype("int32")
# filter for sequences between 100 and 512 amino acides
df = df[df["Sequence"].apply(lambda x: len(x)).between(100, 512)]
# Remove unnecessary features
df = df[["Sequence", "Kingdom", "Membrane"]]
Далі ми токенізуємо послідовності та розбиваємо їх на навчальні та оцінювальні набори:
dataset = Dataset.from_pandas(df).train_test_split(test_size=0.2, shuffle=True)
tokenizer = AutoTokenizer.from_pretrained("facebook/esm2_t33_650M_UR50D")
def preprocess_data(examples, max_length=512):
text = examples["Sequence"]
encoding = tokenizer(text, truncation=True, max_length=max_length)
encoding["labels"] = examples["Membrane"]
return encoding
encoded_dataset = dataset.map(
preprocess_data,
batched=True,
num_proc=os.cpu_count(),
remove_columns=dataset["train"].column_names,
)
encoded_dataset.set_format("torch")
Нарешті, ми завантажуємо оброблені навчальні та оцінювальні дані в Служба простого зберігання Amazon (Amazon S3):
train_s3_uri = S3_PATH + "/data/train"
test_s3_uri = S3_PATH + "/data/test"
encoded_dataset["train"].save_to_disk(train_s3_uri)
encoded_dataset["test"].save_to_disk(test_s3_uri)
Створіть навчальний сценарій
Режим сценарію SageMaker дозволяє запускати ваш спеціальний навчальний код у контейнерах фреймворку оптимізованого машинного навчання (ML), якими керує AWS. Для цього прикладу ми адаптуємо an існуючий сценарій для класифікації тексту від Hugging Face. Це дозволяє нам випробувати кілька методів для підвищення ефективності нашої навчальної роботи.
Спосіб 1: Зважене заняття
Як і багато біологічних наборів даних, дані DeepLoc розподілені нерівномірно, тобто немає однакової кількості мембранних і немембранних білків. Ми могли б повторно відібрати наші дані та відкинути записи з основного класу. Однак це зменшило б загальні навчальні дані та потенційно зашкодило нашій точності. Натомість ми розраховуємо ваги класу під час навчальної роботи та використовуємо їх для коригування втрати.
У нашому навчальному сценарії ми підкласифікуємо Trainer
клас від transformers
з WeightedTrainer
клас, який враховує вагові коефіцієнти класу під час обчислення втрати крос-ентропії. Це допомагає запобігти зміщенням у нашій моделі:
class WeightedTrainer(Trainer):
def __init__(self, class_weights, *args, **kwargs):
self.class_weights = class_weights
super().__init__(*args, **kwargs)
def compute_loss(self, model, inputs, return_outputs=False):
labels = inputs.pop("labels")
outputs = model(**inputs)
logits = outputs.get("logits")
loss_fct = torch.nn.CrossEntropyLoss(
weight=torch.tensor(self.class_weights, device=model.device)
)
loss = loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1))
return (loss, outputs) if return_outputs else loss
Спосіб 2: Градієнтне накопичення
Накопичення градієнта – це методика навчання, яка дозволяє моделям імітувати навчання на великих партіях. Як правило, розмір партії (кількість зразків, що використовуються для обчислення градієнта за один крок навчання) обмежений обсягом пам’яті GPU. З накопиченням градієнта модель спочатку обчислює градієнти для менших партій. Потім, замість того, щоб негайно оновлювати вагові коефіцієнти моделі, градієнти накопичуються в кількох невеликих партіях. Коли накопичені градієнти дорівнюють цільовому більшому розміру партії, виконується крок оптимізації для оновлення моделі. Це дозволяє моделям тренуватися з більшими партіями, не перевищуючи обмеження пам’яті GPU.
Однак для проходження вперед і назад меншої партії потрібні додаткові обчислення. Збільшення розмірів пакетів через градієнтне накопичення може уповільнити навчання, особливо якщо використовується занадто багато кроків накопичення. Мета полягає в тому, щоб максимізувати використання GPU, але уникнути надмірного сповільнення через занадто багато додаткових кроків обчислення градієнта.
Спосіб 3: контрольні точки градієнта
Контрольні точки градієнта — це техніка, яка зменшує обсяг пам’яті, необхідної під час навчання, зберігаючи час обчислення прийнятним. Великі нейронні мережі займають багато пам’яті, оскільки вони повинні зберігати всі проміжні значення з прямого проходу, щоб обчислити градієнти під час зворотного проходу. Це може спричинити проблеми з пам’яттю. Одне з рішень полягає в тому, щоб не зберігати ці проміжні значення, але тоді їх доведеться перераховувати під час зворотного проходу, що займає багато часу.
Градієнтна контрольна точка забезпечує збалансований підхід. Він зберігає лише деякі проміжні значення, які називаються контрольно-пропускні пункти, а за потреби перераховує інші. Таким чином, він використовує менше пам’яті, ніж для зберігання всього, але також менше обчислень, ніж для повторного обчислення всього. Завдяки стратегічному вибору активацій для контрольних точок, градієнтна контрольна точка дає змогу навчати великі нейронні мережі з керованим використанням пам’яті та часом обчислень. Ця важлива техніка робить можливим навчання дуже великих моделей, які інакше мали б обмеження пам’яті.
У нашому навчальному сценарії ми вмикаємо активацію градієнта та контрольні точки, додаючи необхідні параметри до TrainingArguments
об’єкт:
from transformers import TrainingArguments
training_args = TrainingArguments(
gradient_accumulation_steps=4,
gradient_checkpointing=True
)
Метод 4: Адаптація LLM низького рангу
Великі мовні моделі, такі як ESM-2, можуть містити мільярди параметрів, навчання та запуск яких є дорогим. Дослідники розробив метод навчання під назвою Low-Rank Adaptation (LoRA), щоб зробити більш ефективним тонке налаштування цих величезних моделей.
Ключова ідея LoRA полягає в тому, що під час точного налаштування моделі для конкретного завдання вам не потрібно оновлювати всі початкові параметри. Натомість LoRA додає до моделі нові менші матриці, які перетворюють входи та виходи. Тільки ці менші матриці оновлюються під час тонкого налаштування, яке відбувається набагато швидше та використовує менше пам’яті. Параметри оригінальної моделі залишаються замороженими.
Після точного налаштування за допомогою LoRA ви можете об’єднати маленькі адаптовані матриці назад у вихідну модель. Або ви можете зберігати їх окремо, якщо хочете швидко налаштувати модель для інших завдань, не забуваючи про попередні. Загалом LoRA дозволяє ефективно адаптувати LLM до нових завдань за незначну частину звичайної вартості.
У нашому навчальному сценарії ми налаштовуємо LoRA за допомогою PEFT
бібліотека від Hugging Face:
from peft import get_peft_model, LoraConfig, TaskType
import torch
from transformers import EsmForSequenceClassification
model = EsmForSequenceClassification.from_pretrained(
“facebook/esm2_t33_650M_UR50D”,
Torch_dtype=torch.bfloat16,
Num_labels=2,
)
peft_config = LoraConfig(
task_type=TaskType.SEQ_CLS,
inference_mode=False,
bias="none",
r=8,
lora_alpha=16,
lora_dropout=0.05,
target_modules=[
"query",
"key",
"value",
"EsmSelfOutput.dense",
"EsmIntermediate.dense",
"EsmOutput.dense",
"EsmContactPredictionHead.regression",
"EsmClassificationHead.dense",
"EsmClassificationHead.out_proj",
]
)
model = get_peft_model(model, peft_config)
Надішліть навчальну роботу SageMaker
Після визначення сценарію навчання можна налаштувати та надіслати навчальне завдання SageMaker. Спочатку вкажіть гіперпараметри:
hyperparameters = {
"model_id": "facebook/esm2_t33_650M_UR50D",
"epochs": 1,
"per_device_train_batch_size": 8,
"gradient_accumulation_steps": 4,
"use_gradient_checkpointing": True,
"lora": True,
}
Далі визначте, які показники отримувати з журналів навчання:
metric_definitions = [
{"Name": "epoch", "Regex": "'epoch': ([0-9.]*)"},
{
"Name": "max_gpu_mem",
"Regex": "Max GPU memory use during training: ([0-9.e-]*) MB",
},
{"Name": "train_loss", "Regex": "'loss': ([0-9.e-]*)"},
{
"Name": "train_samples_per_second",
"Regex": "'train_samples_per_second': ([0-9.e-]*)",
},
{"Name": "eval_loss", "Regex": "'eval_loss': ([0-9.e-]*)"},
{"Name": "eval_accuracy", "Regex": "'eval_accuracy': ([0-9.e-]*)"},
]
Нарешті, визначте оцінювач Hugging Face і надішліть його для навчання на типі екземпляра ml.g5.2xlarge. Це економічно ефективний тип екземпляра, який широко доступний у багатьох регіонах AWS:
from sagemaker.experiments.run import Run
from sagemaker.huggingface import HuggingFace
from sagemaker.inputs import TrainingInput
hf_estimator = HuggingFace(
base_job_name="esm-2-membrane-ft",
entry_point="lora-train.py",
source_dir="scripts",
instance_type="ml.g5.2xlarge",
instance_count=1,
transformers_version="4.28",
pytorch_version="2.0",
py_version="py310",
output_path=f"{S3_PATH}/output",
role=sagemaker_execution_role,
hyperparameters=hyperparameters,
metric_definitions=metric_definitions,
checkpoint_local_path="/opt/ml/checkpoints",
sagemaker_session=sagemaker_session,
keep_alive_period_in_seconds=3600,
tags=[{"Key": "project", "Value": "esm-fine-tuning"}],
)
with Run(
experiment_name=EXPERIMENT_NAME,
sagemaker_session=sagemaker_session,
) as run:
hf_estimator.fit(
{
"train": TrainingInput(s3_data=train_s3_uri),
"test": TrainingInput(s3_data=test_s3_uri),
}
)
У наведеній нижче таблиці порівнюються різні методи навчання, які ми обговорювали, і їхній вплив на час роботи, точність і вимоги до пам’яті GPU для нашої роботи.
конфігурація | Оплачуваний час (хв.) | Точність оцінки | Максимальне використання пам'яті GPU (ГБ) |
Базова модель | 28 | 0.91 | 22.6 |
База + GA | 21 | 0.90 | 17.8 |
Основа + GC | 29 | 0.91 | 10.2 |
База + LoRA | 23 | 0.90 | 18.6 |
Усі методи дали моделі з високою точністю оцінки. Використання LoRA та градієнтної активації зменшили час роботи (і вартість) на 18% і 25% відповідно. Використання градієнтної контрольної точки зменшило максимальне використання пам’яті GPU на 55%. Залежно від ваших обмежень (вартість, час, обладнання), один із цих підходів може мати більше сенсу, ніж інший.
Кожен із цих методів добре працює сам по собі, але що відбувається, коли ми використовуємо їх у поєднанні? У наступній таблиці підсумовані результати.
конфігурація | Оплачуваний час (хв.) | Точність оцінки | Максимальне використання пам'яті GPU (ГБ) |
Всі методи | 12 | 0.80 | 3.3 |
У цьому випадку ми бачимо зниження точності на 12%. Однак ми скоротили час виконання на 57%, а використання пам’яті GPU на 85%! Це величезне зменшення, яке дозволяє нам навчатися на широкому діапазоні економічно ефективних типів екземплярів.
Прибирати
Якщо ви використовуєте власний обліковий запис AWS, видаліть усі створені вами кінцеві точки висновків у реальному часі та дані, щоб уникнути подальших стягнень.
predictor.delete_endpoint()
bucket = boto_session.resource("s3").Bucket(S3_BUCKET)
bucket.objects.filter(Prefix=S3_PREFIX).delete()
Висновок
У цьому дописі ми продемонстрували, як ефективно налаштувати моделі білкової мови, такі як ESM-2, для науково значущого завдання. Щоб дізнатися більше про використання бібліотек Transformers і PEFT для навчання pLMS, перегляньте публікації Глибоке навчання за допомогою білків та ESMBind (ESMB): низькорангова адаптація ESM-2 для прогнозування сайтів зв’язування білків у блозі Hugging Face. Ви також можете знайти більше прикладів використання машинного навчання для прогнозування властивостей білка в Чудовий аналіз білка на AWS Репозиторій GitHub.
Про автора
Браян Лоял є старшим архітектором рішень AI/ML у глобальній команді охорони здоров’я та наук про життя в Amazon Web Services. Він має понад 17 років досвіду в біотехнологіях і машинному навчанні, і він захоплений тим, що допомагає клієнтам вирішувати геномні та протеомні проблеми. У вільний час він любить готувати та їсти з друзями та родиною.
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- PlatoData.Network Vertical Generative Ai. Додайте собі сили. Доступ тут.
- PlatoAiStream. Web3 Intelligence. Розширення знань. Доступ тут.
- ПлатонЕСГ. вуглець, CleanTech, Енергія, Навколишнє середовище, Сонячна, Поводження з відходами. Доступ тут.
- PlatoHealth. Розвідка про біотехнології та клінічні випробування. Доступ тут.
- джерело: https://aws.amazon.com/blogs/machine-learning/efficiently-fine-tune-the-esm-2-protein-language-model-with-amazon-sagemaker/
- : має
- :є
- : ні
- $UP
- 07
- 1
- 100
- 17
- 20
- 2022
- 2023
- 22
- 28
- 3d
- 425
- 600
- 7
- 750
- 8
- a
- МЕНЮ
- рахунки
- Накопичений
- накопичення
- точність
- точно
- Активація
- активації
- пристосовувати
- адаптація
- пристосування
- додати
- адреса
- Додає
- просунутий
- AI / ML
- мета
- ВСІ
- дозволяє
- по
- Алфавіт
- Також
- Amazon
- Amazon SageMaker
- Amazon Web Services
- суми
- an
- аналіз
- аналізувати
- та
- Інший
- відповідь
- будь-який
- підхід
- підходи
- архітектура
- ЕСТЬ
- AS
- At
- доступний
- уникнути
- геть
- AWS
- назад
- збалансований
- BE
- оскільки
- за
- між
- зміщення
- більший
- мільярди
- обов'язковий
- біотехнології
- Блог
- тіло
- запозичувати
- обидва
- Брайан
- будувати
- але
- by
- обчислювати
- обчислює
- розрахунок
- званий
- CAN
- потужність
- захоплення
- випадок
- випадків
- Викликати
- осередок
- ланцюг
- ланцюга
- виклик
- проблеми
- символи
- вантажі
- chatbots
- більш дешевий
- перевірка
- хімічний
- клас
- код
- поєднання
- Компанії
- обчислення
- обчислювальна
- обмеження
- містити
- Контейнери
- містить
- Коштувати
- рентабельним
- може
- створювати
- створений
- виготовлений на замовлення
- Клієнти
- дані
- базами даних
- набори даних
- зменшити
- знизився
- визначати
- певний
- демонструвати
- продемонстрований
- Залежно
- розгортання
- описаний
- дизайн
- Незважаючи на
- певний
- розвиненою
- розробка
- пристрій
- схема
- різний
- відкриття
- обговорювалися
- Захворювання
- розподілений
- Не знаю
- вниз
- Завантаження
- наркотик
- Наркотики
- під час
- кожен
- ефект
- фактично
- ефективність
- ефективний
- продуктивно
- або
- ще
- дозволяє
- кодування
- Кінцева точка
- величезний
- епоха
- епохи
- рівним
- Так само
- особливо
- оцінка
- Навіть
- все
- приклад
- Приклади
- перевищує
- надмірний
- існуючий
- дорогий
- досвід
- Експерименти
- експертиза
- дослідити
- додатково
- Face
- сім'я
- швидше
- реально
- ознаками
- риси
- кілька
- Рисунок
- фільтрувати
- в кінці кінців
- знайти
- кінець
- Перший
- після
- для
- На щастя
- Вперед
- фракція
- Рамки
- друзі
- від
- заморожені
- функція
- далі
- отримати
- GitHub
- даний
- дає
- Глобальний
- Go
- добре
- GPU
- Графічні процесори
- градієнти
- вирощений
- відбувається
- апаратні засоби
- Мати
- he
- охорона здоров'я
- HealthTech
- допомога
- допомогу
- допомагає
- Високий
- високоякісний
- його
- Як
- How To
- Однак
- HTML
- HTTP
- HTTPS
- величезний
- HuggingFace
- людина
- Біль
- ідея
- if
- ілюструє
- імпорт
- важливо
- поліпшення
- in
- includes
- збільшений
- інфекції
- інформація
- витрати
- всередині
- екземпляр
- замість
- взаємодіяти
- в
- питання
- IT
- робота
- тримати
- зберігання
- ключ
- Царство
- відомий
- етикетки
- мова
- великий
- більше
- вивчення
- менше
- дозволяє
- libraries
- бібліотека
- життя
- Науки про життя
- Life Sciences
- як
- МЕЖА
- недоліки
- обмеженою
- Місце проживання
- Локалізація
- місць
- Довго
- багато часу
- від
- серія
- низький
- лояльний
- машина
- навчання за допомогою машини
- Машинки для перманенту
- made
- Більшість
- зробити
- РОБОТИ
- керований
- вдалося
- багато
- масивний
- Макс
- Максимізувати
- максимальний
- Може..
- сенс
- засоби
- пам'ять
- Злиття
- метод
- методика
- Метрика
- хвилин
- ML
- модель
- моделювання
- Моделі
- молекулярний
- більше
- більш ефективний
- переміщення
- мРНК
- багато
- множинний
- ім'я
- природа
- необхідно
- Необхідність
- необхідний
- мереж
- нервовий
- нейронні мережі
- Нові
- ніхто
- роман
- номер
- об'єкт
- об'єкти
- of
- on
- ONE
- ті,
- тільки
- оптимізація
- оптимізований
- or
- порядок
- замовлень
- оригінал
- спочатку
- Інше
- інші
- інакше
- наші
- з
- виходи
- поза
- над
- загальний
- власний
- параметри
- частина
- проходити
- проходить
- пристрасний
- Минуле
- Виконувати
- виконується
- частина
- plato
- Інформація про дані Платона
- PlatoData
- Play
- плюс
- це можливо
- пошта
- Пости
- потенціал
- потенційно
- передбачати
- Готувати
- запобігати
- попередній
- Проблема
- Оброблено
- Вироблений
- проект
- властивості
- Білок
- Білки
- забезпечує
- громадськість
- put
- запит
- питань
- швидко
- діапазон
- ранжувати
- досягати
- реального часу
- розумний
- облік
- зменшити
- Знижений
- знижує
- скорочення
- regex
- райони
- доречний
- видаляти
- замінювати
- Сховище
- представляти
- представлений
- Вимога
- Дослідники
- ресурси
- відповідно
- відповідаючи
- відповідальний
- результати
- повертати
- Відгуки
- право
- Роль
- прогін
- час виконання
- мудрець
- продажів
- зберегти
- наука
- НАУКИ
- науковий
- подряпати
- сценарій
- scripts
- розділам
- побачити
- вибирає
- SELF
- старший
- сенс
- окремий
- Послідовність
- Послуги
- набори
- кілька
- показаний
- Аналогічно
- простий
- імітувати
- сайт
- Розмір
- розміри
- трохи відрізняється
- сповільнювати
- уповільнення
- невеликий
- менше
- рішення
- Рішення
- ВИРІШИТИ
- деякі
- Source
- конкретний
- швидкість
- розкол
- standard
- старт
- впроваджений
- залишатися
- неухильно
- Крок
- заходи
- зберігання
- зберігати
- зберігання
- Стратегічно
- рядок
- структура
- структур
- представляти
- достатній
- таблиця
- Приймати
- приймає
- Мета
- цілі
- Завдання
- завдання
- команда
- техніка
- методи
- тест
- текст
- ніж
- Що
- Команда
- їх
- Їх
- самі
- потім
- терапевтичні засоби
- Там.
- отже
- Ці
- вони
- речі
- це
- тисяча
- через
- час
- times
- до
- токенізувати
- занадто
- інструменти
- факел
- Усього:
- поїзд
- навчений
- Навчання
- Перетворення
- Трансформатори
- суд
- правда
- намагатися
- настройка
- ПЕРЕГЛЯД
- тип
- Типи
- типово
- розуміти
- БЕЗ ІМЕНИ
- непотрібний
- Оновити
- оновлений
- оновлення
- us
- Використання
- USD
- використання
- використовуваний
- використовує
- використання
- звичайний
- значення
- Цінності
- різноманітність
- дуже
- через
- хотіти
- we
- Web
- веб-сервіси
- ДОБРЕ
- були
- Що
- коли
- Чи
- який
- в той час як
- широкий
- Широкий діапазон
- широко
- з
- без
- Work
- тренування
- робочий
- б
- письмовий
- X
- років
- Ти
- вашу
- зефірнет