DEG-5B-E2B-1019 / source /tests /conftest.py
gcoderw's picture
DEG-5B-E2B-1019 v0.2 (multimodal)
f8dbde1 verified
Raw History Blame Contribute Delete
2.03 kB
"""Shared test setup.
HF's Qwen3.5 / LFM2 models dispatch their causal depthwise conv to the ``causal_conv1d``
hub kernel whenever that package is installed; it is CUDA-only, so the HF reference
forwards the CPU tests compare against would fail on CPU tensors. CPU calls take HF's
own pure-torch fallback (the same arithmetic); CUDA calls keep the kernel.
"""
from __future__ import annotations
import pytest
def _cpu_fallbacks(monkeypatch) -> None:
import torch
import torch.nn.functional as F
def conv_fn(x, weight, bias=None, activation=None, **_):
out = F.conv1d(x.to(weight.dtype), weight.unsqueeze(1), bias,
padding=weight.shape[-1] - 1, groups=x.shape[1])[:, :, :x.shape[-1]]
return (F.silu(out) if activation else out).to(x.dtype)
def conv_update(x, conv_state, weight, bias=None, activation=None):
state_len = conv_state.shape[-1]
cat = torch.cat([conv_state, x], -1).to(weight.dtype)
conv_state.copy_(cat[:, :, -state_len:])
out = F.conv1d(cat, weight.unsqueeze(1), bias, groups=x.shape[1])[:, :, -x.shape[-1]:]
return (F.silu(out) if activation else out).to(x.dtype)
for mod_name in ("transformers.models.qwen3_5.modeling_qwen3_5",
"transformers.models.lfm2.modeling_lfm2"):
try:
mod = __import__(mod_name, fromlist=["_"])
except ImportError:
continue
for name, ref in (("causal_conv1d_fn", conv_fn), ("causal_conv1d_update", conv_update)):
orig = getattr(mod, name, None)
if orig is None:
continue
def wrapped(x, *a, _orig=orig, _ref=ref, **kw):
return _orig(x, *a, **kw) if x.is_cuda else _ref(x, *a, **kw)
monkeypatch.setattr(mod, name, wrapped)
@pytest.fixture(autouse=True)
def _hf_conv_cpu_fallback(monkeypatch):
try:
import torch # noqa: F401
except ImportError:
yield
return
_cpu_fallbacks(monkeypatch)
yield