Base image with CUDA (#2273)

Co-authored-by: Jonatan Kłosko <jonatanklosko@gmail.com>
This commit is contained in:
Cristine Guadelupe 2023-10-14 17:33:48 +07:00 committed by Jonatan Kłosko
parent be38033372
commit 00b79d7e45
2 changed files with 53 additions and 8 deletions

View file

@ -44,6 +44,21 @@ defmodule Livebook.Config do
@identity_provider_read_only Enum.filter(@identity_providers, & &1.read_only) @identity_provider_read_only Enum.filter(@identity_providers, & &1.read_only)
@doc """
Returns docker tags to be used when generating sample Dockerfiles.
"""
@spec docker_tags() :: list(%{tag: String.t(), name: String.t(), env: keyword()})
def docker_tags do
version = app_version()
base = if version =~ "dev", do: "latest", else: version
[
%{tag: base, name: "Livebook", env: []},
%{tag: "#{base}-cuda11.8", name: "Livebook + CUDA 11.8", env: [XLA_TARGET: "cuda118"]},
%{tag: "#{base}-cuda12.1", name: "Livebook + CUDA 12.1", env: [XLA_TARGET: "cuda120"]}
]
end
@doc """ @doc """
Returns the longname if the distribution mode is configured to use long names. Returns the longname if the distribution mode is configured to use long names.
""" """

View file

@ -30,6 +30,9 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
raise(NotFoundError, "could not find file system matching #{inspect(file_system_id)}") raise(NotFoundError, "could not find file system matching #{inspect(file_system_id)}")
end end
docker_tags = Livebook.Config.docker_tags()
[%{tag: default_base_image} | _] = docker_tags
{:ok, {:ok,
socket socket
|> assign( |> assign(
@ -43,7 +46,9 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
hub_metadata: Provider.to_metadata(assigns.hub), hub_metadata: Provider.to_metadata(assigns.hub),
is_default: is_default?, is_default: is_default?,
zta: %{"provider" => "", "key" => ""}, zta: %{"provider" => "", "key" => ""},
zta_metadata: nil zta_metadata: nil,
base_image: default_base_image,
docker_tags: docker_tags
) )
|> assign_dockerfile() |> assign_dockerfile()
|> assign_form(changeset)} |> assign_form(changeset)}
@ -206,6 +211,17 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
the steps below. First, configure your deployment: the steps below. First, configure your deployment:
</p> </p>
<div class="grid grid-cols-1">
<form phx-change="base_image" phx-target={@myself} phx-nosubmit>
<.radio_field
name="base_image"
label="Base image"
value={@base_image}
options={for tag <- @docker_tags, do: {tag.tag, tag.name}}
/>
</form>
</div>
<.form :let={f} class="py-2" for={@zta} phx-change="change_zta" phx-target={@myself}> <.form :let={f} class="py-2" for={@zta} phx-change="change_zta" phx-target={@myself}>
<div class="grid grid-cols-1 md:grid-cols-2 gap-3"> <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
<.select_field <.select_field
@ -526,6 +542,10 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
{:noreply, push_navigate(socket, to: ~p"/hub/#{socket.assigns.hub.id}")} {:noreply, push_navigate(socket, to: ~p"/hub/#{socket.assigns.hub.id}")}
end end
def handle_event("base_image", %{"base_image" => base_image}, socket) do
{:noreply, assign(socket, base_image: base_image) |> assign_dockerfile()}
end
defp is_default?(hub) do defp is_default?(hub) do
Hubs.get_default_hub().id == hub.id Hubs.get_default_hub().id == hub.id
end end
@ -535,14 +555,21 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
end end
defp assign_dockerfile(socket) do defp assign_dockerfile(socket) do
version = to_string(Application.spec(:livebook, :vsn)) base_image = Enum.find(socket.assigns.docker_tags, &(&1.tag == socket.assigns.base_image))
version = if version =~ "dev", do: "edge", else: version
base = image = """
FROM ghcr.io/livebook-dev/livebook:#{base_image.tag}
"""
image_base_env = base_env(base_image.env)
base_args = """
ARG APPS_PATH=/path/to/my/notebooks
ARG TEAMS_KEY="#{socket.assigns.hub.teams_key}"
"""
base_env =
""" """
FROM ghcr.io/livebook-dev/livebook:#{version}
ARG APPS_PATH=/path/to/my/notebooks
ARG TEAMS_KEY="#{socket.assigns.hub.teams_key}"
ENV LIVEBOOK_TEAMS_KEY ${TEAMS_KEY} ENV LIVEBOOK_TEAMS_KEY ${TEAMS_KEY}
ENV LIVEBOOK_TEAMS_NAME "#{socket.assigns.hub.hub_name}" ENV LIVEBOOK_TEAMS_NAME "#{socket.assigns.hub.hub_name}"
@ -565,7 +592,7 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
zta = zta_env(socket.assigns.zta) zta = zta_env(socket.assigns.zta)
dockerfile = dockerfile =
[base, secrets, file_systems, zta, apps] [image, base_args, image_base_env, base_env, secrets, file_systems, zta, apps]
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
|> Enum.join() |> Enum.join()
@ -630,4 +657,7 @@ defmodule LivebookWeb.Hub.Edit.TeamComponent do
ENV LIVEBOOK_TEAMS_FS "#{encrypt_file_systems_to_dockerfile(socket)}" ENV LIVEBOOK_TEAMS_FS "#{encrypt_file_systems_to_dockerfile(socket)}"
""" """
end end
defp base_env([]), do: nil
defp base_env(list), do: Enum.map_join(list, fn {k, v} -> ~s/ENV #{k} "#{v}"\n/ end)
end end