Little helper to run CNCF's k3s in Docker
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
k3d/v5.4.4/usage/advanced/cuda/index.html

1570 lines
45 KiB

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Little helper to run Rancher Lab's k3s in Docker">
<link rel="canonical" href="https://k3d.io/v5.4.4/usage/advanced/cuda/">
<link rel="icon" href="../../../static/img/favicons_black_blue/favicon.png">
<meta name="generator" content="mkdocs-1.2.3, mkdocs-material-8.2.7">
<title>Running CUDA workloads - k3d</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.9d5733d3.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.e6a45f82.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../static/css/asciinema-player.css">
<link rel="stylesheet" href="../../../static/css/extra.css">
<script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="grey">
<script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#running-cuda-workloads" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-component="outdated" hidden>
<aside class="md-banner md-banner--warning">
</aside>
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="k3d" class="md-header__button md-logo" aria-label="k3d" data-md-component="logo">
<img src="../../../static/img/k3d_logo_black_green.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
k3d
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Running CUDA workloads
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="grey" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6zm0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4zM7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="light-blue" data-md-color-accent="" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3z"/></svg>
</label>
</form>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/k3d-io/k3d/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
k3d-io/k3d
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Overview
</a>
</li>
<li class="md-tabs__item">
<a href="../../configfile/" class="md-tabs__link md-tabs__link--active">
Guides
</a>
</li>
<li class="md-tabs__item">
<a href="../../../design/project/" class="md-tabs__link">
Design
</a>
</li>
<li class="md-tabs__item">
<a href="../../../faq/faq/" class="md-tabs__link">
FAQ
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="k3d" class="md-nav__button md-logo" aria-label="k3d" data-md-component="logo">
<img src="../../../static/img/k3d_logo_black_green.svg" alt="logo">
</a>
k3d
</label>
<div class="md-nav__source">
<a href="https://github.com/k3d-io/k3d/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
k3d-io/k3d
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked>
<label class="md-nav__link" for="__nav_2">
Guides
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Guides" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../configfile/" class="md-nav__link">
Using Config Files
</a>
</li>
<li class="md-nav__item">
<a href="../../kubeconfig/" class="md-nav__link">
Handling Kubeconfigs
</a>
</li>
<li class="md-nav__item">
<a href="../../multiserver/" class="md-nav__link">
Creating multi-server clusters
</a>
</li>
<li class="md-nav__item">
<a href="../../registries/" class="md-nav__link">
Using Image Registries
</a>
</li>
<li class="md-nav__item">
<a href="../../exposing_services/" class="md-nav__link">
Exposing Services
</a>
</li>
<li class="md-nav__item">
<a href="../../importing_images/" class="md-nav__link">
Importing modes
</a>
</li>
<li class="md-nav__item">
<a href="../../k3s/" class="md-nav__link">
K3s Features in k3d
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_8" type="checkbox" id="__nav_2_8" checked>
<label class="md-nav__link" for="__nav_2_8">
Advanced Guides
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Advanced Guides" data-md-level="2">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Advanced Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../calico/" class="md-nav__link">
Use Calico instead of Flannel
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Running CUDA workloads
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Running CUDA workloads
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#building-a-customized-k3s-image" class="md-nav__link">
Building a customized K3s image
</a>
<nav class="md-nav" aria-label="Building a customized K3s image">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dockerfile" class="md-nav__link">
Dockerfile
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../podman/" class="md-nav__link">
Using Podman instead of Docker
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_9" data-md-state="indeterminate" type="checkbox" id="__nav_2_9" checked>
<label class="md-nav__link" for="__nav_2_9">
Commands
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Commands" data-md-level="2">
<label class="md-nav__title" for="__nav_2_9">
<span class="md-nav__icon md-icon"></span>
Commands
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../commands/k3d/" class="md-nav__link">
K3d
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster/" class="md-nav__link">
K3d cluster
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_create/" class="md-nav__link">
K3d cluster create
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_delete/" class="md-nav__link">
K3d cluster delete
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_edit/" class="md-nav__link">
K3d cluster edit
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_list/" class="md-nav__link">
K3d cluster list
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_start/" class="md-nav__link">
K3d cluster start
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_cluster_stop/" class="md-nav__link">
K3d cluster stop
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_completion/" class="md-nav__link">
K3d completion
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_config/" class="md-nav__link">
K3d config
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_config_init/" class="md-nav__link">
K3d config init
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_config_migrate/" class="md-nav__link">
K3d config migrate
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_image/" class="md-nav__link">
K3d image
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_image_import/" class="md-nav__link">
K3d image import
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_kubeconfig/" class="md-nav__link">
K3d kubeconfig
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_kubeconfig_get/" class="md-nav__link">
K3d kubeconfig get
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_kubeconfig_merge/" class="md-nav__link">
K3d kubeconfig merge
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node/" class="md-nav__link">
K3d node
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_create/" class="md-nav__link">
K3d node create
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_delete/" class="md-nav__link">
K3d node delete
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_edit/" class="md-nav__link">
K3d node edit
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_list/" class="md-nav__link">
K3d node list
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_start/" class="md-nav__link">
K3d node start
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_node_stop/" class="md-nav__link">
K3d node stop
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_registry/" class="md-nav__link">
K3d registry
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_registry_create/" class="md-nav__link">
K3d registry create
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_registry_delete/" class="md-nav__link">
K3d registry delete
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_registry_list/" class="md-nav__link">
K3d registry list
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_version/" class="md-nav__link">
K3d version
</a>
</li>
<li class="md-nav__item">
<a href="../../commands/k3d_version_list/" class="md-nav__link">
K3d version list
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" data-md-state="indeterminate" type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3">
Design
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Design" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Design
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../design/project/" class="md-nav__link">
Project Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../../design/concepts/" class="md-nav__link">
Concepts
</a>
</li>
<li class="md-nav__item">
<a href="../../../design/defaults/" class="md-nav__link">
Defaults
</a>
</li>
<li class="md-nav__item">
<a href="../../../design/networking/" class="md-nav__link">
Networking
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" data-md-state="indeterminate" type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4">
FAQ
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="FAQ" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
FAQ
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../faq/faq/" class="md-nav__link">
FAQ
</a>
</li>
<li class="md-nav__item">
<a href="../../../faq/compatibility/" class="md-nav__link">
Compatibility
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#building-a-customized-k3s-image" class="md-nav__link">
Building a customized K3s image
</a>
<nav class="md-nav" aria-label="Building a customized K3s image">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dockerfile" class="md-nav__link">
Dockerfile
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/k3d-io/k3d/edit/main/docs/usage/advanced/cuda.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
</a>
<h1 id="running-cuda-workloads">Running CUDA workloads<a class="headerlink" href="#running-cuda-workloads" title="Permanent link">&para;</a></h1>
<p>If you want to run CUDA workloads on the K3s container you need to customize the container.<br />
CUDA workloads require the NVIDIA Container Runtime, so containerd needs to be configured to use this runtime.<br />
The K3s container itself also needs to run with this runtime.<br />
If you are using Docker you can install the <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html">NVIDIA Container Toolkit</a>.</p>
<h2 id="building-a-customized-k3s-image">Building a customized K3s image<a class="headerlink" href="#building-a-customized-k3s-image" title="Permanent link">&para;</a></h2>
<p>To get the NVIDIA container runtime in the K3s image you need to build your own K3s image.<br />
The native K3s image is based on Alpine but the NVIDIA container runtime is not supported on Alpine yet.<br />
To get around this we need to build the image with a supported base image.</p>
<h3 id="dockerfile">Dockerfile<a class="headerlink" href="#dockerfile" title="Permanent link">&para;</a></h3>
<p><a href="cuda/Dockerfile">Dockerfile</a>: </p>
<p>```Dockerfile
ARG K3S_TAG=&rdquo;v1.21.2-k3s1&rdquo;
FROM rancher/k3s:$K3S_TAG as k3s</p>
<p>FROM nvidia/cuda:11.2.0-base-ubuntu18.04</p>
<p>ARG NVIDIA_CONTAINER_RUNTIME_VERSION
ENV NVIDIA_CONTAINER_RUNTIME_VERSION=$NVIDIA_CONTAINER_RUNTIME_VERSION</p>
<p>RUN echo &lsquo;debconf debconf/frontend select Noninteractive&rsquo; | debconf-set-selections</p>
<p>RUN apt-get update &amp;&amp; \
apt-get -y install gnupg2 curl</p>
<h1 id="install-nvidia-container-runtime">Install NVIDIA Container Runtime<a class="headerlink" href="#install-nvidia-container-runtime" title="Permanent link">&para;</a></h1>
<p>RUN curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -</p>
<p>RUN curl -s -L https://nvidia.github.io/nvidia-container-runtime/ubuntu18.04/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list</p>
<p>RUN apt-get update &amp;&amp; \
apt-get -y install nvidia-container-runtime=${NVIDIA_CONTAINER_RUNTIME_VERSION}</p>
<p>COPY &ndash;from=k3s / /</p>
<p>RUN mkdir -p /etc &amp;&amp; \
echo &lsquo;hosts: files dns&rsquo; &gt; /etc/nsswitch.conf</p>
<p>RUN chmod 1777 /tmp</p>
<h1 id="provide-custom-containerd-configuration-to-configure-the-nvidia-container-runtime">Provide custom containerd configuration to configure the nvidia-container-runtime<a class="headerlink" href="#provide-custom-containerd-configuration-to-configure-the-nvidia-container-runtime" title="Permanent link">&para;</a></h1>
<p>RUN mkdir -p /var/lib/rancher/k3s/agent/etc/containerd/</p>
<p>COPY config.toml.tmpl /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl</p>
<h1 id="deploy-the-nvidia-driver-plugin-on-startup">Deploy the nvidia driver plugin on startup<a class="headerlink" href="#deploy-the-nvidia-driver-plugin-on-startup" title="Permanent link">&para;</a></h1>
<p>RUN mkdir -p /var/lib/rancher/k3s/server/manifests</p>
<p>COPY device-plugin-daemonset.yaml /var/lib/rancher/k3s/server/manifests/nvidia-device-plugin-daemonset.yaml</p>
<p>VOLUME /var/lib/kubelet
VOLUME /var/lib/rancher/k3s
VOLUME /var/lib/cni
VOLUME /var/log</p>
<p>ENV PATH=&rdquo;$PATH:/bin/aux&rdquo;</p>
<p>ENTRYPOINT [&ldquo;/bin/k3s&rdquo;]
CMD [&ldquo;agent&rdquo;]
```</p>
<p>This Dockerfile is based on the <a href="https://github.com/rancher/k3s/blob/master/package/Dockerfile">K3s Dockerfile</a>
The following changes are applied:</p>
<ol>
<li>Change the base images to nvidia/cuda:11.2.0-base-ubuntu18.04 so the NVIDIA Container Runtime can be installed. The version of <code>cuda:xx.x.x</code> must match the one you&rsquo;re planning to use.</li>
<li>Add a custom containerd <code>config.toml</code> template to add the NVIDIA Container Runtime. This replaces the default <code>runc</code> runtime</li>
<li>Add a manifest for the NVIDIA driver plugin for Kubernetes</li>
</ol>
<h3 id="configure-containerd">Configure containerd<a class="headerlink" href="#configure-containerd" title="Permanent link">&para;</a></h3>
<p>We need to configure containerd to use the NVIDIA Container Runtime. We need to customize the config.toml that is used at startup. K3s provides a way to do this using a <a href="config.toml.tmpl">config.toml.tmpl</a> file. More information can be found on the <a href="https://rancher.com/docs/k3s/latest/en/advanced/#configuring-containerd">K3s site</a>.</p>
<p>```go
[plugins.opt]
path = &ldquo;{{ .NodeConfig.Containerd.Opt }}&rdquo;</p>
<p>[plugins.cri]
stream_server_address = &ldquo;127.0.0.1&rdquo;
stream_server_port = &ldquo;10010&rdquo;</p>
<p>{{- if .IsRunningInUserNS }}
disable_cgroup = true
disable_apparmor = true
restrict_oom_score_adj = true
{{end}}</p>
<p>{{- if .NodeConfig.AgentConfig.PauseImage }}
sandbox_image = &ldquo;{{ .NodeConfig.AgentConfig.PauseImage }}&rdquo;
{{end}}</p>
<p>{{- if not .NodeConfig.NoFlannel }}
[plugins.cri.cni]
bin_dir = &ldquo;{{ .NodeConfig.AgentConfig.CNIBinDir }}&rdquo;
conf_dir = &ldquo;{{ .NodeConfig.AgentConfig.CNIConfDir }}&rdquo;
{{end}}</p>
<p>[plugins.cri.containerd.runtimes.runc]
# ---- changed from &lsquo;io.containerd.runc.v2&rsquo; for GPU support
runtime_type = &ldquo;io.containerd.runtime.v1.linux&rdquo;</p>
<h1 id="-added-for-gpu-support">---- added for GPU support<a class="headerlink" href="#-added-for-gpu-support" title="Permanent link">&para;</a></h1>
<p>[plugins.linux]
runtime = &ldquo;nvidia-container-runtime&rdquo;</p>
<p>{{ if .PrivateRegistryConfig }}
{{ if .PrivateRegistryConfig.Mirrors }}
[plugins.cri.registry.mirrors]{{end}}
{{range $k, $v := .PrivateRegistryConfig.Mirrors }}
[plugins.cri.registry.mirrors.&rdquo;{{$k}}&rdquo;]
endpoint = [{{range $i, $j := $v.Endpoints}}{{if $i}}, {{end}}{{printf &ldquo;%q&rdquo; .}}{{end}}]
{{end}}</p>
<p>{{range $k, $v := .PrivateRegistryConfig.Configs }}
{{ if $v.Auth }}
[plugins.cri.registry.configs.&rdquo;{{$k}}&rdquo;.auth]
{{ if $v.Auth.Username }}username = &ldquo;{{ $v.Auth.Username }}&rdquo;{{end}}
{{ if $v.Auth.Password }}password = &ldquo;{{ $v.Auth.Password }}&rdquo;{{end}}
{{ if $v.Auth.Auth }}auth = &ldquo;{{ $v.Auth.Auth }}&rdquo;{{end}}
{{ if $v.Auth.IdentityToken }}identitytoken = &ldquo;{{ $v.Auth.IdentityToken }}&rdquo;{{end}}
{{end}}
{{ if $v.TLS }}
[plugins.cri.registry.configs.&rdquo;{{$k}}&rdquo;.tls]
{{ if $v.TLS.CAFile }}ca_file = &ldquo;{{ $v.TLS.CAFile }}&rdquo;{{end}}
{{ if $v.TLS.CertFile }}cert_file = &ldquo;{{ $v.TLS.CertFile }}&rdquo;{{end}}
{{ if $v.TLS.KeyFile }}key_file = &ldquo;{{ $v.TLS.KeyFile }}&rdquo;{{end}}
{{end}}
{{end}}
{{end}}
```</p>
<h3 id="the-nvidia-device-plugin">The NVIDIA device plugin<a class="headerlink" href="#the-nvidia-device-plugin" title="Permanent link">&para;</a></h3>
<p>To enable NVIDIA GPU support on Kubernetes you also need to install the <a href="https://github.com/NVIDIA/k8s-device-plugin">NVIDIA device plugin</a>. The device plugin is a deamonset and allows you to automatically:</p>
<ul>
<li>Expose the number of GPUs on each nodes of your cluster</li>
<li>Keep track of the health of your GPUs</li>
<li>Run GPU enabled containers in your Kubernetes cluster.</li>
</ul>
<p><code>yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-device-plugin-daemonset
namespace: kube-system
spec:
selector:
matchLabels:
name: nvidia-device-plugin-ds
template:
metadata:
# Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
# reserves resources for critical add-on pods so that they can be rescheduled after
# a failure. This annotation works in tandem with the toleration below.
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: nvidia-device-plugin-ds
spec:
tolerations:
# Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
# This, along with the annotation above marks this pod as a critical add-on.
- key: CriticalAddonsOnly
operator: Exists
containers:
- env:
- name: DP_DISABLE_HEALTHCHECKS
value: xids
image: nvidia/k8s-device-plugin:1.11
name: nvidia-device-plugin-ctr
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop: ["ALL"]
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins</code></p>
<h3 id="build-the-k3s-image">Build the K3s image<a class="headerlink" href="#build-the-k3s-image" title="Permanent link">&para;</a></h3>
<p>To build the custom image we need to build K3s because we need the generated output.</p>
<p>Put the following files in a directory:</p>
<ul>
<li><a href="cuda/Dockerfile">Dockerfile</a></li>
<li><a href="config.toml.tmpl">config.toml.tmpl</a></li>
<li><a href="device-plugin-daemonset.yaml">device-plugin-daemonset.yaml</a></li>
<li><a href="build.sh">build.sh</a></li>
<li><a href="cuda-vector-add.yaml">cuda-vector-add.yaml</a></li>
</ul>
<p>The <code>build.sh</code> script is configured using exports &amp; defaults to <code>v1.21.2+k3s1</code>. Please set at least the <code>IMAGE_REGISTRY</code> variable! The script performs the following steps builds the custom K3s image including the nvidia drivers.</p>
<p><a href="build.sh">build.sh</a>:</p>
<p>```bash</p>
<h1 id="binbash">!/bin/bash<a class="headerlink" href="#binbash" title="Permanent link">&para;</a></h1>
<p>set -euxo pipefail</p>
<p>K3S_TAG=${K3S_TAG:=&rdquo;v1.21.2-k3s1&rdquo;} # replace + with -, if needed
IMAGE_REGISTRY=${IMAGE_REGISTRY:=&rdquo;MY_REGISTRY&rdquo;}
IMAGE_REPOSITORY=${IMAGE_REPOSITORY:=&rdquo;rancher/k3s&rdquo;}
IMAGE_TAG=&rdquo;$K3S_TAG-cuda&rdquo;
IMAGE=${IMAGE:=&rdquo;$IMAGE_REGISTRY/$IMAGE_REPOSITORY:$IMAGE_TAG&rdquo;}</p>
<p>NVIDIA_CONTAINER_RUNTIME_VERSION=${NVIDIA_CONTAINER_RUNTIME_VERSION:=&rdquo;3.5.0-1&rdquo;}</p>
<p>echo &ldquo;IMAGE=$IMAGE&rdquo;</p>
<h1 id="due-to-some-unknown-reason-copying-symlinks-fails-with-buildkit-enabled">due to some unknown reason, copying symlinks fails with buildkit enabled<a class="headerlink" href="#due-to-some-unknown-reason-copying-symlinks-fails-with-buildkit-enabled" title="Permanent link">&para;</a></h1>
<p>DOCKER_BUILDKIT=0 docker build \
&ndash;build-arg K3S_TAG=$K3S_TAG \
&ndash;build-arg NVIDIA_CONTAINER_RUNTIME_VERSION=$NVIDIA_CONTAINER_RUNTIME_VERSION \
-t $IMAGE .
docker push $IMAGE
echo &ldquo;Done!&rdquo;
```</p>
<h2 id="run-and-test-the-custom-image-with-k3d">Run and test the custom image with k3d<a class="headerlink" href="#run-and-test-the-custom-image-with-k3d" title="Permanent link">&para;</a></h2>
<p>You can use the image with k3d:</p>
<p><code>bash
k3d cluster create gputest --image=$IMAGE --gpus=1</code></p>
<p>Deploy a <a href="cuda-vector-add.yaml">test pod</a>:</p>
<p><code>bash
kubectl apply -f cuda-vector-add.yaml
kubectl logs cuda-vector-add</code></p>
<p>This should output something like the following:</p>
<p>```bash
$ kubectl logs cuda-vector-add</p>
<p>[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done
```</p>
<p>If the <code>cuda-vector-add</code> pod is stuck in <code>Pending</code> state, probably the device-driver daemonset didn&rsquo;t get deployed correctly from the auto-deploy manifests. In that case, you can apply it manually via `#!bash kubectl apply -f device-plugin-daemonset.yaml`.</p>
<h2 id="known-issues">Known issues<a class="headerlink" href="#known-issues" title="Permanent link">&para;</a></h2>
<ul>
<li>This approach does not work on WSL2 yet. The NVIDIA driver plugin and container runtime rely on the NVIDIA Management Library (NVML) which is not yet supported. See the <a href="https://docs.nvidia.com/cuda/wsl-user-guide/index.html#known-limitations">CUDA on WSL User Guide</a>.</li>
</ul>
<h2 id="acknowledgements">Acknowledgements<a class="headerlink" href="#acknowledgements" title="Permanent link">&para;</a></h2>
<p>Most of the information in this article was obtained from various sources:</p>
<ul>
<li><a href="https://dev.to/mweibel/add-nvidia-gpu-support-to-k3s-with-containerd-4j17">Add NVIDIA GPU support to k3s with containerd</a></li>
<li><a href="https://github.com/ubuntu/microk8s">microk8s</a></li>
<li><a href="https://github.com/rancher/k3s">K3s</a></li>
<li><a href="https://gitlab.com/vainkop1/k3s-gpu">k3s-gpu</a></li>
</ul>
<h2 id="authors">Authors<a class="headerlink" href="#authors" title="Permanent link">&para;</a></h2>
<ul>
<li><a href="https://github.com/markrexwinkel">@markrexwinkel</a></li>
<li><a href="https://github.com/vainkop">@vainkop</a></li>
<li><a href="https://github.com/iwilltry42">@iwilltry42</a></li>
</ul>
<hr>
<div class="md-source-file">
<small>
Last update:
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">September 17, 2021</span>
</small>
</div>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" data-md-state="hidden">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer">
<a href="../calico/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Use Calico instead of Flannel" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Use Calico instead of Flannel
</div>
</div>
</a>
<a href="../podman/" class="md-footer__link md-footer__link--next" aria-label="Next: Using Podman instead of Docker" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Using Podman instead of Docker
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2020-2022 k3d Authors
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.top", "search.suggest", "search.highlight", "navigation.expand", "navigation.tabs"], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "search": "../../../assets/javascripts/workers/search.5e67fbfe.min.js", "version": {"provider": "mike"}}</script>
<script src="../../../assets/javascripts/bundle.e87a5f81.min.js"></script>
<script src="../../../static/js/asciinema-player.js"></script>
</body>
</html>