diff --git a/roles/nvidia_dcgm/defaults/main.yml b/roles/nvidia_dcgm/defaults/main.yml index 087cf9c0c..7b7e24b98 100644 --- a/roles/nvidia_dcgm/defaults/main.yml +++ b/roles/nvidia_dcgm/defaults/main.yml @@ -1,6 +1,15 @@ --- dcgm_pkg_name: "datacenter-gpu-manager" +# DGX OS ships its own DCGM and the package name differs per release. +# install-dgx.yml converges on this package and removes the other series. +dcgm_dgx_pkg_map: + "18.04": "datacenter-gpu-manager" # DGX OS 4 + "20.04": "datacenter-gpu-manager" # DGX OS 5 + "22.04": "datacenter-gpu-manager" # DGX OS 6 + "24.04": "datacenter-gpu-manager-4-cuda13" # DGX OS 7 +dcgm_dgx_pkg_name: "{{ dcgm_dgx_pkg_map[ansible_distribution_version] | default('') }}" + # RedHat family epel_package: "https://dl.fedoraproject.org/pub/epel/epel-release-latest-{{ ansible_distribution_major_version }}.noarch.rpm" epel_key_url: "https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-{{ ansible_distribution_major_version }}" diff --git a/roles/nvidia_dcgm/tasks/install-dgx.yml b/roles/nvidia_dcgm/tasks/install-dgx.yml index 0d512b3e7..74d09a794 100644 --- a/roles/nvidia_dcgm/tasks/install-dgx.yml +++ b/roles/nvidia_dcgm/tasks/install-dgx.yml @@ -1,5 +1,37 @@ --- -- name: install DCGM from repos +# DGX OS ships its own DCGM (4.x on DGX OS 7). Never replace it with the +# unversioned 3.x metapackage from the CUDA repo; converge on the package +# DGX OS expects and remove packages from the other series first. +- name: gather package facts + package_facts: + manager: auto + +- name: fail when this DGX OS release has no known DCGM package + fail: + msg: >- + No DCGM package is mapped for {{ ansible_distribution }} + {{ ansible_distribution_version }} on DGX; set dcgm_dgx_pkg_name to + the package shipped by this DGX OS release. + when: dcgm_dgx_pkg_name | length == 0 + +- name: collect installed DCGM packages from the other series + set_fact: + dcgm_dgx_conflicting_pkgs: >- + {{ (_dcgm_installed | reject('match', _dcgm_v4_re) | list) + if (dcgm_dgx_pkg_name is match(_dcgm_v4_re)) + else (_dcgm_installed | select('match', _dcgm_v4_re) | list) }} + vars: + _dcgm_installed: "{{ ansible_facts.packages | select('match', '^datacenter-gpu-manager') | list }}" + _dcgm_v4_re: '^datacenter-gpu-manager-4(-|$)' + +- name: remove DCGM packages from the other series package: - name: "datacenter-gpu-manager" + name: "{{ dcgm_dgx_conflicting_pkgs }}" + state: absent + when: dcgm_dgx_conflicting_pkgs | length > 0 + +- name: install the DCGM package shipped by DGX OS + package: + name: "{{ dcgm_dgx_pkg_name }}" state: present + when: dcgm_dgx_pkg_name not in ansible_facts.packages