import gradio as gr import installer from modules import scripts_manager, shared # rocm_mgr exposes package-internal helpers (prefixed _) that are intentionally called here # pylint: disable=protected-access class ROCmScript(scripts_manager.Script): def title(self): return "ROCm: Advanced Config" def show(self, _is_img2img): if shared.cmd_opts.use_rocm or installer.torch_info.get('type') == 'rocm': return scripts_manager.AlwaysVisible # script should be visible only if rocm is detected or forced return False def ui(self, _is_img2img): if not shared.cmd_opts.use_rocm and not installer.torch_info.get('type') == 'rocm': # skip ui creation if not rocm return [] from scripts.rocm import rocm_mgr, rocm_vars, rocm_profiles # pylint: disable=no-name-in-module config = rocm_mgr.load_config() var_names = [] components = [] def _make_component(name, meta, cfg): val = cfg.get(name, meta["default"]) widget = meta["widget"] if widget == "checkbox": dtype_tag = meta.get("dtype") label = f"[{dtype_tag}] {meta['desc']}" if dtype_tag else meta["desc"] return gr.Checkbox(label=label, value=(val == "1"), elem_id=f"rocm_var_{name.lower()}") if widget == "dropdown": choices = rocm_mgr._dropdown_choices(meta["options"]) display = rocm_mgr._dropdown_display(val, meta["options"]) return gr.Dropdown(label=meta["desc"], choices=choices, value=display, elem_id=f"rocm_var_{name.lower()}") return gr.Textbox(label=meta["desc"], value=rocm_mgr._expand_venv(val), lines=1) def _info_html(): d = rocm_mgr.info() rows = [] def section(title): rows.append(f"{title}") def row(k, v): rows.append(f"{k}{v}") section("ROCm / HIP") for k, v in d.get("rocm", {}).items(): row(k, v) section("System DB") sdb = d.get("system_db", {}) row("path", sdb.get("path", "")) for sub in ("solver_db", "find_db", "kernel_db"): for fname, sz in sdb.get(sub, {}).items(): row(sub.replace("_", " "), f"{fname}   {sz}") section("User DB (~/.miopen/db)") udb = d.get("user_db", {}) row("path", udb.get("path", "")) for fname, finfo in udb.get("files", {}).items(): row(fname, finfo) section("User cache (~/.miopen/cache)") ucache = d.get("user_cache", {}) row("path", ucache.get("path", "")) for fname, sz in ucache.get("files", {}).items(): row(fname, sz) return f"{''.join(rows)}
" def _build_style(unavailable, hipblaslt_disabled=False): rules = [] for v in (unavailable or []): rules.append(f"#rocm_var_{v.lower()} label {{ text-decoration: line-through; opacity: 0.5; }}") if hipblaslt_disabled: for v in rocm_vars.HIPBLASLT_VARS: rules.append(f"#rocm_var_{v.lower()} {{ opacity: 0.45; pointer-events: none; }}") return f"" if rules else "" with gr.Accordion('ROCm: Advanced Config', open=False, elem_id='rocm_config'): with gr.Row(): gr.HTML("

Advanced configuration for ROCm users.


For best performance ensure that cudnn and torch tunable ops are set to default in Backend Settings.

") with gr.Row(): btn_info = gr.Button("Refresh Info", variant="primary", elem_id="rocm_btn_info", size="sm") btn_apply = gr.Button("Apply", variant="primary", elem_id="rocm_btn_apply", size="sm") btn_reset = gr.Button("Defaults", elem_id="rocm_btn_reset", size="sm") btn_clear = gr.Button("Clear Run Vars", elem_id="rocm_btn_clear", size="sm") btn_delete = gr.Button("Delete UserDb", variant="stop", elem_id="rocm_btn_delete", size="sm") with gr.Row(): btn_rdna2 = gr.Button("RDNA2 (RX 6000)", elem_id="rocm_btn_rdna2") btn_rdna3 = gr.Button("RDNA3 (RX 7000)", elem_id="rocm_btn_rdna3") btn_rdna4 = gr.Button("RDNA4 (RX 9000)", elem_id="rocm_btn_rdna4") _init_gemm = config.get("MIOPEN_GEMM_ENFORCE_BACKEND", "1") _init_arch = config.get(rocm_mgr._ARCH_KEY, "") _init_unavailable = rocm_profiles.UNAVAILABLE.get(_init_arch, set()) if _init_arch else set() style_out = gr.HTML(_build_style(_init_unavailable, _init_gemm == "1")) info_out = gr.HTML(value=_info_html, elem_id="rocm_info_table") # General vars (dropdowns, textboxes, checkboxes) with gr.Group(): gr.HTML("

MIOpen Settings


") for name, meta in rocm_vars.GENERAL_VARS.items(): comp = _make_component(name, meta, config) var_names.append(name) components.append(comp) # Solver groups (all checkboxes, grouped by section) for group_name, varlist in rocm_vars.SOLVER_GROUPS: with gr.Group(): gr.HTML(f"

{group_name}


") for name in varlist: meta = rocm_vars.ROCM_ENV_VARS[name] comp = _make_component(name, meta, config) var_names.append(name) components.append(comp) gr.HTML("
📄 MIOpen Environment Variables Reference

") def _autosave_field(name, value): meta = rocm_vars.ROCM_ENV_VARS[name] stored = rocm_mgr._dropdown_stored(str(value), meta["options"]) cfg = rocm_mgr.load_config() cfg[name] = stored rocm_mgr.save_config(cfg) rocm_mgr.apply_env(cfg) for name, comp in zip(var_names, components): meta = rocm_vars.ROCM_ENV_VARS[name] if meta["widget"] == "dropdown" and name != "MIOPEN_GEMM_ENFORCE_BACKEND": comp.change(fn=lambda v, n=name: _autosave_field(n, v), inputs=[comp], outputs=[], show_progress='hidden') _GEMM_COMPANIONS = { "PYTORCH_ROCM_USE_ROCBLAS": {"1": "1", "5": "0"}, "PYTORCH_HIPBLASLT_DISABLE": {"1": "1", "5": "0"}, "ROCBLAS_USE_HIPBLASLT": {"1": "0", "5": "1"}, "PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED": {"1": "0", "5": "1"}, } def gemm_changed(gemm_display_val): stored = rocm_mgr._dropdown_stored(str(gemm_display_val), rocm_vars.ROCM_ENV_VARS["MIOPEN_GEMM_ENFORCE_BACKEND"]["options"]) cfg = rocm_mgr.load_config().copy() cfg["MIOPEN_GEMM_ENFORCE_BACKEND"] = stored for var, vals in _GEMM_COMPANIONS.items(): cfg[var] = vals.get(stored, cfg.get(var, "")) rocm_mgr.save_config(cfg) rocm_mgr.apply_env(cfg) arch = cfg.get(rocm_mgr._ARCH_KEY, "") unavailable = rocm_profiles.UNAVAILABLE.get(arch, set()) result = [gr.update(value=_build_style(unavailable, stored == "1"))] for pname in var_names: if pname in _GEMM_COMPANIONS: meta = rocm_vars.ROCM_ENV_VARS[pname] val = _GEMM_COMPANIONS[pname].get(stored, cfg.get(pname, "")) result.append(gr.update(value=rocm_mgr._dropdown_display(val, meta["options"]))) else: result.append(gr.update()) return result gemm_comp = components[var_names.index("MIOPEN_GEMM_ENFORCE_BACKEND")] gemm_comp.change(fn=gemm_changed, inputs=[gemm_comp], outputs=[style_out] + components, show_progress='hidden') def apply_fn(*values): rocm_mgr.apply_all(var_names, list(values)) saved = rocm_mgr.load_config() arch = saved.get(rocm_mgr._ARCH_KEY, "") unavailable = rocm_profiles.UNAVAILABLE.get(arch, set()) gemm_val = saved.get("MIOPEN_GEMM_ENFORCE_BACKEND", "1") result = [gr.update(value=_build_style(unavailable, gemm_val == "1"))] for name in var_names: meta = rocm_vars.ROCM_ENV_VARS[name] val = saved.get(name, meta["default"]) if meta["widget"] == "checkbox": result.append(gr.update(value=val == "1")) elif meta["widget"] == "dropdown": result.append(gr.update(value=rocm_mgr._dropdown_display(val, meta["options"]))) else: result.append(gr.update(value=rocm_mgr._expand_venv(val))) return result def reset_fn(): rocm_mgr.reset_defaults() updated = rocm_mgr.load_config() arch = updated.get(rocm_mgr._ARCH_KEY, "") unavailable = rocm_profiles.UNAVAILABLE.get(arch, set()) gemm_val = updated.get("MIOPEN_GEMM_ENFORCE_BACKEND", "1") result = [gr.update(value=_build_style(unavailable, gemm_val == "1"))] for name in var_names: meta = rocm_vars.ROCM_ENV_VARS[name] val = updated.get(name, meta["default"]) if meta["widget"] == "checkbox": result.append(gr.update(value=val == "1")) elif meta["widget"] == "dropdown": result.append(gr.update(value=rocm_mgr._dropdown_display(val, meta["options"]))) else: result.append(gr.update(value=rocm_mgr._expand_venv(val))) return result def clear_fn(): rocm_mgr.clear_env() cfg = rocm_mgr.load_config() gemm_val = cfg.get("MIOPEN_GEMM_ENFORCE_BACKEND", "1") result = [gr.update(value=_build_style(None, gemm_val == "1"))] for name in var_names: meta = rocm_vars.ROCM_ENV_VARS[name] if meta["widget"] == "checkbox": result.append(gr.update(value=False)) elif meta["widget"] == "dropdown": result.append(gr.update(value=rocm_mgr._dropdown_display(meta["default"], meta["options"]))) else: result.append(gr.update(value="")) return result def delete_fn(): rocm_mgr.delete_config() gemm_default = rocm_vars.ROCM_ENV_VARS.get("MIOPEN_GEMM_ENFORCE_BACKEND", {}).get("default", "1") result = [gr.update(value=_build_style(None, gemm_default == "1"))] for name in var_names: meta = rocm_vars.ROCM_ENV_VARS[name] if meta["widget"] == "checkbox": result.append(gr.update(value=False)) elif meta["widget"] == "dropdown": result.append(gr.update(value=rocm_mgr._dropdown_display(meta["default"], meta["options"]))) else: result.append(gr.update(value="")) return result def profile_fn(arch): rocm_mgr.apply_profile(arch) updated = rocm_mgr.load_config() unavailable = rocm_profiles.UNAVAILABLE.get(arch, set()) gemm_val = updated.get("MIOPEN_GEMM_ENFORCE_BACKEND", "1") result = [gr.update(value=_build_style(unavailable, gemm_val == "1"))] for pname in var_names: meta = rocm_vars.ROCM_ENV_VARS[pname] val = updated.get(pname, meta["default"]) if meta["widget"] == "checkbox": result.append(gr.update(value=val == "1")) elif meta["widget"] == "dropdown": result.append(gr.update(value=rocm_mgr._dropdown_display(val, meta["options"]))) else: result.append(gr.update(value=rocm_mgr._expand_venv(val))) return result btn_info.click(fn=_info_html, inputs=[], outputs=[info_out], show_progress='hidden') btn_apply.click(fn=apply_fn, inputs=components, outputs=[style_out] + components, show_progress='hidden') btn_reset.click(fn=reset_fn, inputs=[], outputs=[style_out] + components, show_progress='hidden') btn_clear.click(fn=clear_fn, inputs=[], outputs=[style_out] + components, show_progress='hidden') btn_delete.click(fn=delete_fn, inputs=[], outputs=[style_out] + components, show_progress='hidden') btn_rdna2.click(fn=lambda: profile_fn("RDNA2"), inputs=[], outputs=[style_out] + components, show_progress='hidden') btn_rdna3.click(fn=lambda: profile_fn("RDNA3"), inputs=[], outputs=[style_out] + components, show_progress='hidden') btn_rdna4.click(fn=lambda: profile_fn("RDNA4"), inputs=[], outputs=[style_out] + components, show_progress='hidden') return components