Files
project_6/ixformer_sdk/contrib/DeepCache/ddpm/ddim.py
project6-dev 87a19d2d00 feat(CRITICAL): 从 GitHub 扫描搬运 ixformer SDK + xllm 完整 GDN/MoE 代码
来源:
  1. Chranos/ixformer (GitHub) → ixformer_sdk/ (230 files, 70K lines)
     - inference/functions/vllm.py: vllm_moe_topk_softmax 完整实现 (2033 lines)
     - inference/functions/moe.py: MoE ops 完整实现 (1380 lines)
     - contrib/vllm_flash_attn/: FA2 Python 接口 (1018 lines)
     - contrib/tgi/fused_moe.py: TGI fused MoE (429 lines)
     - csrc/include/ixformer/: C++ kernel headers + cmake

  2. Deep-Spark/xllm (GitHub) → upstream_ref/xllm_latest/ (+15 files)
     - npu_torch/qwen3_5_decoder_layer_impl.cpp/.h
     - npu_torch/qwen3_5_gated_delta_net.cpp/.h
     - npu_torch/qwen3_next_*.cpp/.h (6 files)
     - npu_torch/attention.cpp/.h + fused_moe.cpp/.h + CMakeLists.txt
     - models/llm/qwen3_5.h + qwen3_5_mtp.h + qwen3_next.h
     - models/vlm/qwen3_5.h

调用链完整性:
  ixformer_sdk/inference/functions/vllm.py
    → ops.infer.moe_topk_softmax() (C++ 层)
    → 这就是 base 镜像 libixformer.so 里的实现

  upstream_ref/xllm_latest/core/layers/ilu/fused_moe.cpp
    → ixformer::infer::topk_softmax() (直接 C++ 调用)
    → ixformer::infer::group_gemm() → 完整 7-step MoE pipeline
2026-08-11 02:32:06 +00:00

181 lines
5.3 KiB
Python

import argparse
import traceback
import shutil
import logging
import yaml
import random
import sys
import os
import torch
import numpy as np
from ddpm.utils.logging import Logger, EmptyLogger
from ddpm.utils.tools import set_random_seed
from accelerate import Accelerator, DistributedDataParallelKwargs
torch.set_printoptions(sci_mode=False)
def dict2namespace(config):
namespace = argparse.Namespace()
for key, value in config.items():
if isinstance(value, dict):
new_value = dict2namespace(value)
else:
new_value = value
setattr(namespace, key, new_value)
return namespace
def parse_args_and_config():
parser = argparse.ArgumentParser(description=globals()["__doc__"])
parser.add_argument(
"--config", type=str, required=True, help="Path to the config file"
)
parser.add_argument(
"--seed", type=int, default=1234, help="Random seed")
parser.add_argument(
"--exp", type=str, default="exp", help="Path for saving running related data."
)
parser.add_argument(
"--test", action="store_true", help="Whether to test the model"
)
parser.add_argument(
"--sample", action="store_true", help="Whether to produce samples from the model",
)
parser.add_argument(
"--image_folder", type=str, default="images", help="folder name for storing the sampled images"
)
parser.add_argument(
"--fid", action="store_true"
)
parser.add_argument(
"--interpolation", action="store_true"
)
parser.add_argument(
"--resume_training", action="store_true", help="Whether to resume training"
)
parser.add_argument(
"--ni", action="store_true", help="No interaction. Suitable for Slurm Job launcher",
)
parser.add_argument(
"--use_pretrained", action="store_true"
)
parser.add_argument(
"--sample_type", type=str, default="generalized", help="sampling approach (generalized or ddpm_noisy)",
)
parser.add_argument(
"--skip_type", type=str, default="uniform", help="skip according to (uniform or quadratic)",
)
parser.add_argument(
"--timesteps", type=int, default=1000, help="number of steps involved"
)
parser.add_argument(
"--eta", type=float, default=0.0, help="eta used to control the variances of sigma",
)
parser.add_argument(
"--dyn", action="store_true", help="whether to activate the dynamic train/inference"
)
parser.add_argument(
"--sequence", action="store_true"
)
parser.add_argument(
"--select_step", type=int, default=None
)
parser.add_argument(
"--select_depth", type=int, default=None
)
parser.add_argument(
"--cache", action="store_true"
)
parser.add_argument(
"--cache_interval", type=int, default=None,
)
parser.add_argument(
"--non_uniform", action="store_true"
)
parser.add_argument(
"--pow", type=float, default=None,
)
parser.add_argument(
"--center", type=int, default=None,
)
parser.add_argument(
"--branch", type=int, default=None,
)
args = parser.parse_args()
# parse config file
with open(args.config, "r") as f:
config = yaml.safe_load(f)
new_config = dict2namespace(config)
new_config.select_step = args.select_step
new_config.select_depth = args.select_depth
torch.backends.cudnn.benchmark = True
return args, new_config
def main():
args, config = parse_args_and_config()
if args.dyn:
ddp_kwargs = DistributedDataParallelKwargs(find_unused_parameters=True)
accelerator = Accelerator(kwargs_handlers=[ddp_kwargs])
else:
accelerator = Accelerator()
args.accelerator = accelerator
#log_root_dir = "{}_runtime_log".format(args.config[8:-4])
log_root_dir = "runtime_log"
dataset = args.config[8:-4]
if args.cache:
if args.non_uniform:
sub_dir_name = "{}_{}_cache_{}_pow_{}_center_{}".format(dataset, args.exp, args.cache_interval, args.pow, args.center)
else:
sub_dir_name = "{}_{}_cache_{}".format(dataset, args.exp, args.cache_interval)
else:
sub_dir_name = "{}".format(args.exp)
if accelerator.is_main_process:
logger = Logger(
root_dir=log_root_dir,
sub_name=sub_dir_name,
config=args.__dict__,
append=(args.sample == True)
)
args.logger = logger
args.logger.log("Writing log file to {}".format(args.logger.sub_dir))
args.logger.log("Exp instance PID = {}".format(os.getpid()))
else:
args.logger = EmptyLogger(
root_dir=log_root_dir,
sub_name=sub_dir_name,
)
args.image_folder = args.logger.setup_image_folder("{}".format(args.image_folder))
args.seed += accelerator.process_index
# set random seed
set_random_seed(args.seed)
try:
if args.cache:
from ddpm.runners.deepcache import Diffusion
runner = Diffusion(args, config)
runner.sample()
else:
from ddpm.runners.diffusion import Diffusion
runner = Diffusion(args, config)
runner.sample()
except Exception:
logging.error(traceback.format_exc())
return 0
if __name__ == "__main__":
main()