Настроить Llama 2 для генерации текста на Amazon SageMaker JumpStart

Настроить Llama 2 на Amazon SageMaker JumpStart для генерации текста.

Сегодня мы с радостью объявляем о возможности настройки моделей Llama 2 от Meta с использованием Amazon SageMaker JumpStart. Семейство больших моделей языка Llama 2 (LLM) представляет собой коллекцию предварительно обученных и настроенных генеративных текстовых моделей, имеющих от 7 миллиардов до 70 миллиардов параметров. Настроенные модели LLM, называемые Llama-2-chat, оптимизированы для использования в диалоговых ситуациях. Вы можете легко опробовать эти модели и использовать их с помощью SageMaker JumpStart, который является центром машинного обучения (ML), предоставляющим доступ к алгоритмам, моделям и решениям ML, чтобы вы могли быстро начать работу с ML. Теперь вы также можете настроить модели генерации текста Llama 2 с 7 миллиардами, 13 миллиардами и 70 миллиардами параметров с помощью SageMaker JumpStart с помощью нескольких щелчков или с использованием SageMaker Python SDK.

Основные модели генеративного ИИ были основным фокусом большинства исследований и практического применения в области машинного обучения и искусственного интеллекта уже более года. Эти основные модели отлично справляются с генеративными задачами, такими как генерация текста, суммирование, ответы на вопросы, генерация изображений и видео и многое другое, благодаря своему большому размеру и обучению на нескольких больших наборах данных и сотнях задач. Несмотря на отличные возможности обобщения этих моделей, часто возникают ситуации, когда требуются очень определенные данные домена (например, здравоохранение или финансовые услуги), из-за чего эти модели могут не давать хороших результатов для таких случаев использования. Это требует дополнительной настройки этих генеративных моделей ИИ под конкретные случаи использования и специфичные для домена данные.

В этой статье мы рассмотрим, как настроить предварительно обученные модели генерации текста Llama 2 с помощью SageMaker JumpStart.

Что такое Llama 2

Llama 2 – это авторегрессионная языковая модель, использующая оптимизированную архитектуру трансформера. Llama 2 предназначена для коммерческого и исследовательского использования на английском языке. Она поставляется в нескольких размерах параметров – 7 миллиардов, 13 миллиардов и 70 миллиардов, а также в предварительно обученных и настроенных вариантах. Согласно Meta, настроенные версии используют методы обучения с учителем (SFT) и обучения с подкреплением с обратной связью от людей (RLHF), чтобы соответствовать предпочтениям людей по полезности и безопасности. Llama 2 была предварительно обучена на 2 трлн токенов данных из общедоступных источников. Настроенные модели предназначены для использования в качестве чат-помощников, в то время как предварительно обученные модели могут быть адаптированы для различных задач генерации естественного языка. Независимо от версии модели, используемой разработчиком, руководство по ответственному использованию от Meta может помочь в настройке и оптимизации моделей с соответствующими мерами безопасности.

На данный момент Llama 2 доступна в следующих регионах:

  • Доступна предварительно обученная модель: "us-west-2", "us-east-1", "us-east-2", "eu-west-1", "ap-southeast-1", "ap-southeast-2"
  • Настройка и развертывание настроенной модели: "us-east-1", "us-west-2", "eu-west-1"

Что такое SageMaker JumpStart

С помощью SageMaker JumpStart практики машинного обучения могут выбирать из широкого выбора общедоступных основных моделей. Практики машинного обучения могут развертывать основные модели на выделенных экземплярах Amazon SageMaker в изолированной от сети среде и настраивать модели с помощью SageMaker для обучения и развертывания моделей. Теперь вы можете открывать и развертывать Llama 2 всего лишь несколькими щелчками в SageMaker Studio или программно через SageMaker Python SDK, что позволяет получать производительность модели и управлять MLOps с помощью функций SageMaker, таких как Amazon SageMaker Pipelines, Amazon SageMaker Debugger или журналы контейнеров. Модель развертывается в безопасной среде AWS и под управлением вашего VPC, что помогает обеспечить безопасность данных. Кроме того, вы можете настраивать модели генерации текста Llama2 7B, 13B и 70B с помощью SageMaker JumpStart.

Настройка моделей Llama2

Вы можете настраивать модели с помощью либо пользовательского интерфейса SageMaker Studio, либо SageMaker Python SDK. Оба метода обсуждаются в этом разделе.

Настройка без кода через пользовательский интерфейс SageMaker Studio

В SageMaker Studio вы можете получить доступ к моделям Llama 2 через SageMaker JumpStart в разделе Модели, блокноты и решения, как показано на следующем скриншоте.

Если вы не видите моделей Llama 2, обновите версию SageMaker Studio, выключив и снова включив его. Дополнительную информацию о обновлениях версии см. в разделе “Выключение и обновление приложений Studio”.

Вы также можете найти другие четыре варианта модели, выбрав Исследовать все модели генерации текста или искать ламу в поле поиска.

На этой странице вы можете указать корзину Amazon Simple Storage Service (Amazon S3), содержащую наборы данных для настройки моделирования и валидации. Кроме того, вы можете настроить конфигурацию развертывания, гиперпараметры и настройки безопасности для настройки моделирования. Затем вы можете выбрать Тренировка, чтобы запустить задание обучения на экземпляре SageMaker ML. На предыдущем скриншоте показана страница настройки моделирования для модели Llama-2 7B; однако вы можете настроить модели генерации текста Llama 2 13B и 70B аналогичным образом, используя соответствующие страницы моделей. Для использования моделей Llama 2 необходимо принять лицензионное соглашение конечного пользователя (EULA). Оно появится, когда вы выберете Тренировка, как показано на следующем скриншоте. Выберите Я прочитал и принимаю EULA и AUP, чтобы запустить задание настройки моделирования.

Развертывание модели

После настройки модели вы можете развернуть ее, используя страницу моделирования на SageMaker JumpStart. Вариант развертывания настроенной модели появится после завершения настройки, как показано на следующем скриншоте.

Настройка модели с помощью SageMaker Python SDK

Вы также можете настраивать модели Llama 2, используя SageMaker Python SDK. Вот пример кода для настройки модели Llama 2 7B на вашем наборе данных:

import os
import boto3
from sagemaker.session import Session
from sagemaker.jumpstart.estimator import JumpStartEstimator

# Чтобы настроить модель 13B/70B, измените model_id на `meta-textgeneration-llama-2-13b`/`meta-textgeneration-llama-2-70b`.
model_id = "meta-textgeneration-llama-2-7b"

estimator = JumpStartEstimator(
    model_id=model_id, environment={"accept_eula": "true"}
)
# По умолчанию настройка инструкции установлена в значение false. Поэтому, чтобы использовать настройку инструкции датасета, используйте
estimator.set_hyperparameters(instruction_tuned="True", epoch="5")
estimator.fit({"training": train_data_location})

Вы можете развернуть настроенную модель напрямую из оценщика:

finetuned_predictor = estimator.deploy()

Вы также можете найти код в разделе “Fine-tune LLaMA 2 models on SageMaker JumpStart”. Он включает подготовку датасета, обучение на вашем собственном датасете и развертывание настроенной модели. В нем демонстрируется настройка модели на подмножестве датасета Dolly с примерами из задачи суммирования. Ниже приведен пример ввода с ответами от настроенной и не настроенной моделей, а также от истинного ответа:

Ввод в модель:

Ниже приведено руководство, описывающее задачу, сопровождаемое входными данными, которые предоставляют дополнительный контекст. Напишите ответ, который соответствующим образом завершает запрос.

### Инструкция:
Когда умер Феликс Луна?

### Входные данные:
Феликс Сесар Луна (30 сентября 1925 года - 5 ноября 2009 года) был аргентинским писателем, лириком и историком.



### Ответ:

Ground Truth response:

Феликс Луна умер 5 ноября 2009 года

Ответ от неоткалиброванной модели:

Феликс Сесар Луна (30 сентября 1925 года - 5 ноября 2009 года) был аргентинским

Когда умер Луна?

### Объяснение:
Мы отвечаем на вопрос с помощью даты рождения и даты смерти из входных данных.

### Решение: 1102

Ответ от откалиброванной модели:

Феликс Луна умер 5 ноября 2009 года.

Для сравнения производительности различных моделей на наборе данных Dolly и Dialogsum обратитесь к разделу Performance benchmarking в приложении в конце этого сообщения.

Техника калибровки

Языковые модели, такие как Llama, имеют размер более 10 ГБ или даже 100 ГБ. Калибровка таких больших моделей требует экземпляров с значительно высокой памятью CUDA. Кроме того, обучение этих моделей может быть очень медленным из-за их размера. Поэтому для эффективной калибровки мы используем следующие оптимизации:

  • Адаптация низкого ранга (LoRA) – это тип эффективной калибровки параметров (PEFT) для эффективной калибровки больших моделей. При этом мы замораживаем всю модель и добавляем только небольшой набор настраиваемых параметров или слоев в модель. Например, вместо обучения всех 7 миллиардов параметров для Llama 2 7B, мы можем калибровать менее 1% параметров. Это помогает значительно снизить требования к памяти, потому что нам нужно хранить градиенты, состояния оптимизатора и другую информацию, связанную с обучением, только для 1% параметров. Кроме того, это также помогает сократить время обучения и его стоимость. Для получения более подробной информации о этом методе обратитесь к статье LoRA: Low-Rank Adaptation of Large Language Models.
  • Квантование Int8 – Даже с оптимизациями, такими как LoRA, модели, такие как Llama 70B, по-прежнему слишком большие для обучения. Чтобы уменьшить объем памяти во время обучения, мы можем использовать квантование Int8. Квантование обычно уменьшает точность типов данных с плавающей запятой. Хотя это уменьшает требуемую память для хранения весов модели, оно ухудшает производительность из-за потери информации. Квантование Int8 использует только четверть точности, но не ухудшает производительность, потому что оно не просто отбрасывает биты. Оно округляет данные из одного типа в другой. Чтобы узнать о квантовании Int8, обратитесь к статье LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale.
  • Полностью распределенные данные параллельно (FSDP) – это тип алгоритма обучения с параллельными данными, который распределяет параметры модели между параллельными рабочими и может дополнительно перенести часть вычислений обучения на ЦП. Хотя параметры распределены по разным GPU, вычисление каждого микропакета выполняется локально на рабочем GPU. Это равномерно распределяет параметры и достигает оптимальной производительности благодаря комбинированию обмена данными и вычислений во время обучения.

В таблице ниже сравниваются различные методы с тремя моделями Llama 2.

, Тип экземпляра по умолчанию Поддерживаемые типы экземпляров с настройкой по умолчанию Настройка по умолчанию LORA + FSDP LORA + без FSDP Квантование Int8 + LORA + без FSDP
Llama 2 7B ml.g5.12xlarge ml.g5.12xlarge, ml.g5.24xlarge, ml.g5.48xlarge LORA + FSDP Да Да Да
Llama 2 13B ml.g5.12xlarge ml.g5.24xlarge, ml.g5.48xlarge LORA + FSDP Да Да Да
Llama 2 70B ml.g5.48xlarge ml.g5.48xlarge INT8 + LORA + NO FSDP Нет Нет Да

Обратите внимание, что настройка моделей Llama основана на скриптах, предоставленных в следующем репозитории GitHub.

Формат обучающего набора данных

SageMaker JumpStart в настоящее время поддерживает наборы данных в формате доменной адаптации и формате настройки инструкций. В этом разделе мы указываем пример набора данных в обоих форматах. Дополнительные сведения см. в разделе Форматирование набора данных в приложении.

Формат доменной адаптации

Модель Llama 2 для генерации текста может быть донастроена на любом наборе данных, специфичном для домена. После донастройки на наборе данных, специфичном для домена, ожидается, что модель будет генерировать текст, специфичный для домена, и решать различные задачи обработки естественного языка в этом конкретном домене с помощью небольшого количества шаблонов. Входные данные состоят из CSV-, JSON- или TXT-файла. Например, входные данные могут представлять собой текстовый файл с отчетами SEC о компании Amazon:

Данный отчет содержит оценки, прогнозы, заявления, касающиеся наших
бизнес-планов, целей и ожидаемых результатов деятельности, которые являются
«предвидениями» в смысле Закона о привлечении частных инвестиций
в судебное разбирательство 1995 года, раздела 27A Закона о ценных бумагах
1933 года и раздела 21E Закона о биржевой торговле 1934 года. Предвидения
могут появляться в любом разделе данного отчета, включая следующие разделы: «Деятельность» (часть I,
Пункт 1 этой Формы 10-K), «Факторы риска» (часть I, раздел 1А этой Формы 10-K),
и «Обсуждение и анализ финансового положения и результатов
операций» (часть II, раздел 7 этой Формы 10-K). Эти предвидения
обычно идентифицируются словами «считать», «проект», «ожидать», «предполагать», «оценивать», «намереваться», «стратегия», «будущее»,
«возможность», «план», «может», «должен», «будет», «будет», «продолжать», «скорее всего привести к», и аналогичными выражениями.

Формат настройки инструкций

При настройке инструкций модель донастраивается для набора задач обработки естественного языка (NLP), описанных с помощью инструкций. Это помогает улучшить производительность модели для невидимых задач с нулевыми шаблонами. В формате набора данных для настройки инструкций вы указываете файл template.json, описывающий форматы ввода и вывода. Например, каждая строка в файле train.jsonl выглядит следующим образом:

{"instruction": "Что такое дисперсионная призма?", 
"context": "В оптике дисперсионная призма (также называется преломляющей призмой) — это оптическая призма, которая используется для диспергирования света, то есть разделения света на спектральные компоненты (цвета радуги). Различные длины волн (цвета) света будут отклоняться призмой под разными углами. Это происходит из-за изменения показателя преломления призмы с изменением длины волны (дисперсия). Вообще говоря, более длинные волны (красный) испытывают меньшее отклонение, чем более короткие волны (синий). Дисперсия белого света на цвета призмой привела Сэра Исаака Ньютона к выводу, что белый свет состоит из смеси различных цветов.", 
"response": "Дисперсионная призма - это оптическая призма, которая разделяет различные длины волн света под разными углами. Когда белый свет проходит через дисперсионную призму, он разделяется на разные цвета радуги."}

Дополнительный файл template.json имеет следующий вид:

{
    "prompt": "Ниже приведена инструкция, описывающая задачу, вместе с вводом, предоставляющим дополнительный контекст. "
    "Напишите ответ, который соответствующим образом завершает запрос.\n\n"
    "### Инструкция:\n{instruction}\n\n### Ввод:\n{context}\n\n",
    "completion": " {response}",
}

Поддерживаемые гиперпараметры для обучения

Настройка Llama 2 поддерживает ряд гиперпараметров, каждый из которых может влиять на требования к памяти, скорость обучения и производительность донастроенной модели:

  • epoch – Количество проходов алгоритма донастройки по обучающему набору данных. Должно быть целым числом больше 1. По умолчанию 5.
  • learning_rate – Скорость обновления весов модели после работы с каждым пакетом обучающих примеров. Должно быть положительным числом с плавающей запятой больше 0. По умолчанию 1e-4.
  • instruction_tuned – Флаг, указывающий, следует ли настраивать модель с использованием инструкций или нет. Должно быть ‘True’ или ‘False’. По умолчанию ‘False’.
  • per_device_train_batch_size – Размер пакета на одно ядро GPU/CPU для обучения. Должно быть положительным целым числом. По умолчанию 4.
  • per_device_eval_batch_size – Размер пакета на одно ядро GPU/CPU для оценки. Должно быть положительным целым числом. По умолчанию 1.
  • max_train_samples – Для целей отладки или более быстрого обучения можно ограничить количество обучающих примеров этим значением. Значение -1 означает использование всех обучающих примеров. Должно быть положительным целым числом или -1. По умолчанию -1.
  • max_val_samples – Для целей отладки или более быстрого обучения можно ограничить количество валидационных примеров этим значением. Значение -1 означает использование всех валидационных примеров. Должно быть положительным целым числом или -1. По умолчанию -1.
  • max_input_length – Максимальная общая длина входной

    Типы инстансов и совместимые гиперпараметры

    Требования к памяти во время донастройки могут различаться в зависимости от нескольких факторов:

    • Тип модели – Модель 7B имеет наименьшие требования к памяти GPU, а 70B имеет наибольшие требования к памяти
    • Максимальная длина ввода – Более высокое значение длины ввода приводит к обработке большего количества токенов за раз и, следовательно, требует больше памяти CUDA
    • Размер пакета – Больший размер пакета требует больше памяти CUDA и, следовательно, требует более крупных типов инстансов
    • Квантование Int8 – Если используется квантование Int8, модель загружается с низкой точностью и, следовательно, требует меньше памяти CUDA

    Для помощи вам в начале работы мы предоставляем набор комбинаций различных типов инстансов, гиперпараметров и типов моделей, которые можно успешно донастроить. Вы можете выбрать конфигурацию в соответствии с вашими требованиями и доступностью типов инстансов. Мы донастраиваем все три модели с различными настройками с тремя эпохами на подмножестве набора данных Dolly с примерами суммирования.

    Модель 7B

    В следующей таблице приведены варианты донастройки модели 7B.

    <td style="text-align: left

    13B

    Следующая таблица содержит сведения о настройках донастройки модели 13B.

    Тип инстанса Максимальная длина ввода Размер пакета на устройство Квантование Int8 Включить FSDP Время выполнения (мин)
    ml.g4dn.12xlarge 1024 8 TRUE FALSE 166
    ml.g4dn.12xlarge 2048 2 TRUE FALSE 178
    ml.g4dn.12xlarge 1024 4 FALSE TRUE 120
    ml.g4dn.12xlarge 2048 2 FALSE TRUE 143
    ml.g5.2xlarge 1024 4 TRUE FALSE 61
    ml.g5.2xlarge 2048 2 TRUE FALSE 68
    ml.g5.2xlarge 1024 4 FALSE TRUE 43
    ml.g5.2xlarge 2048 2 FALSE TRUE 49
    ml.g5.4xlarge 1024 4 FALSE TRUE 39
    ml.g5.4xlarge 2048 2 FALSE TRUE 50
    ml.g5.12xlarge 1024 16 TRUE FALSE 57
    ml.g5.12xlarge 2048 4 TRUE FALSE 64
    ml.g5.12xlarge 1024 4 FALSE TRUE 26
    ml.g5.12xlarge 2048 4 FALSE TRUE 23
    ml.g5.48xlarge 1024 16 TRUE FALSE 59
    ml.g5.48xlarge 2048 4 TRUE FALSE
    Тип экземпляра Максимальная длина ввода Размер пакета на устройство Квантование Int8 Включить FSDP Затраченное время (мин)
    ml.g4dn.12xlarge 1024 4 TRUE FALSE 283
    ml.g4dn.12xlarge 2048 2 TRUE FALSE 328
    ml.g5.12xlarge 1024 8 TRUE FALSE 92
    ml.g5.12xlarge 2048 4 TRUE FALSE 104
    ml.g5.48xlarge 1024 8 TRUE FALSE 95
    ml.g5.48xlarge 2048 4 TRUE FALSE 107
    ml.g5.48xlarge 1024 8 FALSE TRUE 35
    ml.g5.48xlarge 2048 2 FALSE TRUE 41

    70B

    Следующая таблица содержит сведения о настройках донастройки модели 70B.

    Тип экземпляра Максимальная длина ввода Размер пакета на устройство Квантование Int8 Включить FSDP Затраченное время (мин)
    ml.g5.48xlarge 1024 4 TRUE FALSE 396
    ml.g5.48xlarge 2048 1 TRUE FALSE 454

    Рекомендации по типам экземпляров и гиперпараметрам

    При настройке точности модели имейте в виду следующее:

    • Более крупные модели, такие как 70B, обеспечивают более высокую производительность по сравнению с 7B
    • Производительность без квантования Int8 лучше, чем производительность с квантованием INT8

    Обратите внимание на следующее время обучения и требования к памяти CUDA:

    • Установка int8_quantization=True уменьшает требования к памяти и приводит к более быстрому обучению.
    • Уменьшение значений per_device_train_batch_size и max_input_length снижает требования к памяти и, следовательно, может выполняться на более маленьких экземплярах. Однако установка слишком низких значений может увеличить время обучения.
    • Если вы не используете квантование Int8 (int8_quantization=False), используйте FSDP (enable_fsdp=True) для более быстрого и эффективного обучения.

    При выборе типа экземпляра обратите внимание на следующее:

    • Экземпляры G5 обеспечивают наиболее эффективное обучение среди поддерживаемых типов экземпляров. Поэтому, если у вас есть доступные экземпляры G5, вы должны использовать их.
    • Время обучения в значительной степени зависит от количества используемых графических процессоров и доступной памяти CUDA. Поэтому обучение на экземплярах с одинаковым количеством графических процессоров (например, ml.g5.2xlarge и ml.g5.4xlarge) примерно одинаково. Поэтому вы можете использовать более дешевый экземпляр для обучения (например, ml.g5.2xlarge).
    • При использовании экземпляров p3 обучение будет выполняться с точностью 32 бита, так как bfloat16 не поддерживается на этих экземплярах. Поэтому задание обучения будет использовать вдвое больше памяти CUDA при обучении на экземплярах p3 по сравнению с экземплярами g5.

    Чтобы узнать о стоимости обучения на каждом экземпляре, обратитесь к Amazon EC2 G5 Instances.

    Если набор данных находится в формате настройки инструкций, а последовательности ввода+завершения небольшие (например, 50–100 слов), то большое значение max_input_length приводит к очень плохим результатам. Значение этого параметра по умолчанию равно -1, что соответствует значению max_input_length 2048 для моделей Llama. Поэтому рекомендуется использовать небольшое значение для max_input_length (например, 200–400), если ваш набор данных содержит небольшие примеры.

    Наконец, из-за высокого спроса на экземпляры G5 может возникнуть проблема с их доступностью в вашем регионе с ошибкой "CapacityError: Unable to provision requested ML compute capacity. Please retry using a different ML instance type." Если вы столкнулись с этой ошибкой, повторите задание обучения или попробуйте другой регион.

    Проблемы при настройке очень больших моделей

    В этом разделе мы обсудим две проблемы при настройке очень больших моделей.

    Отключение сжатия вывода

    По умолчанию выводом задания обучения является обученная модель, которая сжимается в формат .tar.gz перед загрузкой в Amazon S3. Однако из-за большого размера модели этот шаг может занять много времени. Например, сжатие и загрузка модели 70B может занять более 4 часов. Чтобы избежать этой проблемы, вы можете использовать функцию отключения сжатия вывода, поддерживаемую платформой обучения SageMaker. В этом случае модель загружается без какого-либо сжатия, которое затем используется для развертывания:

    estimator = JumpStartEstimator(
    model_id=model_id, environment={"accept_eula": "true"}, disable_output_compression=True
    )

    Проблема с таймаутом ядра SageMaker Studio

    Из-за размера модели Llama 70B задание обучения может занимать несколько часов, и ядро SageMaker Studio может завершиться во время фазы обучения. Однако в это время обучение все равно продолжается в SageMaker. Если это происходит, вы все равно можете развернуть конечную точку, используя имя задания обучения с помощью следующего кода:

    from sagemaker.jumpstart.estimator import JumpStartEstimator
    training_job_name = <<<ВСТАВЬТЕ_ИМЯ_ЗАДАНИЯ_ОБУЧЕНИЯ>>>
    
    attached_estimator = JumpStartEstimator.attach(training_job_name, model_id)
    attached_estimator.logs()
    attached_estimator.deploy()

    Чтобы найти имя задания обучения, перейдите в консоль SageMaker и в разделе Обучение в панели навигации выберите Задания обучения. Определите имя задания обучения и замените его в предыдущем коде.

    Заключение

    В этой статье мы обсудили тонкую настройку моделей Llama 2 от Meta с использованием SageMaker JumpStart. Мы показали, что вы можете использовать консоль SageMaker JumpStart в SageMaker Studio или SageMaker Python SDK для тонкой настройки и развертывания этих моделей. Мы также обсудили технику тонкой настройки, типы экземпляров и поддерживаемые гиперпараметры. Кроме того, мы представили рекомендации по оптимизации обучения на основе проведенных нами различных тестов. Результаты тонкой настройки трех моделей на двух наборах данных представлены в приложении в конце этой статьи. Как видно из этих результатов, тонкая настройка улучшает суммирование по сравнению с моделями без тонкой настройки. В качестве следующего шага вы можете попробовать тонкую настройку этих моделей на своем наборе данных с использованием предоставленного кода в репозитории GitHub, чтобы протестировать и сравнить результаты для ваших случаев использования.

    Авторы хотели бы выразить признательность за технические вклады Кристофера Уиттена, Сина Хуанга, Кайла Ульриха, Сифэй Ли, Эми Ю, Адама Коздровича, Эвана Кравица, Бенджамина Крэбтри, Хаотяна Ана, Манана Шаха, Тони Круза, Эрнева Шармы, Джонатана Гинегань и Джун Вон.