Coerce TRL's tuple-cached _*_available flags to bool (#5129)
transformers >= 4.48's `_is_package_available(name)` returns a tuple `(bool, version_or_None)`. TRL's `trl.import_utils` caches that tuple directly in `_vllm_ascend_available`, `_llm_blender_available`, `_deepspeed_available`, `_joblib_available`, etc. and the matching `is_*_available()` accessors return the tuple unchanged. A non-empty tuple is always truthy, so `if is_vllm_ascend_available():` (in `trl/extras/vllm_client.py`) fires unconditionally and triggers `from vllm_ascend.distributed.device_communicators.pyhccl import ...`, which fails outside Huawei Ascend hosts and blocks `from trl import GRPOConfig, GRPOTrainer`. The same shape blocks `is_llm_blender_available()` -> `import llm_blender` in `trl/trainer/judges.py`. Add `fix_trl_vllm_ascend()` to `import_fixes.py` and call it from `unsloth/__init__.py` before any `from .trainer import *` that would eagerly `import trl`. The fix walks `trl.import_utils` once and coerces every `_*_available` tuple to a bool; the existing accessors that just return the cached value then naturally yield a bool and the `if` checks behave.
This commit is contained in:
parent
92cee0ff3e
commit
7ef8cde3c2
2 changed files with 29 additions and 0 deletions
|
|
@ -137,6 +137,7 @@ from .import_fixes import (
|
|||
fix_vllm_aimv2_issue,
|
||||
check_vllm_torch_sm100_compatibility,
|
||||
fix_vllm_guided_decoding_params,
|
||||
fix_trl_vllm_ascend,
|
||||
fix_vllm_pdl_blackwell,
|
||||
fix_triton_compiled_kernel_missing_attrs,
|
||||
patch_trunc_normal_precision_issue,
|
||||
|
|
@ -159,6 +160,7 @@ fix_vllm_aimv2_issue()
|
|||
# Check vLLM + torch < 2.9.0 + SM100 compatibility BEFORE importing vLLM
|
||||
check_vllm_torch_sm100_compatibility()
|
||||
fix_vllm_guided_decoding_params()
|
||||
fix_trl_vllm_ascend()
|
||||
fix_vllm_pdl_blackwell()
|
||||
fix_triton_compiled_kernel_missing_attrs()
|
||||
patch_trunc_normal_precision_issue()
|
||||
|
|
@ -179,6 +181,7 @@ del fix_xformers_performance_issue
|
|||
del fix_vllm_aimv2_issue
|
||||
del check_vllm_torch_sm100_compatibility
|
||||
del fix_vllm_guided_decoding_params
|
||||
del fix_trl_vllm_ascend
|
||||
del fix_vllm_pdl_blackwell
|
||||
del fix_triton_compiled_kernel_missing_attrs
|
||||
del patch_trunc_normal_precision_issue
|
||||
|
|
|
|||
|
|
@ -489,6 +489,32 @@ def fix_vllm_guided_decoding_params():
|
|||
)
|
||||
|
||||
|
||||
def fix_trl_vllm_ascend():
|
||||
# transformers >= 4.48's `_is_package_available(name)` returns a tuple
|
||||
# (bool, version_or_None). TRL caches that tuple in module-level
|
||||
# `_*_available` flags and the matching `is_*_available()` accessors
|
||||
# return the tuple directly. A non-empty tuple is always truthy, so
|
||||
# `if is_X_available():` fires even when X is absent, triggering an
|
||||
# unconditional `import X` that fails. The surfaced case is
|
||||
# `vllm_ascend` (blocks `from trl import GRPOConfig, GRPOTrainer`
|
||||
# outside Huawei Ascend hosts); `llm_blender`, `deepspeed`, `joblib`
|
||||
# share the same shape. Coerce every tuple-cached flag in
|
||||
# trl.import_utils to bool; the existing accessors that just return
|
||||
# the cached value then naturally yield a bool.
|
||||
if importlib.util.find_spec("trl") is None:
|
||||
return
|
||||
try:
|
||||
import trl.import_utils as tiu
|
||||
except Exception:
|
||||
return
|
||||
for attr in list(vars(tiu)):
|
||||
if not (attr.startswith("_") and attr.endswith("_available")):
|
||||
continue
|
||||
cached = getattr(tiu, attr)
|
||||
if isinstance(cached, tuple):
|
||||
setattr(tiu, attr, bool(cached and cached[0]))
|
||||
|
||||
|
||||
def ignore_logger_messages():
|
||||
# Ignore Environment variable `HF_TOKEN` is set
|
||||
try:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue