Модели замещения с помощью Julia и JupyterLab на платформе Serverless Azure Container Apps …

В прошлом году на конференции Ignite компания Microsoft объявила о предложении облачно-нативных приложений Azure Container Apps, позволяющем разработчикам создавать архитектуры микросервисов с использованием контейнеров в Serverless preview. Компания объявила об общей доступности сервиса на ежегодной конференции Build.

Azure Container Apps базируется на технологии с открытым исходным кодом с использованием проектов CNCF, таких как Kubernetes Event-Driven Autoscaling (KEDA), Distributed Application Runtime (Dapr) и Envoy, работающих на Azure Kubernetes Service (AKS).

Контейнеры в приложениях Azure Container Apps

Общий выпуск Azure Container Apps теперь включает новые функции, такие как возможность для разработчиков защитить свои приложения, развернув их в виртуальной сети с использованием управляемых идентификаторов для доступа к другим защищенным ресурсам Azure Active Directory (Azure AD).

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

Обзор приложений Azure Container Apps

Azure Container Apps можно использовать в различных контекстах, от конечных точек публичных API до микросервисов. Сервис позволяет выполнять код приложения, инкапсулированный в любой контейнер, независимо от среды выполнения или модели программирования. Кроме того, код может быть разработан, например, в Visual Studio Code, на портале Azure и в Azure CLI для управления ресурсами Azure Container Apps.

Я буду тестировать здесь через портал Azure, потому что часть CLI очень хорошо документирована здесь:

Быстрый старт: развертывание вашего первого контейнерного приложения

поскольку Azure Container Apps можно приобрести на рынке:

Контейнерные приложения Azure | Microsoft Azure

Я определяю имя группы ресурсов, а также имя контейнера с портала:

Значения среды по умолчанию, особенно для сетевой части и мониторинга, оставлены такими, какие они есть:

Я повторно использую официальный docker-образ JupyterLab в его версии Datascience (которая включает Python, Julia и R) через характеристики контейнера для заполнения на портале:

Docker Hub

Здесь 2 vCPU и 4 ГБ оперативной памяти. Ознакомьтесь с ценовыми характеристиками Azure Container Apps: 180 000 vCPU-секунд и 360 000 GiB-секунд бесплатно в месяц:

Контейнерные приложения Azure – ценообразование | Microsoft Azure

Azure Container Apps раскрывает каждое приложение через доменное имя, если включен Ingress. Конечные точки входа могут быть открытыми для всего мира или внутренними и доступными только для других контейнерных приложений в той же среде. Я включаю эту опцию на портале с TCP-портом 8888 в качестве целевого порта для контейнера JupyterLab:

Подключение приложений в Azure Container Apps

Приложение с JupyterLab готово к запуску:

Успешное развертывание здесь:

По умолчанию в Pod в AKS у меня есть min/max с количеством реплик контейнера от 0 до 10:

Здесь я перехожу на один контейнер:

Это приводит к созданию ревизии:

с этим новым значением:

Поскольку здесь запущен только один контейнер, я получаю токен, необходимый для подключения к JupyterLab, в части портала Log Stream:

Действительно, вход был обеспечен на портале :

всегда в такой форме:

Подключение к JupyterLab:

У меня есть последняя версия Julia 1.7.3, которая будет полезна для тестирования моделей замещения через Surrogates.jl.

GitHub – SciML/Surrogates.jl: Суррогатное моделирование и оптимизация для научного машинного обучения (SciML).

Как указано в этом репозитории на GitHub, суррогатная модель – это метод аппроксимации, который имитирует поведение дорогостоящей вычислительной симуляции. В более математических терминах: предположим, мы пытаемся оптимизировать функцию f(p), но каждое вычисление f очень дорого. Возможно, нам придется решать PDE (уравнение в частных дифференциальных уравнениях) для каждой точки или использовать современные численные машины линейной алгебры, что обычно дорого. Идея заключается в том, чтобы разработать суррогатную модель g, которая аппроксимирует f путем обучения на предыдущих данных, собранных из оценок f. Построение суррогатной модели можно рассматривать как трехэтапный процесс:

  • Отбор выборки
  • Построение модели замещения
  • Оптимизация суррогатной модели

Суррогатная модель – Википедия


https://www.researchgate.net/publication/338658899_Surrogate-assisted_global_sensitivity_analysis_an_overview

Я могу создать новое ядро с учетом количества присутствующих потоков, здесь 4:

using IJulia
installkernel("Julia-4-threads", env=Dict("JULIA_NUM_THREADS"=>"4"))
Войдите в полноэкранный режим Выход из полноэкранного режима

После этого становится доступным новое ядро с 4 потоками для Julia:

Я использую bottom вместо htop для мониторинга потребления ресурсов в JupyterLab:

GitHub – ClementTsang/bottom: Еще один кроссплатформенный графический монитор процессов/систем.

с темой Jupyter Dark для лучшей визуализации в JupyterLab:

Установка пакетов Surrogates.jl и Plots.jl затем :

using Pkg
Pkg.add(["Surrogates", "Plots"])
Войдите в полноэкранный режим Выход из полноэкранного режима

Здесь применяется функция Бранина, которая обычно используется в качестве тестовой функции для метамоделирования в компьютерных экспериментах, особенно в контексте оптимизации:

с

Я импортирую пакеты сюда:

using Surrogates
using Plots
default()
Войдите в полноэкранный режим Выход из полноэкранного режима

и я определяю функцию :

function branin(x)
      x1 = x[1]
      x2 = x[2]
      b = 5.1 / (4*pi^2);
      c = 5/pi;
      r = 6;
      a = 1;
      s = 10;
      t = 1 / (8*pi);
      term1 = a * (x2 - b*x1^2 + c*x1 - r)^2;
      term2 = s*(1-t)*cos(x1);
      y = term1 + term2 + s;
end
Войдите в полноэкранный режим Выход из полноэкранного режима

с графическим представлением этой функции:

n_samples = 80
lower_bound = [-5, 0]
upper_bound = [10,15]
xys = sample(n_samples, lower_bound, upper_bound, SobolSample())
zs = branin.(xys);
x, y = -5:10, 0:15 # hide
p1 = surface(x, y, (x1,x2) -> branin((x1,x2)))
xs = [xy[1] for xy in xys] 
ys = [xy[2] for xy in xys] 
scatter!(xs, ys, zs) 
p2 = contour(x, y, (x1,x2) -> branin((x1,x2))) 
scatter!(xs, ys)
plot(p1, p2, title="Fonction vraie")
Войдите в полноэкранный режим Выход из полноэкранного режима

что дает такой график:

Теперь пришло время настроить различные заменители и составить их график. Применение к подстановке кригинга.

Кригинг или регрессия по гауссовскому процессу – это метод интерполяции, при котором интерполируемые значения моделируются гауссовским процессом.

  • Kriging – Surrogates.jl
  • Использование мета-модели кригинга в оптимизации
kriging_surrogate = Kriging(xys, zs, lower_bound, upper_bound, p=[1.9, 1.9])
Войдите в полноэкранный режим Выход из полноэкранного режима

и его графическое представление :

p1 = surface(x, y, (x, y) -> kriging_surrogate([x y]))
scatter!(xs, ys, zs, marker_z=zs)
p2 = contour(x, y, (x, y) -> kriging_surrogate([x y]))
scatter!(xs, ys, marker_z=zs)
plot(p1, p2, title="Substitution par Krigreage")
Войдите в полноэкранный режим Выход из полноэкранного режима

Далее используйте “модель замещения с обратным расстоянием”.

Это метод интерполяции. В этом методе неизвестные точки рассчитываются с помощью средневзвешенного значения точек выборки.

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

InverseDistance – Surrogates.jl

InverseDistance = InverseDistanceSurrogate(xys, zs, lower_bound, upper_bound)
Войдите в полноэкранный режим Выход из полноэкранного режима

и снова его графическое представление:

p1 = surface(x, y, (x, y) -> InverseDistance([x y])) 
scatter!(xs, ys, zs, marker_z=zs) 
p2 = contour(x, y, (x, y) -> InverseDistance([x y])) 
scatter!(xs, ys, marker_z=zs)
plot(p1, p2, title="substitution distance inverse")
Войдите в полноэкранный режим Выход из полноэкранного режима

Наконец, использование подстановки Лобачевского. Функция сплайнов Лобачевского – это функция, используемая для одномерной и многомерной рассеянной интерполяции. Введена Лобачевским в 1842 году для изучения ошибок в астрономических измерениях:

Лобачевский – Суррогаты.jl

Lobachevsky = LobachevskySurrogate(xys, zs, lower_bound, upper_bound, alpha = [2.8,2.8], n=8)
Войдите в полноэкранный режим Выход из полноэкранного режима

с его графическим представлением:

p1 = surface(x, y, (x, y) -> Lobachevsky([x y]))
scatter!(xs, ys, zs, marker_z=zs)
p2 = contour(x, y, (x, y) -> Lobachevsky([x y]))
scatter!(xs, ys, marker_z=zs)
plot(p1, p2, title="Substitution Lobachevsky")
Войдите в полноэкранный режим Выход из полноэкранного режима

Можно определить нейронную сеть как суррогатную модель, используя Flux.jl :

  • Нейросуррогат – Surrogates.jl
  • Главная – Флюс

Действительно, можно вызывать методы оптимизации с помощью нейронных сетей. Surrogates.jl можно найти в JuliaSim, облачной платформе моделирования нового поколения, сочетающей новейшие методы SciML с численным двойным моделированием и симуляцией на основе уравнений:

  • JuliaSim – Julia Computing
  • Компоновка моделирования и симуляции с машинным обучением в Julia

как описано в этой статье …

Генерирование суррогатов

Наконец, я могу возобновить использование ParallelStencil.jl, как было показано в предыдущей статье:

  • Почти тривиальное распределенное распараллеливание приложений для GPU и CPU на основе трафаретов с…
  • GitHub – omlins/ParallelStencil.jl: Пакет для написания высокоуровневого кода для параллельных высокопроизводительных трафаретных вычислений, которые могут быть развернуты как на GPU, так и на CPU.

путем установки необходимых пакетов:

Pkg.add(["Printf", "Statistics", "ParallelStencil"])
Войдите в полноэкранный режим Выход из полноэкранного режима

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


https://pt.slideshare.net/AmrMousa12/2-dimensional-wave-equation-analytical-and-numerical-solution

и этот код в Julia :

Отслеживание показателей потребления ресурсов с портала:

или из контейнера через дно:

Удалить JupyterLab так же просто, как удалить группу ресурсов, созданную в рамках Azure Container Apps, через портал или Azure CLI:

az group delete --resource-group RG-JUPYTER --yes
Войдите в полноэкранный режим Выход из полноэкранного режима

В заключение можно сказать, что мы можем пойти гораздо дальше в Azure Container Apps с помощью Dapr (Distributed Application Runtime), среды выполнения, которая позволяет создавать отказоустойчивые, stateless и stateful микросервисы, которые могут быть реализованы в данном случае …

Учебное пособие: Развертывание приложения Dapr в Azure Container Apps с помощью Azure CLI

С Azure Container Apps вы получаете полностью управляемую версию API Dapr при создании микросервисов.

При использовании Dapr в Azure Container Apps вы можете включить боковые вагоны для запуска рядом с вашими микросервисами, которые предоставляют богатый набор функций.

Доступные API Dapr включают вызовы между сервисами, Pub/Sub, привязки событий, магазины состояний и акторы.

Следите за новостями!

Оцените статью
Procodings.ru
Добавить комментарий