乐于分享
好东西不私藏

TensorRT-LLM 0.5.0 源码之十八

TensorRT-LLM 0.5.0 源码之十八

cpp_library

#include <dlfcn.h>

template
 <typename tSymbolSignature>
tSymbolSignature getTrtLLMFunction(std::string libFileSoName, std::string symbol)
{
#if !defined(_WIN32)

    std::cout << "Trying to load " << libFileSoName << " ..." << std::endl;

    // 1. Defining a handle to the library

    void
* handle = dlopen(libFileSoName.c_str(), RTLD_LAZY | RTLD_GLOBAL);

    // 2. Check for errors

    const
 char* dl_error1 = dlerror();
    if
 (!handle)
    {
        throw
 std::runtime_error("Cannot open library: " + std::string(dl_error1));
    }

    // 3. Load actual queried `symbol`

    std::cout << "Loading symbol `" << symbol << "` ..." << std::endl;

    tSymbolSignature symbolFctn = nullptr;
    *(void**) (&symbolFctn) = dlsym(handle, symbol.c_str());

    // 4. Check for errors

    const
 char* dl_error2 = dlerror();
    if
 (dl_error2)
    {
        dlclose
(handle);
        throw
 std::runtime_error("Cannot load symbol '" + symbol + "': " + std::string(dl_error2));
    }

    return
 symbolFctn;
#else  // on windows

    throw
 std::runtime_error(
        "`tSymbolSignature getTrtLLMFunction(std::string, std::string)` is not implemented on Windows."
);
    return
 nullptr;
#endif // !defined(_WIN32)

}
#include "tensorrt_llm_libutils.h"

int main(int argc, char* argv[])
{
    class
 TRTLogger : public nvinfer1::ILogger
    {
    public
:
void log(nvinfer1::ILogger::Severity severity, const char* msg) noexcept override
{
            if
 (severity <= nvinfer1::ILogger::Severity::kERROR)
                std::cerr << "[TensorRT-LLM ERR]: " << msg << std::endl;
            else
 if (severity == nvinfer1::ILogger::Severity::kWARNING)
                std::cerr << "[TensorRT-LLM WARNING]: " << msg << std::endl;
            else

                std::cout << "[TensorRT-LLM LOG]: " << msg << std::endl;
        }
    };

    TRTLogger* trtLogger = new TRTLogger();

    std::string libname = "libtensorrt_llm_plugin.so";

    /* =============== initLibNvInferPlugins =============== */


typedef bool (*initLibNvInferPlugins_sig)(void*, const void*)
;

    auto
 initLibNvInferPlugins = getTrtLLMFunction<initLibNvInferPlugins_sig>(
        /*libFileSoName=*/
libname,
        /*symbol=*/
"initLibNvInferPlugins");

    std::cout << std::endl;

    std::string libNamespace = "tensorrt_llm";
    const
 char* libNamespace_cstr = libNamespace.data();

    bool
 status1 = initLibNvInferPlugins(trtLogger, libNamespace_cstr);
    std::cout << "Success Status: " << status1 << std::endl << std::endl;

    bool
 status2 = initLibNvInferPlugins(trtLogger, libNamespace_cstr);
    std::cout << "Success Status: " << status2 << std::endl;

    /* =============== getInferLibVersion =============== */


    std::cout << std::endl;
    std::cout << "--------------------------------------------------------------------" << std::endl;

typedef int32_t (*getInferLibVersion_sig)()
;

    auto
 getInferLibVersion = getTrtLLMFunction<getInferLibVersion_sig>(
        /*libFileSoName=*/
libname,
        /*symbol=*/
"getInferLibVersion");

    std::cout << std::endl;

    int32_t
 version = getInferLibVersion();
    std::cout << "Version: " << version << std::endl;

    return
 0;
}

build.sh

#!/usr/bin/env bash

BUILD_DIR="build"
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

rm
 -rf ${BUILD_DIR} && mkdir -p ${BUILD_DIR}

pushd
 ${BUILD_DIR}

cmake \
    -DCMAKE_BUILD_TYPE=Release \
    ..

make -j"$(grep -c ^processor /proc/cpuinfo)"

export
 LD_LIBRARY_PATH="${SCRIPT_DIR}:${LD_LIBRARY_PATH}"

# Test Lib

echo

echo
 "--------------------------------------------------------------------"
./trt_llm_plugins_cpp_load_example
echo
 "--------------------------------------------------------------------"
echo


popd

参考文献

  • • https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/examples/cpp_library/main.cpp
点个「赞」+「在看」❤️
让我们知道这份文字有温暖到你,也是我们持续创作的最大动力!
推荐
TensorRT-LLM 0.5.0 源码之十六
flashinfer.sampling 实现二
TensorRT-LLM 0.5.0 源码之十四
Ruff:打造无错误、高可维护性Python代码的现代化代码检查工具
HF 和 TRT-LLM multinomial 采样解码实现一
入门MPI必看!一文搞懂分布式并行编程的核心基础
MPI Hello World 教程:从代码解析到运行实操
MPI 组与通讯器详解
什么是氛围编程(Vibe Coding)?
BS::thread_pool 一个快速、轻量级、现代且易于使用的线程池库
MiMo-V2-Flash技术报告
AI原生开发中的MCP与CLI对比
flashinfer.sampling 实现一
Qwen3-TTS 技术报告
Vibe Coding 氛围编程最佳实践
Paged Attention, IFB, and Request Scheduling
VoxCPM 模型结构
理解 VoxCPM 模型
Claude Code 源码泄露:伪造工具、挫败感正则、卧底模式及更多
Claude Code代码泄露事件-愚人节前的礼物
Multi-Head, Multi-Query, and Group-Query Attention
PagedAttention
什么是 Programmatic Dependent Launch
如何让AI听懂你的“话外音”?GOAT-SLM模型实现更懂情感的语言交互
Optimize Prompts
大模型部署必看:LLM 推理(Inference)优化 技术,适配高并发、低延迟场景
LLM Serving Benchmark Metrics
告别语音克隆烦恼:VoxCPM用Token-Free方案,打造真实会“思考”的AI语音
OpenCharacter: 利用大规模合成人物角色训练可定制化角色扮演语言模型
FlashAttention与PagedAttention详解:拯救GPU显存,让大模型飞起来的核心技术
Introducing CUDA UnBound (CUB)
Meta Prompting: A Guide to Automated Prompt Optimization
CUDA 中如何使用虚函数
DeepSpeed的ZeRO技术具体是如何实现显存优化的?
LM-as-a-judge:LLM评估指南
LLM Sequence Packing
深入了解SmoothQuant:大模型高效量化背后的数学原理
ART·E: How We Built an Email Research Agent That Beats o3
中文LLM指令微调动态机制
intro to GRPO an efficient policy optimization method
提升TTS语音合成效果:低质量数据清洗、增强与数据扩增
语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策
TTS的CFM中的class-free指的是什么?
当扩散模型遇上流匹配:原来是一回事儿
语音合成中的“一对多”问题主流模型解决方案分析
Share Memory 的 Bank Conflict
告别高成本!TensorRT-LLM实战:如何将LLM推理速度提升数倍
使用LoRA对LLM进行微调的实用技巧
强化学习小白必看:PTX Loss 到底是个啥?
GPT-5 Prompt Migration and Improvement Using the New Optimizer
Hugging Face BPE Tokenizer 的资源文件
RULER: Relative Universal LLM-Elicited Rewards
SFT和RFT的区别
语音合成(TTS)中文自然度:问题、成因、解决方案
上下文工程如何实现
上下文工程(Context Engineering)
SFT 泛化新解读:强化学习 + 奖励修正,一文读懂
Evol-Instruct 竟能精准生成领域专属数据?实操技巧速看!
指令微调数据-少即是多
语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案
大模型训练新思路:GEPA 靠 “反思” 赢过 RL,看完秒懂
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 说话变 “真人” 的秘密在这里!
为什么说分布变换是 Normalizing flow 的「灵魂操作」?
从知识增长的角度提升RAG上下文的质量
手把手教你创建 evol-instruct 数据集!附完整流程~
社交类聊天的 Query 分析与应答策略
SFT 中指令选择和响应选择哪个更重要?
角色扮演大模型技术分享2-超拟人模型的困境
最新!SpeechLLM 综述:架构、能力、挑战与未来全揭秘
如何低成本生成高质量指令微调数据?
从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优
Qwen 的训练数据是怎么做的?
如何低成本生成高质量指令微调数据?
掌握RAG:投入生产前要评估的8个场景
掌握RAG:如何评估RAG的LLM
掌握RAG:如何在部署后观察您的RAG
掌握RAG:如何选择嵌入模型
Semantic token和连续特征在SLLM下的对比
RLHF及其变体:进展和实际工程见解
什么是置信度?置信度模型怎么做?
晦涩难懂的 Flow matching!图形化理解
FSQ的原理与VQ-VAE的区别和联系
大模型并行训练的一些知识——极简版
RLHF 入门,高手勿进!