В прошлом году на конференции 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, привязки событий, магазины состояний и акторы.
Следите за новостями!