AMDGPU power/clock control with custom 'tuned' profiles
Find a file
2022-11-03 20:04:59 -05:00
group_vars move some rudimentary unit conversion vars from play to group_vars/all 2022-06-07 19:50:50 -05:00
host_vars make card# assignment dynamic, clean up linting 2022-11-03 20:04:59 -05:00
inventories make card# assignment dynamic, clean up linting 2022-11-03 20:04:59 -05:00
templates make card# assignment dynamic, clean up linting 2022-11-03 20:04:59 -05:00
.gitignore ignore vim swp files 2022-06-07 19:50:15 -05:00
ansible.cfg disable cowsay output 2022-06-07 19:50:25 -05:00
LICENSE Initial commit 2022-06-07 19:42:16 -05:00
playbook.yml make card# assignment dynamic, clean up linting 2022-11-03 20:04:59 -05:00
README.md move vars to a table 2022-08-03 03:05:18 -05:00

tuned-amdgpu

Hacky solution to integrate AMDGPU power profile control in tuned with Ansible

Takes a list of existing tuned profiles and creates new ones based on them. These new profiles include AMDGPU power/clock parameters

Warning: Only tested with RX6000 series GPUs, it is probable that older AMD GPUs will not work properly. Use at your own risk!

Profiles

An example of the output/provided profiles follow

Output profile Description
balanced-amdgpu-default Includes the (assumed) existing balanced tuned profile.

Only adjusts the GPU power limit (typically lower). Clocks/voltage curve remain the default.
desktop-amdgpu-VR Includes the (assumed) existing desktop tuned profile.

Adjusts the GPU power limit, clocks, and the voltage curve.

Uses the predefined VR profile in the driver. See /sys/class/drm/card*/device/pp_power_profile_mode
latency-performance-amdgpu-custom Includes the existing latency-performance tuned profile.

Like the existing GPU profiles (eg: _VR)), this also adjusts the GPU power limit, clocks, and the voltage curve.

This differs by using the custom profile in the driver. This opens up further tweaking of the power/clock heuristics through the driver (currently manual). see: pp-dpm

Note: This is non-exhaustive, see the variables base_profiles and amdgpu_profiles below for the (default) sources of the merged profile mapping

Notable variables

These are the variables you're likely to want to change. They are defined in playbook.yml

Variable Description Default
power_max_default_multi Must be a float.

Sets the AMD GPU power limit for the newly-created amdgpu-default GPU profiles in tuned.

A multiplier against the board power capability
0.928793 or ~93%, provides roughly 300W from my 323W board capability.
power_max_custom_multi Same as above but for the non-default amdgpu profiles in tuned. eg: ...-amdgpu-{VR,custom} 0.82 or 82%, my 6900XT defaults to ~87% -- allowing for slightly less power
gpu_clock_min Sets the minimum (dynamic) GPU clock for the non-default amdgpu profiles 2000, results in 2Ghz
gpu_clock_max Sets the maximum (dynamic) GPU clock for the non-default amdgpu profiles 2615, results in 2.62Ghz (rounded) -- mild overclock
gpumem_clock_max Sets the static memory clock for the GPU. This is not the effective data rate. That is a multiple of this depending on the type of VRAM.

To avoid flickering this does not change dynamically with load.
1075, results in 1.1Ghz (base, rounded)
card Set the card# for the card to use.

For a hint if this needs changed:
ls -lad /sys/class/drm/card[0-9]*
card0 -- assumes the first GPU
gpu_mv_offset GPU core voltage offset. Takes +/- some integer in millivolts. Can be used to both over and under volt. -25 (undervolt 25mV or 0.025V)
base_profiles List of base tuned profiles to clone in the new AMDGPU profiles. Defaults based on Fedora
  • balanced
  • desktop
  • latency-performance
  • network-latency
  • network-throughput
  • powersave
  • virtual-host
amdgpu_profiles Dictionary mapping the AMDGPU power profiles found in /sys/class/drm/card*/device/pp_power_profile_mode.

Allows adjustment to the automatic power/clock handling in the GPU using either predefined profiles or custom

More may be added, only three GPU power profiles are provided -- default, VR, and custom.
default:
pwrmode: 0
VR:
pwrmode: 4
custom:
pwrmode: 6