diff --git a/pkg/driver/krunkit/boot/00-add-user-to-video-render-group.sh b/pkg/driver/krunkit/boot/00-add-user-to-video-render-group.sh new file mode 100644 index 00000000000..9b242e20913 --- /dev/null +++ b/pkg/driver/krunkit/boot/00-add-user-to-video-render-group.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# SPDX-FileCopyrightText: Copyright The Lima Authors +# SPDX-License-Identifier: Apache-2.0 + +set -eux -o pipefail + +u="${LIMA_CIDATA_USER:-$USER}" +getent group render >/dev/null 2>&1 || groupadd -f render +getent group video >/dev/null 2>&1 || groupadd -f video +sudo usermod -aG render "$u" || true +sudo usermod -aG video "$u" || true diff --git a/pkg/driver/krunkit/boot/01-gpu-device-perms.sh b/pkg/driver/krunkit/boot/01-gpu-device-perms.sh new file mode 100644 index 00000000000..2e97685d1d4 --- /dev/null +++ b/pkg/driver/krunkit/boot/01-gpu-device-perms.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# SPDX-FileCopyrightText: Copyright The Lima Authors +# SPDX-License-Identifier: Apache-2.0 + +set -eux -o pipefail + +# Make DRM render/card nodes world-accessible +install -d -m 0755 /etc/udev/rules.d +cat >/etc/udev/rules.d/70-lima-drm.rules <<'EOF' +KERNEL=="render[D]*", SUBSYSTEM=="drm", MODE="0666" +KERNEL=="card*", SUBSYSTEM=="drm", MODE="0666" +EOF + +# Apply to existing nodes now and future ones via udev +udevadm control --reload || true +udevadm trigger --subsystem-match=drm || true + +if [ -d /dev/dri ]; then + chmod 0666 /dev/dri/render[D]* 2>/dev/null || true + chmod 0666 /dev/dri/card* 2>/dev/null || true +fi diff --git a/pkg/driver/krunkit/hack/install-vulkan-gpu.sh b/pkg/driver/krunkit/hack/install-vulkan-gpu.sh deleted file mode 100644 index d3f60d43fad..00000000000 --- a/pkg/driver/krunkit/hack/install-vulkan-gpu.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# SPDX-FileCopyrightText: Copyright The Lima Authors -# SPDX-License-Identifier: Apache-2.0 - -set -eux -o pipefail - -# Install required packages -dnf install -y dnf-plugins-core dnf-plugin-versionlock llvm18-libs - -# Install Vulkan and Mesa base packages -dnf install -y \ - mesa-vulkan-drivers \ - vulkan-loader-devel \ - vulkan-headers \ - vulkan-tools \ - vulkan-loader \ - glslc - -# Enable COPR repo with patched Mesa for Venus support -dnf copr enable -y slp/mesa-krunkit fedora-40-aarch64 - -# Downgrade to patched Mesa version from COPR -dnf downgrade -y mesa-vulkan-drivers.aarch64 \ - --repo=copr:copr.fedorainfracloud.org:slp:mesa-krunkit - -# Lock Mesa version to prevent automatic upgrades -dnf versionlock add mesa-vulkan-drivers - -# Clean up -dnf clean all - -echo "Krunkit GPU(Venus) setup complete. Verify Vulkan installation by running 'vulkaninfo --summary'." diff --git a/pkg/driver/krunkit/krunkit_driver_darwin_arm64.go b/pkg/driver/krunkit/krunkit_driver_darwin_arm64.go index af457d0a3c0..34f25f11daf 100644 --- a/pkg/driver/krunkit/krunkit_driver_darwin_arm64.go +++ b/pkg/driver/krunkit/krunkit_driver_darwin_arm64.go @@ -5,7 +5,7 @@ package krunkit import ( "context" - _ "embed" + "embed" "errors" "fmt" "net" @@ -39,25 +39,9 @@ type LimaKrunkitDriver struct { krunkitWaitCh chan error } -type KrunkitOpts struct { - GPUAccel *bool `yaml:"gpuAccel,omitempty"` -} - -func NewKrunkitOpts(cfg *limatype.LimaYAML) (*KrunkitOpts, error) { - var krunkitOpts KrunkitOpts - if err := limayaml.Convert(cfg.VMOpts[vmType], &krunkitOpts, "vmOpts.krunkit"); err != nil { - return nil, err - } - - return &krunkitOpts, nil -} - var ( _ driver.Driver = (*LimaKrunkitDriver)(nil) vmType limatype.VMType = "krunkit" - - //go:embed hack/install-vulkan-gpu.sh - gpuProvisionScript string ) func New() *LimaKrunkitDriver { @@ -188,17 +172,6 @@ func validateConfig(cfg *limatype.LimaYAML) error { return fmt.Errorf("field `mountType` must be %q or %q for krunkit driver, got %q", limatype.VIRTIOFS, limatype.REVSSHFS, *cfg.MountType) } - // If GPU acceleration is requested, ensure Fedora image/template is used - krunkitOpts, err := NewKrunkitOpts(cfg) - if err != nil { - return err - } - if krunkitOpts.GPUAccel != nil && *krunkitOpts.GPUAccel { - if !isFedoraConfigured(cfg) { - logrus.Warn("gpuAccel: true requires a Fedora image (use a Fedora base template or image)") - } - } - return nil } @@ -231,51 +204,39 @@ func (l *LimaKrunkitDriver) FillConfig(_ context.Context, cfg *limatype.LimaYAML cfg.VMType = ptr.Of(vmType) - krunkitOpts, err := NewKrunkitOpts(cfg) - if err != nil { - return err - } - - if krunkitOpts.GPUAccel == nil { - krunkitOpts.GPUAccel = ptr.Of(false) - } - - if *krunkitOpts.GPUAccel { - gpuInstallScript := limatype.Provision{ - Mode: limatype.ProvisionModeData, - Script: ptr.Of(gpuProvisionScript), - ProvisionData: limatype.ProvisionData{ - Content: ptr.Of(gpuProvisionScript), - Path: ptr.Of("/usr/local/bin/install-vulkan-gpu.sh"), - Permissions: ptr.Of("0755"), - Overwrite: ptr.Of(false), - Owner: cfg.User.Name, - }, - } - cfg.Provision = append(cfg.Provision, gpuInstallScript) - cfg.Message = "To enable GPU support for krunkit, run the following command inside the VM:\n\033[32msudo install-vulkan-gpu.sh\033[0m\n" - } - return validateConfig(cfg) } +//go:embed boot/*.sh +var bootFS embed.FS + func (l *LimaKrunkitDriver) BootScripts() (map[string][]byte, error) { - // Override default reboot-if-required with a no-op because Fedora does not support this well and - // takes a long time to start up. - krunkitOpts, err := NewKrunkitOpts(l.Instance.Config) - if err != nil { - return nil, err - } - if krunkitOpts.GPUAccel == nil || !*krunkitOpts.GPUAccel { - return nil, nil + scripts := make(map[string][]byte) + + entries, err := bootFS.ReadDir("boot") + if err == nil && !isFedoraConfigured(l.Instance.Config) { + for _, entry := range entries { + if entry.IsDir() { + continue + } + + content, err := bootFS.ReadFile("boot/" + entry.Name()) + if err != nil { + return nil, err + } + + scripts[entry.Name()] = content + } } - scripts := map[string][]byte{ - "00-reboot-if-required.sh": []byte(`#!/bin/sh + + // Disabled by krunkit driver for Fedora to make boot time faster + if isFedoraConfigured(l.Instance.Config) { + scripts["00-reboot-if-required.sh"] = []byte(`#!/bin/sh set -eu -# Disabled by krunkit driver exit 0 -`), +`) } + return scripts, nil } diff --git a/templates/experimental/krunkit.yaml b/templates/experimental/krunkit.yaml deleted file mode 100644 index aa05f89e1bb..00000000000 --- a/templates/experimental/krunkit.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Use this template only if you want to use GPU(Venus) inside the krunkit VM -# or else Krunkit can also work with the default Lima template. - -vmType: krunkit - -# For AI workloads, at least 4GiB memory and 4 CPUs are recommended. -memory: 4GiB -cpus: 4 -arch: aarch64 - -# Fedora 40+ is preferred because of better support for MESA & Vulkan, -# which is good for GPU acceleration and AI workloads -base: -- template://_images/fedora -- template://_default/mounts - -mountType: virtiofs - -vmOpts: - krunkit: - gpuAccel: true diff --git a/website/content/en/docs/config/vmtype/krunkit.md b/website/content/en/docs/config/vmtype/krunkit.md index c8dfe883efc..3e2acd5e89d 100644 --- a/website/content/en/docs/config/vmtype/krunkit.md +++ b/website/content/en/docs/config/vmtype/krunkit.md @@ -31,59 +31,150 @@ go build -o /libexec/lima/lima-driver-krunkit ./cmd/lima-driver-krunkit/ limactl info # "vmTypes" should include "krunkit" ``` - ## Quick start -- Non‑GPU (general workloads) +You can run AI models either: +- With containers (fast to get started; any distro works), or +- Without containers (choose Fedora; build `llama.cpp` from source). + +Before running, install a small model on the host so examples can run quickly. We’ll use `Qwen3‑1.7B GGUF`: + +```bash +mkdir -p models +curl -LO --output-dir models 'https://huggingface.co/Qwen/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q8_0.gguf' +``` + +### 1) Run models using containers (easiest) + +Start a krunkit VM with the default Lima template: + +{{< tabpane text=true >}} +{{% tab header="CLI" %}} +```bash +limactl start --vm-type=krunkit +limactl shell default +``` +{{% /tab %}} +{{< /tabpane >}} + +Then inside the VM: + +```bash +nerdctl run --rm -ti \ + --device /dev/dri \ + -v $(pwd)/models:/models \ + quay.io/slopezpa/fedora-vgpu-llama +``` +For reference: https://sinrega.org/2024-03-06-enabling-containers-gpu-macos/ + +Once inside the container: + ```bash -limactl start default --vm-type=krunkit +llama-cli -m /models/Qwen3-1.7B-Q8_0.gguf -b 512 -ngl 99 -p "Introduce yourself" ``` -- GPU (Vulkan via Venus) - - Recommended distro: Fedora 40+ (smoothest Mesa/Vulkan setup; uses COPR “slp/mesa-krunkit” for patched mesa-vulkan-drivers). - - Start from the krunkit template and follow the logs to complete GPU setup. +You can now chat with the model. + +### 2) Run models without containers (hard way) + +This path builds and installs dependencies (which can take some time. For faster builds, allocate more CPUs and memory to the VM. See [`options`](../../reference/limactl_start/#options)). Use Fedora as the image. {{< tabpane text=true >}} {{% tab header="CLI" %}} ```bash -# GPU (Vulkan via Venus on Fedora) -limactl start template:experimental/krunkit +limactl start --vm-type=krunkit template://fedora +limactl shell fedora ``` {{% /tab %}} {{% tab header="YAML" %}} ```yaml vmType: krunkit -# For AI workloads, at least 4GiB memory and 4 CPUs are recommended. -memory: 4GiB -cpus: 4 -arch: aarch64 - -# Fedora 40+ is preferred for Mesa & Vulkan (Venus) support base: - template://_images/fedora - -mounts: -- location: "~" - writable: true +- template://_default/mounts mountType: virtiofs - -vmOpts: - krunkit: - gpuAccel: true ``` {{% /tab %}} {{< /tabpane >}} -After the VM is READY, inside the VM: +Once inside the VM, install GPU/Vulkan support: + +

+

+Click to expand script + +```bash +#!/bin/bash +# SPDX-FileCopyrightText: Copyright The Lima Authors +# SPDX-License-Identifier: Apache-2.0 + +set -eu -o pipefail + +# Install required packages +dnf install -y dnf-plugins-core dnf-plugin-versionlock llvm18-libs + +# Install Vulkan and Mesa base packages +dnf install -y \ + mesa-vulkan-drivers \ + vulkan-loader-devel \ + vulkan-headers \ + vulkan-tools \ + vulkan-loader \ + glslc + +# Enable COPR repo with patched Mesa for Venus support +dnf copr enable -y slp/mesa-krunkit fedora-40-aarch64 + +# Downgrade to patched Mesa version from COPR +dnf downgrade -y mesa-vulkan-drivers.aarch64 \ + --repo=copr:copr.fedorainfracloud.org:slp:mesa-krunkit + +# Lock Mesa version to prevent automatic upgrades +dnf versionlock add mesa-vulkan-drivers + +# Clean up +dnf clean all + +echo "Installing llama.cpp with Vulkan support..." +# Build and install llama.cpp with Vulkan support +dnf install -y git cmake clang curl-devel glslc vulkan-devel virglrenderer +( + cd ~ + git clone https://github.com/ggml-org/llama.cpp + ( + cd llama.cpp + git reset --hard 97340b4c9924be86704dbf155e97c8319849ee19 + cmake -B build -DGGML_VULKAN=ON -DGGML_CCACHE=OFF -DCMAKE_INSTALL_PREFIX=/usr + # FIXME: the build seems to fail on Apple M4 Max (and probably on other processors too). + # Error: + # cc1: sorry, unimplemented: no support for ‘sme’ without ‘sve2’ + cmake --build build --config Release -j8 + cmake --install build + ) + rm -fr llama.cpp +) + +echo "Successfully installed llama.cpp with Vulkan support. Use 'llama-cli' app with .gguf models." +``` + +
+

+ +The script will prompt to build and install `llama.cpp` with Venus support from source. + +After installation, run: + ```bash -sudo install-vulkan-gpu.sh +llama-cli -m models/Qwen3-1.7B-Q8_0.gguf -b 512 -ngl 99 -p "Introduce yourself" ``` +and enjoy chatting with the AI model. + ## Notes and caveats - macOS Ventura or later on Apple Silicon is required. -- GPU mode requires a Fedora image/template; Fedora 40+ recommended for Mesa/Vulkan (Venus). -- To verify GPU/Vulkan in the guest, use tools like `vulkaninfo` after running the install script. -- `Libkrun` and [`Ramalama`](https://github.com/containers/ramalama)(a tool that simplifies running AI models locally) use CPU inferencing as of **July 2, 2025** and are actively working to support GPU inferencing. [More info](https://developers.redhat.com/articles/2025/07/02/supercharging-ai-isolation-microvms-ramalama-libkrun#current_limitations_and_future_directions__gpu_enablement). +- To verify GPU/Vulkan in the guest container or VM, use tools like `vulkaninfo --summary`. +- AI models on containers can run on any Linux distribution but without containers Fedora is required. +- For more information about usage of `llama-cli`. See [llama.cpp](https://github.com/ggml-org/llama.cpp) `README.md`. - Driver architecture details: see [Virtual Machine Drivers](../../dev/drivers). \ No newline at end of file