Эта статья была впервые опубликована на:Уокер ИИ
С непрерывным продвижением цифровых технологий во всех сферах жизни ИИ должен обрабатывать все больше и больше данных, и один сервер больше не может удовлетворить потребности развития современной отрасли Кластеры серверов стали стандартным оборудованием для предприятий для обработки данных с помощью ИИ, в то время как распределенные вычисления стали искусственным стандартом программного обеспечения для интеллектуальных приложений.
Как видно из рисунка 1, сегодня существует множество фреймворков распределенных вычислений с открытым исходным кодом, от обучения моделей, настройки параметров до развертывания; от NLP, CV до RS; эти фреймворки охватывают все аспекты жизненного цикла индустрии ИИ. В этой статье кратко представлен выбранный фреймворк Ray.
Рисунок 1. Различные среды распределенных вычислений
Рэй был открыт Университетом Беркли в 2017 году.Распределенная вычислительная среда, соответствующая бумага "Ray: A Distributed Framework for Emerging AI Applications". Задачи обучения с подкреплением требуют большого количества взаимодействия с окружающей средой (порядка миллисекунд) и поддерживают неоднородность во времени. Этот фреймворк специально разработан для машинного обучения и обучения с подкреплением.По сравнению с другими фреймворками ray имеет следующие преимущества:
- легкий
- Можно построить быстро
- Сильная универсальность
- Превосходное представление
Четыре преимущества подробно описаны ниже.
1. Преимущества Ray Framework
1.1 Легкий
По сравнению с традиционными распределенными фреймворками (особенно с hadoop, spark и т. д.) Ray можно установить напрямую через pip, и нет требований к версии системы.
pip install -U ray
Ray — это простая распределенная стратегия, а не полноценная экосистема, поэтому она не требует сложного построения.
С другой стороны, легкий и отличный фреймворк часто можно использовать в качестве базовой фреймворка для обработки корпоративных данных.Предприятия продолжают повышать экологию на основе фреймворка, тем самым формируя уникальную прикладную экологию предприятия.
1.2 Можно построить быстро
Для традиционных фреймворков, таких как hadoop, для распространения исходной автономной программы необходимо изменить всю логику кода, и каждый вычислительный модуль необходимо реконструировать с помощью схемы программирования MapReduce, которая обеспечивает хорошую редактируемость традиционных фреймворков, таких как hadoop. инженеры-алгоритмы Детальные модификации могут быть сделаны в соответствии с потребностями бизнеса. Мощные возможности редактирования также создают множество проблем, таких как высокая стоимость обучения и сложность рефакторинга кода. Искусственный интеллект меняется с каждым днем, а модели постоянно меняются.Гибкая разработка стала режимом развития многих компаний, занимающихся ИИ.Сложное построение приложений ИИ сильно повлияет на ход всего проекта.
Следующий код преобразует простую автономную программную функцию в распределенную функцию Ray и просто добавляет декоратор ray.remote к исходной функции для завершения распределенной работы.
### 原始单机代码
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures))
### Ray分布式代码
import ray
ray.init()
@ray.remote
def f(x):
return x * x
futures = [f.remote(i) for i in range(4)]
print(ray.get(futures))
1.3 Сильная универсальность
В последние годы фреймворки глубокого обучения, такие как tensorflow и torch, стали модельными фреймворками для приложений искусственного интеллекта.Учитывая сценарии промышленных приложений, эти фреймворки предоставляют свои собственные распределенные решения для обучения и развертывания, и эти решения имеют высокую степень использования вычислительных ресурсов. Крупномасштабные проекты часто состоят из нескольких моделей алгоритмов.Для быстрой разработки инженеры-алгоритмы часто используют для построения открытый исходный код, и среды глубокого обучения, используемые в этих открытых исходных кодах, скорее всего, будут отличаться друг от друга, поэтому распределенное решение для одной рамки трудно применить.
Кроме того, такие фреймворки, как ONNIX, обычно объединяют модели всех фреймворков в единое решение.Поскольку многие передовые модели глубокого обучения вносят сложные изменения в нейроны, их нельзя адаптировать к общим алгоритмам.Кроме того, требуются инженеры-алгоритмы. писать операторы вручную, что замедляет скорость разработки. Рэй абстрагирует модели машинного обучения, расчеты numpy данных и отдельные функции в вычисления общего назначения и реализует адаптацию к различным средам глубокого обучения и средам машинного обучения.
Кроме того, Рэй сделал специальную экологическую конструкцию для применения обучения с подкреплением.
1.4 Отличная производительность
На рисунке 2 показано сравнение между Ray, Horovod и собственной распределенной схемой tensorflow для обучения модели ResNet-101. Вертикальная ось — среднее количество изображений в секунду итерации. Видно, что Ray немного лучше, чем структура Horovod.
Рисунок 2. Сравнение скорости распределенного обучения
На рисунке 3 показано сравнение пропускной способности вызовов моделей между Clipper и Ray.Оба используют одну и ту же сетевую модель.Можно увидеть, что Ray лучше, чем Clipper.
Рисунок 3. Сравнение пропускной способности распределенного развертывания
Ray не справляется с каждым распределенным сценарием лучше, чем другие платформы, но Ray объединяет обучение, настройку параметров и развертывание и при этом поддерживает хорошую производительность, поэтому его стоит изучить и использовать.
Благодаря хорошей производительности фреймворка Ray, Ray широко используется в отрасли (например, Ant Financial). Чтобы научиться использовать Ray, необходимо сначала понять состав Ray. В следующем разделе будет представлен состав Ray.
2. Использование Рэя
2.1 Состав Рэя
Рэй примерно состоит из четырех частей:
- Tune: модуль настройки гиперпараметров
- RLlib: Модуль обучения с подкреплением
- RaySGD: Распределенный учебный модуль
- Ray Serve: Модуль развертывания службы приложений
Рэй охватывает весь жизненный цикл приложений ИИ: обучение, настройку параметров, развертывание и имеет специально оптимизированные сценарии обучения с подкреплением. Из-за ограниченного личного опыта здесь представлен только модуль Ray's Serve.
2.2 Начало луча
Как показано на рисунке 4, Ray состоит изголовной узел(Головной узел) и наборрабочий узел(Рабочий узел) состав. Для запуска Ray требуется сначала запустить головной узел и предоставить рабочим узлам адрес головного узла для формирования кластера. Головной узел отвечает за управление и распределение задач рабочих узлов, а рабочие узлы отвечают за выполнение задач и возврат результатов. После тестирования головной узел и рабочий узел могут быть одним и тем же компьютером.
Запуск Ray состоит из двух шагов: запуск головного узла и регистрация рабочих узлов на головном узле.
Рисунок 4. Схематическая диаграмма узла Ray
Ниже приведен код запуска и код выключения для головного узла.
import ray
ray.init() # 启动
assert ray.is_initialized() == True
ray.shutdown() # 关闭
assert ray.is_initialized() == False
Примечание. Сценарий запуска должен добавить код выключения, в противном случае программа ray может всегда работать в процессе.
Фреймворк Ray использует модель акторов.По сравнению с традиционной моделью разделяемой памяти, Ray не имеет конкуренции состояний, может легко формировать кластеры и может лучше контролировать состояние. Метод регистрации каждого Актера, то есть каждого рабочего узла, следующий.
import ray
ray.init(address=头节点地址) # 启动
assert ray.is_initialized() == True
ray.shutdown() # 关闭
assert ray.is_initialized() == False
2.3 Ray Serve
Ray Serve можно сравнить с clipper, который в основном используется для служб развертывания моделей и поддерживает множество сред глубокого обучения.Официальные примеры:
Здесь мы берем tensorflow2 в качестве примера, чтобы показать, как использовать луч для развертывания модельных сервисов.
Шаг 1. Определите модельный класс обслуживания
Ниже приведен простой код класса службы модели, который аналогичен развертыванию служб ИИ с помощью таких фреймворков, как Flask. Поскольку Ray использует gRPC в качестве протокола связи, скорость выше. Ray также оптимизирован на основе gRPC, а некоторые сценарии быстрее, чем нативная связь gRPC.
class TFMnistModel:
def __init__(self, model_path):
import tensorflow as tf
self.model_path = model_path
# 加载模型
self.model = tf.keras.models.load_model(model_path)
async def __call__(self, starlette_request): # 异步调用
# transform HTTP request -> tensorflow input
input_array = np.array((await starlette_request.json())["array"])
reshaped_array = input_array.reshape((1, 28, 28))
# tensorflow input -> tensorflow output
prediction = self.model(reshaped_array)
# 返回结果
# tensorflow output -> web output
return {
"prediction": prediction.numpy().tolist(),
"file": self.model_path
}
Шаг 2. Разверните модель в Ray Serve.
В следующем коде функция start используется для запуска службы, функция create_backend используется для запуска модели, а функция create_endpoint используется для запуска службы. В Ray модели и службы разделены, и несколько служб могут вызывать одну и ту же модель для поддержки сложной логики вызова.
«tf:v1» — это имя модели, «tf_classifier» — это имя службы, а параметр маршрута — это маршрут.Эти параметры могут быть определены произвольно.
client = serve.start()
client.create_backend("tf:v1", TFMnistModel, TRAINED_MODEL_PATH)
client.create_endpoint("tf_classifier", backend="tf:v1", route="/mnist")
Шаг 3. Запросите тест
resp = requests.get(
"http://localhost:8000/mnist",
json={"array": np.random.randn(28 * 28).tolist()})
print(resp.json())
3. Заключение
Хороший фреймворк часто содержит множество продвинутых концепций дизайна. При создании фреймворка Ray использовались многие передовые концепции дизайна, такие как стратегия гибридного планирования, управление GCS и т. д. Эти концепции дизайна сделали сам фреймворк совершенным и продвинутым. Ray широко используется в сценариях распределенных вычислений предприятий ИИ, выделяется среди многих фреймворков и заслуживает изучения.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!