diff --git a/.github/workflows/build-s2i-cuda-11.8.0.yaml b/.github/workflows/build-s2i-cuda-11.8.0.yaml index b81767b..6b06475 100644 --- a/.github/workflows/build-s2i-cuda-11.8.0.yaml +++ b/.github/workflows/build-s2i-cuda-11.8.0.yaml @@ -68,7 +68,7 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.github/workflows/build-udi-cuda-11.8.0.yaml b/.github/workflows/build-udi-cuda-11.8.0.yaml index 537e006..ebdd64c 100644 --- a/.github/workflows/build-udi-cuda-11.8.0.yaml +++ b/.github/workflows/build-udi-cuda-11.8.0.yaml @@ -66,7 +66,7 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.github/workflows/build-udi-cuda-12.x.yaml b/.github/workflows/build-udi-cuda-12.x.yaml index 9ce2e5a..b1d0333 100644 --- a/.github/workflows/build-udi-cuda-12.x.yaml +++ b/.github/workflows/build-udi-cuda-12.x.yaml @@ -66,7 +66,7 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.spellcheck.yaml b/.spellcheck.yaml new file mode 100644 index 0000000..a8258fa --- /dev/null +++ b/.spellcheck.yaml @@ -0,0 +1,22 @@ +matrix: + - name: Markdown + aspell: + lang: en + # ignore-case: true + dictionary: + encoding: utf-8 + wordlists: + - .wordlist-md + pipeline: + - pyspelling.filters.markdown: + - pyspelling.filters.html: + comments: false + attributes: + - title + - alt + ignores: + - code + - pre + sources: + - '**/*.md|!venv/**' + default_encoding: utf-8 diff --git a/.wordlist-md b/.wordlist-md new file mode 100644 index 0000000..8258a84 --- /dev/null +++ b/.wordlist-md @@ -0,0 +1,180 @@ +acac +Acyclic +allocatable +amd +api +APIs +apiVersion +arg +ArgoCD +artifactory +ARTIFACTORY +autoscaler +autoscaling +Autoscaling +aws +bd +bde +beaecd +bfa +bkoz +buildkit +Buildkit +cd +centos +cff +che +CheCluster +ci +CICD +config +CONFIG +CRD +cuda +Cuda +CUDA +CudaGL +CUDAGL +cudart +cudgl +cudnn +cuDNN +CUDNN +CVE +CVEs +dacaea +DCGM +debian +dev +Dev +devel +devfile +Devfile +devspaces +DevSpaces +devworkspace +dfea +distro +distros +DL +dn +Dockerfile +Dockerfiles +DockerHub +efa +Entrypoint +EOL +eustace +forseable +gb +ghcr +Gi +github +gitlab +Gitlab +gitops +GitOps +Globals +goto +GPL +gpu +GPUs +html +https +Infiniband +init +Init +io +jq +jsonpath +jupyter +Kitmaker +kubernetes +kustomization +Kustomization +kustomize +Kustomize +LD +le +libcudnn +libnccl +linux +md +mig +mins +MLOps +na +nccl +NCCL +nfd +NFD +ngc +NGC +NICs +nodeFeatureDiscovery +NodeResourceTopology +NUMA +nvcr +nvidia +OAuth +oc +ocp +OCP +OPENGL +openshift +Openshift +OpenShift +OpenSource +os +overidden +packagin +PCI +podman +ppc +py +pyenv +pytest +pytorch +Quickstart +rc +readme +Readme +README +readmes +redhat +redist +repo +Repo +repos +Repos +RHDP +rhel +rockylinux +runtimes +scalable +sclorg +sepecified +sha +ssa +subkeys +sunsetted +svc +sw +tensorflow +th +TLS +TODO +tolerations +traefik +txz +ubi +ubuntu +udi +UDI +unselect +urm +vCPU +vscode +WIP +workspaces +yaml diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..ed48218 --- /dev/null +++ b/.yamllint @@ -0,0 +1,24 @@ +extends: default + +rules: + document-start: disable + line-length: disable + comments-indentation: disable + new-line-at-end-of-file: disable + indentation: + indent-sequences: whatever + ignore: kludgeops/ + braces: + min-spaces-inside: 0 + max-spaces-inside: 1 + truthy: + ignore: .github/workflows/ + trailing-spaces: + ignore: | + # components/operators/openshift-gitops-operator/instance/overlays/default/patch-resource-customizations.yaml + empty-lines: + ignore: | + components/operators/ack-controllers/base/adoptedresources-crd.yaml + +ignore: + - "scratch/*" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ebfd829 --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ +# see https://github.com/mvanholsteijn/docker-makefile/blob/master/Makefile + +CONTAINER_CMD=podman +CONTAINER_BUILD_CONTEXT=. +CONTAINER_FILE_PATH=Dockerfile + +RUSER=redhat-na-ssa +REGISTRY=ghcr.io +VERSION=latest + +SHELL=/bin/bash + + +.PHONY: build + + +build: lint pre-build build-s2i-cuda-11 build-udi-cuda-11 build-udi-cuda-12 post-build + + +lint: venv lint-yaml lint-spellcheck + + +pre-build: + + +post-build: + + +main-build: + + +build-s2i-cuda-11: + cd containers/s2i-cuda/core; \ + $(CONTAINER_CMD) build \ + -t $(REGISTRY)/$(RUSER)/udi-cuda:11.8.0-cudnn8-runtime-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubi8 \ + $(CONTAINER_BUILD_CONTEXT) -f $(CONTAINER_FILE_PATH).rhel8 + +build-udi-cuda-11: + cd containers/udi-cuda/ubi8; \ + $(CONTAINER_CMD) build \ + -t $(REGISTRY)/$(RUSER)/udi-cuda:11.8.0-cudnn8-runtime-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubi8 \ + $(CONTAINER_BUILD_CONTEXT) -f $(CONTAINER_FILE_PATH) + + cd containers/udi-cuda/ubi8; \ + $(CONTAINER_CMD) build \ + -t $(REGISTRY)/$(RUSER)/udi-cuda:11.8.0-cudnn8-devel-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:11.8.0-cudnn8-devel-ubi8 \ + $(CONTAINER_BUILD_CONTEXT) -f $(CONTAINER_FILE_PATH) + +build-udi-cuda-12: + cd containers/udi-cuda/ubi8; \ + $(CONTAINER_CMD) build \ + -t $(REGISTRY)/$(RUSER)/udi-cuda:12.3.2-cudnn9-runtime-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.3.2-cudnn9-runtime-ubi8 \ + $(CONTAINER_BUILD_CONTEXT) -f $(CONTAINER_FILE_PATH) + + cd containers/udi-cuda/ubi8; \ + $(CONTAINER_CMD) build \ + -t $(REGISTRY)/$(RUSER)/udi-cuda:12.3.2-cudnn9-devel-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.3.2-cudnn9-devel-ubi8 \ + $(CONTAINER_BUILD_CONTEXT) -f $(CONTAINER_FILE_PATH) + + +push: + $(CONTAINER_CMD) push $(REGISTRY)/$(RUSER)/udi-cuda:$(VERSION) + $(CONTAINER_CMD) push $(REGISTRY)/$(RUSER)/udi-cuda:$(VERSION) + $(CONTAINER_CMD) push $(REGISTRY)/$(RUSER)/s2i-cuda:$(VERSION) + +lint-yaml: + $(VENV)/yamllint -c .yamllint . + +lint-spellcheck: + $(VENV)/pyspelling -c .spellcheck.yaml + +include Makefile.venv +Makefile.venv: + curl \ + -o Makefile.fetched \ + -L "https://github.com/sio/Makefile.venv/raw/v2022.07.20/Makefile.venv" + echo "147b164f0cbbbe4a2740dcca6c9adb6e9d8d15b895be3998697aa6a821a277d8 *Makefile.fetched" \ + | sha256sum --check - \ + && mv Makefile.fetched Makefile.venv diff --git a/Makefile.venv b/Makefile.venv new file mode 100644 index 0000000..c79b9bb --- /dev/null +++ b/Makefile.venv @@ -0,0 +1,274 @@ +# +# SEAMLESSLY MANAGE PYTHON VIRTUAL ENVIRONMENT WITH A MAKEFILE +# +# https://github.com/sio/Makefile.venv v2022.07.20 +# +# +# Insert `include Makefile.venv` at the bottom of your Makefile to enable these +# rules. +# +# When writing your Makefile use '$(VENV)/python' to refer to the Python +# interpreter within virtual environment and '$(VENV)/executablename' for any +# other executable in venv. +# +# This Makefile provides the following targets: +# venv +# Use this as a dependency for any target that requires virtual +# environment to be created and configured +# python, ipython +# Use these to launch interactive Python shell within virtual environment +# shell, bash, zsh +# Launch interactive command line shell. "shell" target launches the +# default shell Makefile executes its rules in (usually /bin/sh). +# "bash" and "zsh" can be used to refer to the specific desired shell. +# show-venv +# Show versions of Python and pip, and the path to the virtual environment +# clean-venv +# Remove virtual environment +# $(VENV)/executable_name +# Install `executable_name` with pip. Only packages with names matching +# the name of the corresponding executable are supported. +# Use this as a lightweight mechanism for development dependencies +# tracking. E.g. for one-off tools that are not required in every +# developer's environment, therefore are not included into +# requirements.txt or setup.py. +# Note: +# Rules using such target or dependency MUST be defined below +# `include` directive to make use of correct $(VENV) value. +# Example: +# codestyle: $(VENV)/pyflakes +# $(VENV)/pyflakes . +# See `ipython` target below for another example. +# +# This Makefile can be configured via following variables: +# PY +# Command name for system Python interpreter. It is used only initially to +# create the virtual environment +# Default: python3 +# REQUIREMENTS_TXT +# Space separated list of paths to requirements.txt files. +# Paths are resolved relative to current working directory. +# Default: requirements.txt +# +# Non-existent files are treated as hard dependencies, +# recipes for creating such files must be provided by the main Makefile. +# Providing empty value (REQUIREMENTS_TXT=) turns off processing of +# requirements.txt even when the file exists. +# SETUP_PY +# Space separated list of paths to setup.py files. +# Corresponding packages will be installed into venv in editable mode +# along with all their dependencies +# Default: setup.py +# +# Non-existent and empty values are treated in the same way as for REQUIREMENTS_TXT. +# WORKDIR +# Parent directory for the virtual environment. +# Default: current working directory. +# VENVDIR +# Python virtual environment directory. +# Default: $(WORKDIR)/.venv +# +# This Makefile was written for GNU Make and may not work with other make +# implementations. +# +# +# Copyright (c) 2019-2020 Vitaly Potyarkin +# +# Licensed under the Apache License, Version 2.0 +# +# + + +# +# Configuration variables +# + +WORKDIR?=. +VENVDIR?=$(WORKDIR)/.venv +REQUIREMENTS_TXT?=$(wildcard requirements.txt) # Multiple paths are supported (space separated) +SETUP_PY?=$(wildcard setup.py) # Multiple paths are supported (space separated) +SETUP_CFG?=$(foreach s,$(SETUP_PY),$(wildcard $(patsubst %setup.py,%setup.cfg,$(s)))) +MARKER=.initialized-with-Makefile.venv + + +# +# Python interpreter detection +# + +_PY_AUTODETECT_MSG=Detected Python interpreter: $(PY). Use PY environment variable to override + +ifeq (ok,$(shell test -e /dev/null 2>&1 && echo ok)) +NULL_STDERR=2>/dev/null +else +NULL_STDERR=2>NUL +endif + +ifndef PY +_PY_OPTION:=python3 +ifeq (ok,$(shell $(_PY_OPTION) -c "print('ok')" $(NULL_STDERR))) +PY=$(_PY_OPTION) +endif +endif + +ifndef PY +_PY_OPTION:=$(VENVDIR)/bin/python +ifeq (ok,$(shell $(_PY_OPTION) -c "print('ok')" $(NULL_STDERR))) +PY=$(_PY_OPTION) +$(info $(_PY_AUTODETECT_MSG)) +endif +endif + +ifndef PY +_PY_OPTION:=$(subst /,\,$(VENVDIR)/Scripts/python) +ifeq (ok,$(shell $(_PY_OPTION) -c "print('ok')" $(NULL_STDERR))) +PY=$(_PY_OPTION) +$(info $(_PY_AUTODETECT_MSG)) +endif +endif + +ifndef PY +_PY_OPTION:=py -3 +ifeq (ok,$(shell $(_PY_OPTION) -c "print('ok')" $(NULL_STDERR))) +PY=$(_PY_OPTION) +$(info $(_PY_AUTODETECT_MSG)) +endif +endif + +ifndef PY +_PY_OPTION:=python +ifeq (ok,$(shell $(_PY_OPTION) -c "print('ok')" $(NULL_STDERR))) +PY=$(_PY_OPTION) +$(info $(_PY_AUTODETECT_MSG)) +endif +endif + +ifndef PY +define _PY_AUTODETECT_ERR +Could not detect Python interpreter automatically. +Please specify path to interpreter via PY environment variable. +endef +$(error $(_PY_AUTODETECT_ERR)) +endif + + +# +# Internal variable resolution +# + +VENV=$(VENVDIR)/bin +EXE= +# Detect windows +ifeq (win32,$(shell $(PY) -c "import __future__, sys; print(sys.platform)")) +VENV=$(VENVDIR)/Scripts +EXE=.exe +endif + +touch=touch $(1) +ifeq (,$(shell command -v touch $(NULL_STDERR))) +# https://ss64.com/nt/touch.html +touch=type nul >> $(subst /,\,$(1)) && copy /y /b $(subst /,\,$(1))+,, $(subst /,\,$(1)) +endif + +RM?=rm -f +ifeq (,$(shell command -v $(firstword $(RM)) $(NULL_STDERR))) +RMDIR:=rd /s /q +else +RMDIR:=$(RM) -r +endif + + +# +# Virtual environment +# + +.PHONY: venv +venv: $(VENV)/$(MARKER) + +.PHONY: clean-venv +clean-venv: + -$(RMDIR) "$(VENVDIR)" + +.PHONY: show-venv +show-venv: venv + @$(VENV)/python -c "import sys; print('Python ' + sys.version.replace('\n',''))" + @$(VENV)/pip --version + @echo venv: $(VENVDIR) + +.PHONY: debug-venv +debug-venv: + @echo "PATH (Shell)=$$PATH" + @$(MAKE) --version + $(info PATH (GNU Make)="$(PATH)") + $(info SHELL="$(SHELL)") + $(info PY="$(PY)") + $(info REQUIREMENTS_TXT="$(REQUIREMENTS_TXT)") + $(info SETUP_PY="$(SETUP_PY)") + $(info SETUP_CFG="$(SETUP_CFG)") + $(info VENVDIR="$(VENVDIR)") + $(info VENVDEPENDS="$(VENVDEPENDS)") + $(info WORKDIR="$(WORKDIR)") + + +# +# Dependencies +# + +ifneq ($(strip $(REQUIREMENTS_TXT)),) +VENVDEPENDS+=$(REQUIREMENTS_TXT) +endif + +ifneq ($(strip $(SETUP_PY)),) +VENVDEPENDS+=$(SETUP_PY) +endif +ifneq ($(strip $(SETUP_CFG)),) +VENVDEPENDS+=$(SETUP_CFG) +endif + +$(VENV): + $(PY) -m venv $(VENVDIR) + $(VENV)/python -m pip install --upgrade pip setuptools wheel + +$(VENV)/$(MARKER): $(VENVDEPENDS) | $(VENV) +ifneq ($(strip $(REQUIREMENTS_TXT)),) + $(VENV)/pip install $(foreach path,$(REQUIREMENTS_TXT),-r $(path)) +endif +ifneq ($(strip $(SETUP_PY)),) + $(VENV)/pip install $(foreach path,$(SETUP_PY),-e $(dir $(path))) +endif + $(call touch,$(VENV)/$(MARKER)) + + +# +# Interactive shells +# + +.PHONY: python +python: venv + exec $(VENV)/python + +.PHONY: ipython +ipython: $(VENV)/ipython + exec $(VENV)/ipython + +.PHONY: shell +shell: venv + . $(VENV)/activate && exec $(notdir $(SHELL)) + +.PHONY: bash zsh +bash zsh: venv + . $(VENV)/activate && exec $@ + + +# +# Commandline tools (wildcard rule, executable name must match package name) +# + +ifneq ($(EXE),) +$(VENV)/%: $(VENV)/%$(EXE) ; +.PHONY: $(VENV)/% +.PRECIOUS: $(VENV)/%$(EXE) +endif + +$(VENV)/%$(EXE): $(VENV)/$(MARKER) + $(VENV)/pip install --upgrade $* + $(call touch,$@) diff --git a/components/operators/gpu-operator-certified/instance/overlays/mig-mixed/kustomization.yaml b/components/operators/gpu-operator-certified/instance/overlays/mig-mixed/kustomization.yaml index 24ad359..5abb963 100644 --- a/components/operators/gpu-operator-certified/instance/overlays/mig-mixed/kustomization.yaml +++ b/components/operators/gpu-operator-certified/instance/overlays/mig-mixed/kustomization.yaml @@ -11,4 +11,4 @@ patches: patch: |- - op: add path: /spec/mig/strategy - value: mixed \ No newline at end of file + value: mixed diff --git a/containers/s2i-cuda/common b/containers/s2i-cuda/common deleted file mode 160000 index c5d8cea..0000000 --- a/containers/s2i-cuda/common +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c5d8cea9e87098e4966d101cb7033aa5ae8a318e diff --git a/containers/udi-cuda/README.md b/containers/udi-cuda/README.md index cd2839c..cfeede3 100644 --- a/containers/udi-cuda/README.md +++ b/containers/udi-cuda/README.md @@ -23,13 +23,13 @@ podman build . \ # local build - runtime podman build . \ - -t udi-cuda:12.2.0-runtime-ubi8 \ - --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.2.0-runtime-ubi8 + -t udi-cuda:12.3.2-cudnn9-runtime-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.3.2-cudnn9-runtime-ubi8 # local build - devel podman build . \ - -t udi-cuda:12.2.0-devel-ubi8 \ - --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.2.0-devel-ubi8 + -t udi-cuda:12.3.2-cudnn9-devel-ubi8 \ + --build-arg IMAGE_NAME=docker.io/nvidia/cuda:12.3.2-cudnn9-devel-ubi8 ``` ## Links diff --git a/dictionary.dic b/dictionary.dic new file mode 100644 index 0000000..aafc7d4 Binary files /dev/null and b/dictionary.dic differ diff --git a/notebooks/00-test-gpu-tensorflow.ipynb b/notebooks/00-test-gpu-tensorflow.ipynb index 7f00a5b..052eb29 100644 --- a/notebooks/00-test-gpu-tensorflow.ipynb +++ b/notebooks/00-test-gpu-tensorflow.ipynb @@ -21,7 +21,7 @@ "outputs": [], "source": [ "! nvidia-smi\n", - "! pip install tensorflow nvidia-cudnn-cu11" + "! pip install tensorflow[and-cuda]" ] }, { diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d449a3d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +yamllint +pyspelling