乐于分享
好东西不私藏

TensorRT-LLM 0.5.0 源码之三

TensorRT-LLM 0.5.0 源码之三

_common.py

net = None # Newwork()_inited = False
def _init(log_level=None):    global _inited    if _inited:        return    _inited = True    # Move to __init__    if log_level is not None:        logger.set_level(log_level)    # load plugin lib    _load_plugin_lib()    # load FT decoder layer    project_dir = str(Path(__file__).parent.absolute())    if platform.system() == "Windows":        ft_decoder_lib = project_dir + '/libs/th_common.dll'    else:        ft_decoder_lib = project_dir + '/libs/libth_common.so'    if ft_decoder_lib == '':        raise ImportError('FT decoder layer is unavailable')    torch.classes.load_library(ft_decoder_lib)    global net    logger.info('TensorRT-LLM inited.')
def default_net():    assert net, "Use builder to create network first, and use `set_network` or `net_guard` to set it to default"    return netdef default_trtnet():    return default_net().trt_networkdef set_network(network):    global net    net = network
def switch_net_dtype(cur_dtype):    prev_dtype = default_net().dtype    default_net().dtype = cur_dtype    return prev_dtype@contextlib.contextmanagerdef precision(dtype):    if isinstance(dtype, str):        dtype = str_dtype_to_trt(dtype)    prev_dtype = switch_net_dtype(dtype)    yield    switch_net_dtype(prev_dtype)

init.py

_init(log_level="error")

_utils.py

fp32_array = partial(np.array, dtype=np.float32)fp16_array = partial(np.array, dtype=np.float16)int32_array = partial(np.array, dtype=np.int32)
# numpy doesn't know bfloat16, define abstract binary type insteadnp_bfloat16 = np.dtype('V2', metadata={"dtype": "bfloat16"})def torch_to_numpy(x):    if x.dtype != torch.bfloat16:        return x.numpy()    return x.view(torch.int16).numpy().view(np_bfloat16)
def trt_version():    return trt.__version__def torch_version():    return torch.__version__
_str_to_np_dict = dict(    float16=np.float16,    float32=np.float32,    int32=np.int32,    bfloat16=np_bfloat16,)def str_dtype_to_np(dtype):    ret = _str_to_np_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_str_to_torch_dtype_dict = dict(    bfloat16=torch.bfloat16,    float16=torch.float16,    float32=torch.float32,    int32=torch.int32,    int8=torch.int8,)def str_dtype_to_torch(dtype):    ret = _str_to_torch_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_str_to_trt_dtype_dict = dict(float16=trt.float16,                              float32=trt.float32,                              int64=trt.int64,                              int32=trt.int32,                              int8=trt.int8,                              bool=trt.bool,                              bfloat16=trt.bfloat16,                              fp8=trt.fp8)def str_dtype_to_trt(dtype):    ret = _str_to_trt_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_np_to_trt_dtype_dict = {    np.int8: trt.int8,    np.int32: trt.int32,    np.float16: trt.float16,    np.float32: trt.float32,    # hash of np.dtype('int32') != np.int32    np.dtype('int8'): trt.int8,    np.dtype('int32'): trt.int32,    np.dtype('float16'): trt.float16,    np.dtype('float32'): trt.float32,}def np_dtype_to_trt(dtype):    if trt_version() >= '7.0' and dtype == np.bool_:        return trt.bool    if trt_version() >= '9.0' and dtype == np_bfloat16:        return trt.bfloat16    ret = _np_to_trt_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_trt_to_np_dtype_dict = {    trt.int8: np.int8,    trt.int32: np.int32,    trt.float16: np.float16,    trt.float32: np.float32,    trt.bool: np.bool_,}def trt_dtype_to_np(dtype):    if trt_version() >= '9.0' and dtype == trt.bfloat16:        return np_bfloat16    ret = _trt_to_np_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_torch_to_np_dtype_dict = {    torch.float16: np.float16,    torch.float32: np.float32,}def torch_dtype_to_np(dtype):    ret = _torch_to_np_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret_trt_to_torch_dtype_dict = {    trt.float16: torch.float16,    trt.float32: torch.float32,    trt.int32: torch.int32,    trt.int8: torch.int8,}def trt_dtype_to_torch(dtype):    if trt_version() >= '9.0' and dtype == trt.bfloat16:        return torch.bfloat16    ret = _trt_to_torch_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return ret
def dim_to_trt_axes(dim):    """Converts torch dim, or tuple of dims to a tensorrt axes bitmask"""    if not isinstance(dim, tuple):        dim = (dim, )    # create axes bitmask for reduce layer    axes = 0    for d in dim:        axes |= 1 << d    return axes
def dim_resolve_negative(dim, ndim):    if not isinstance(dim, tuple):        dim = (dim, )    pos = []    for d in dim:        if d < 0:            d = ndim + d        pos.append(d)    return tuple(pos)
def serialize_engine(engine, path):    logger.info(f'Serializing engine to {path}...')    tik = time.time()    if isinstance(engine, trt.ICudaEngine):        engine = engine.serialize()    with open(path, 'wb') as f:        f.write(bytearray(engine))    tok = time.time()    t = time.strftime('%H:%M:%S', time.gmtime(tok - tik))    logger.info(f'Engine serialized. Total time: {t}')def deserialize_engine(path):    runtime = trt.Runtime(logger.trt_logger)    with open(path, 'rb') as f:        logger.info(f'Loading engine from {path}...')        tik = time.time()        engine = runtime.deserialize_cuda_engine(f.read())        assert engine is not None        tok = time.time()        t = time.strftime('%H:%M:%S', time.gmtime(tok - tik))        logger.info(f'Engine loaded. Total time: {t}')    return engine
def mpi_comm():    from mpi4py import MPI    return MPI.COMM_WORLDdef mpi_rank():    return mpi_comm().Get_rank()def mpi_world_size():    return mpi_comm().Get_size()
# 向上取整def pad_vocab_size(vocab_size, tp_size):    return int(math.ceil(vocab_size / tp_size) * tp_size)
def to_dict(obj):    return copy.deepcopy(obj.__dict__)def to_json_string(obj):    if not isinstance(obj, dict):        obj = to_dict(obj)    return json.dumps(obj, indent=2, sort_keys=True) + "\n"def to_json_file(obj, json_file_path):    with open(json_file_path, "w", encoding="utf-8") as writer:        writer.write(to_json_string(obj))
_field_dtype_to_np_dtype_dict = {    trt.PluginFieldType.FLOAT16: np.float16,    trt.PluginFieldType.FLOAT32: np.float32,    trt.PluginFieldType.FLOAT64: np.float64,    trt.PluginFieldType.INT8: np.int8,    trt.PluginFieldType.INT16: np.int16,    trt.PluginFieldType.INT32: np.int32,}def field_dtype_to_np_dtype(dtype):    ret = _field_dtype_to_np_dtype_dict.get(dtype)    assert ret is not None, f'Unsupported dtype: {dtype}'    return retdef convert_capsule_to_void_p(capsule):    # 这个函数负责从Capsule对象中提取原始的C指针    ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p    ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [        ctypes.py_object, ctypes.c_char_p    ]    # Capsule对象:是Python中用于封装C指针的容器,常见于C扩展模块中    # Python C API函数,用于从Capsule提取指针    # 第二个参数传入None,表示不检查Capsule的名称标识    return ctypes.pythonapi.PyCapsule_GetPointer(capsule, None)def get_nparray_from_void_p(void_pointer, elem_size, field_dtype):    # 设置PyMemoryView_FromMemory的函数签名    ctypes.pythonapi.PyMemoryView_FromMemory.restype = ctypes.py_object    ctypes.pythonapi.PyMemoryView_FromMemory.argtypes = [        ctypes.c_char_p, ctypes.c_ssize_t, ctypes.c_int    ]    logger.info(        f'get_nparray: pointer = {void_pointer}, elem_size = {elem_size}')    # 将void指针转换为char指针(字节指针)    char_pointer = ctypes.cast(void_pointer, ctypes.POINTER(ctypes.c_char))    # 计算数据类型大小和总字节数    np_dtype = field_dtype_to_np_dtype(field_dtype)    buf_bytes = elem_size * np.dtype(np_dtype).itemsize    logger.info(f'get_nparray: buf_bytes = {buf_bytes}')    # 创建memoryview对象(共享内存,无拷贝)    mem_view = ctypes.pythonapi.PyMemoryView_FromMemory(        char_pointer, buf_bytes, 0)  # number 0 represents PyBUF_READ    logger.info(        f'get_nparray: mem_view = {mem_view}, field_dtype = {field_dtype}')    # 从memoryview创建NumPy数组    buf = np.frombuffer(mem_view, np_dtype)    return bufdef get_scalar_from_field(field):    void_p = convert_capsule_to_void_p(field.data) # 提取指针    np_array = get_nparray_from_void_p(void_p, 1, field.type)  # 创建1元素数组    return np_array[0] # 返回标量值

参考文献

  • • https://github.com/NVIDIA/TensorRT-LLM/blob/v0.5.0/tensorrt_llm/_common.py
  • • https://github.com/NVIDIA/TensorRT-LLM/blob/v0.5.0/tensorrt_llm/__init__.py
  • • https://github.com/NVIDIA/TensorRT-LLM/blob/v0.5.0/tensorrt_llm/plugin/plugin.py
  • • https://github.com/NVIDIA/TensorRT-LLM/blob/v0.5.0/tensorrt_llm/_utils.py
点个「赞」+「在看」❤️
让我们知道这份文字有温暖到你,也是我们持续创作的最大动力!
推荐
Share Memory 的 Bank Conflict
告别高成本!TensorRT-LLM实战:如何将LLM推理速度提升数倍
使用LoRA对LLM进行微调的实用技巧
强化学习小白必看:PTX Loss 到底是个啥?
GPT-5 Prompt Migration and Improvement Using the New Optimizer
Task 异步流 coroutine 实现
C++ corotine 介绍
搭建 VSCode 离线开发环境
nlohmann/json 库简介
Intro to C++ Coroutines: Concept
Hugging Face BPE Tokenizer 的资源文件
移动语义 std::move 和完美转发 std::forward
ACEBench: Who Wins the Match Point in Tool Usage?
什么是 GN
RULER: Relative Universal LLM-Elicited Rewards
SFT和RFT的区别
CosyVoice 3: 面向真实场景的大规模零样本语音生成模型
CosyVoice 3: Towards In-the-wild Speech Generation
语音合成(TTS)中文自然度:问题、成因、解决方案
上下文工程如何实现
上下文工程(Context Engineering)
新手必看!LangGraph 101:手把手教你搭一个深度研究 Agent
LangGraph 简介
SFT 泛化新解读:强化学习 + 奖励修正,一文读懂
程序员狂喜!Self-Instruct 框架全解析:无限生成高质量指令集,从此告别标注噩梦!
Evol-Instruct 竟能精准生成领域专属数据?实操技巧速看!
指令微调数据-少即是多
LLM generate 参数怎么用?
语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案
大模型训练新思路:GEPA 靠 “反思” 赢过 RL,看完秒懂
F5-TTS:用 Flow Matching 玩转语音,流畅度和真实感都 “拉满” 了
E2 TTS:令人尴尬地简单、完全非自回归、零样本的语音合成技术
Voicebox:大规模文本引导的多语言通用语音生成技术
为什么都在聊 Kimi K2?Open Agentic Intelligence 藏着哪些新惊喜
Step-Audio-AQAA 端到端音频模型
DPO、PPO、GRPO的原理,区别与联系
OPENCSG 中文语料库:一系列高质量的中文数据集,用于语言模型训练
什么是 Classifier-Free Guidance?
Conditional Flow Matching : 连续标准流 Continuous Normalizing Flow
CFM 与 OT-CFM:条件流匹配与最优传输的碰撞
DPO损失实现
Conditional Flow Matching : 常微分方程ODE、欧拉方法和Neural ODE
当 Normalizing flow 遇上语音生成:AI 说话变 “真人” 的秘密在这里!
深度剖析:Kimi – Audio 中 BigVGAN 的神奇作用
为什么说分布变换是 Normalizing flow 的「灵魂操作」?
MATCHA-TTS 来了!条件流匹配让文本转语音效率飙升
从知识增长的角度提升RAG上下文的质量
MiniMax-Speech,零样本语音合成新突破,32 种语言轻松拿捏!
手把手教你创建 evol-instruct 数据集!附完整流程~
社交类聊天的 Query 分析与应答策略
SFT 中指令选择和响应选择哪个更重要?
角色扮演大模型技术分享2-超拟人模型的困境
最新!SpeechLLM 综述:架构、能力、挑战与未来全揭秘
如何低成本生成高质量指令微调数据?
从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优
Kimi-Audio:开源音频基础模型全面解析
Kimi-Audio 的 TTS 效果如何?
Qwen 的训练数据是怎么做的?
GeForce RTX 3090, 4090, A10, A40, A100, A800, L20, L40 显卡性能对比
如何低成本生成高质量指令微调数据?
掌握RAG:投入生产前要评估的8个场景
掌握RAG:如何评估RAG的LLM
掌握RAG:如何在部署后观察您的RAG
掌握RAG:如何选择嵌入模型
基础模型中的新范式:为什么o1是不同的,以及它将如何改变LLM应用
Semantic token和连续特征在SLLM下的对比
从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优
RLHF及其变体:进展和实际工程见解
Freeze-Omni: 低延迟语音对话模型
Fully Sharded Data Parallelism (FSDP)
什么是置信度?置信度模型怎么做?
晦涩难懂的 Flow matching!图形化理解
中文指令微调数据,质量就是一切!
基于 LLM 的文本泛化
CosyVoice 2:基于大型语言模型的可扩展流式语音合成技术
Mini-Omni2: with Vision, Speech and Duplex Capabilities
FSQ的原理与VQ-VAE的区别和联系
大模型并行训练的一些知识——极简版
亲测有效!如何用 Address Sanitizer 精准定位内存漏洞?附保姆级操作指南
要用 AI 裁员 50% 的千亿独角兽,公开认错,重启招聘!
single codebook和dual codebook在LLM中向量量化上有什么区别?
一些文档去重算法
最佳的指令数据应当是什么样的?
Prefill-Decode分离
亲测有效!如何用 Address Sanitizer 精准定位内存漏洞?附保姆级操作指南
Simhash-文档去重算法简介
RLHF 入门,高手勿进!
最佳的指令数据应当是什么样的?
CosyVoice:一种基于监督式语义标记的可扩展多语言 Zero-Shot 语音合成器
Model Context Protocol (MCP)
MCP(模型上下文协议)是什么以及它是如何运作的
压力测试LLMs——大海捞针实现
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » TensorRT-LLM 0.5.0 源码之三

评论 抢沙发

2 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮