Triton Inference Server 架构原理

文章目录

  • TensorRT-LLM & Triton Server 部署回顾
    • 部署梳理
    • Triton 架构
  • 为什么要使用 backend ?
    • triton_model_repo 目录结构
    • Ensemble 模式
    • BLS 模式

上篇文章进行了 TensorRT-LLM & Triton Server 部署 ,本篇简单讲讲 Triton Inference Server 的架构原理,便于大家更好的做配置和开发。

TensorRT-LLM & Triton Server 部署回顾

部署梳理

上一篇我们了解到部署 TRT-LLM & Triton 需要非常复杂的步骤,其实总的来说一共就四步:1. 下载模型 2. 转换&编译模型(TensorRT) 3. 配置 backend(Triton) 4. 启动 Triton Server

  • 下载模型
# 下载模型
wget https://hf-mirror.com/hfd/hfd.sh
chmod a+x hfd.sh
export HF_ENDPOINT=https://hf-mirror.com
apt-get update
apt-get install -y aria2
aria2c --version
./hfd.sh meta-llama/Meta-Llama-3.1-8B-Instruct --hf_username Dong-Hua --hf_token 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 aria2c -x 4# 断点续传
aria2c --header='Authorization: Bearer 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' --console-log-level=error --file-allocation=none -x 4 -s 4 -k 1M -c 'https://hf-mirror.com/meta-llama/Meta-Llama-3.1-8B-Instruct/resolve/main/model-00002-of-00004.safetensors' -d '.' -o 'model-00002-of-00004.safetensors'
  • 转换&编译模型(TensorRT)
# 转换格式
python3 convert_checkpoint.py --model_dir /data/Meta-Llama-3.1-8B-Instruct \--output_dir ./trt_ckpts/llama3.1_checkpoint_gpu_tp \--dtype float16 \--tp_size 1 \--workers 8
# 编译模型
trtllm-build --checkpoint_dir ./trt_ckpts/llama3.1_checkpoint_gpu_tp \--output_dir ./trt_engines/llama3.1_8B_128K_fp16_1-gpu \--workers 8 \--gemm_plugin auto \--max_num_tokens 131072

该步骤得到的是两个文件,一个编译后的模型引擎文件,一个是模型配置文件:

在这里插入图片描述

  • 配置 backend(Triton)
# 在进行配置前,你需要先创建 triton_model_repo,并且把上一步骤的两个文件移入对应的 repo 下面:
cd tensorrtllm_backend
mkdir triton_model_repo
cp -r all_models/inflight_batcher_llm/* triton_model_repo/
cp /data/TensorRT-LLM/examples/llama/trt_engines/llama3.1_8B_128K_fp16_1-gpu/* triton_model_repo/tensorrt_llm/1# 进行 backend 配置
python3 tools/fill_template.py -i triton_model_repo/postprocessing/config.pbtxt \
tokenizer_dir:/data/Meta-Llama-3.1-8B-Instruct,\
tokenizer_type:auto,\
triton_max_batch_size:64,\
postprocessing_instance_count:1python3 tools/fill_template.py -i triton_model_repo/preprocessing/config.pbtxt \
tokenizer_dir:/data/Meta-Llama-3.1-8B-Instruct,\
tokenizer_type:auto,\
triton_max_batch_size:64,\
preprocessing_instance_count:1python3 tools/fill_template.py -i triton_model_repo/tensorrt_llm_bls/config.pbtxt \
triton_max_batch_size:64,\
decoupled_mode:true,\
bls_instance_count:1python3 tools/fill_template.py -i triton_model_repo/ensemble/config.pbtxt \
triton_max_batch_size:64python3 tools/fill_template.py -i triton_model_repo/tensorrt_llm/config.pbtxt \
triton_backend:tensorrtllm,\
triton_max_batch_size:64,\
decoupled_mode:true,\
engine_dir:triton_model_repo/tensorrt_llm/1,\
max_queue_delay_microseconds:10000,\
batching_strategy:inflight_fused_batching

此步骤的配置是通过脚本填充的方式修改配置,其实也可以进对应的文件进行配置,可以看到所有的配置改动都是修改的 triton_model_repo 目录下的,是的没错,Triton 的核心就是 repo 下面的 backends,本篇文章目的也是讲关于 backend 的内容。

  • 启动 Triton Server
# 启动
python3 scripts/launch_triton_server.py \
--world_size 1 \
--model_repo=/data/tensorrtllm_backend/triton_model_repo/ \
--log \
--log-file=./triton_server.logs# 关闭
pkill tritonserver

Triton 架构

下图显示了 Triton 推理服务器的高级架构。

  • 模型存储库是一个基于文件系统的存储库,其中包含 Triton 将用于推理的模型。
  • 推理请求通过 HTTP/RESTGRPCC API 到达服务器,然后路由到适当的每个模型调度程序。
  • Triton 实现了多种调度和批处理算法,可以根据每个模型进行配置。
  • 每个模型的调度程序可以选择执行推理请求的批处理,然后将请求传递给与模型类型相对应的 backend 。 backend 使用批处理请求中提供的输入执行推理以生成请求的输出,然后返回输出。
    在这里插入图片描述

为什么要使用 backend ?

在这里插入图片描述
如上图,在 Triton上面所有部署的模型都是通过某一种 backend 部署在服务器上,例如 TensorRT 的模型,就会使用 tensorrt 类型的 backend 去启一个或者多个的 model 实例,这些 model 实例放到 GPU 上或者 CPU 上执行推理。

triton_model_repo 目录结构

在部署的时候我们需要配置很多 backend 的配置文件,然后再启动 server,我们修改的配置文件都在 triton_model_repo 目录下,先看目录结构:

(base) [root@iv-ycl6gxrcwka8j6ujk4bc tensorrtllm_backend]# tree triton_model_repo/
triton_model_repo/
├── ensemble
│   ├── 1
│   └── config.pbtxt
├── postprocessing
│   ├── 1
│   │   ├── model.py
│   │   └── __pycache__
│   │       └── model.cpython-310.pyc
│   └── config.pbtxt
├── preprocessing
│   ├── 1
│   │   ├── model.py
│   │   └── __pycache__
│   │       └── model.cpython-310.pyc
│   └── config.pbtxt
├── tensorrt_llm
│   ├── 1
│   │   ├── config.json # 模型配置文件
│   │   ├── model.py # backend 脚本
│   │   ├── __pycache__
│   │   │   └── model.cpython-310.pyc
│   │   └── rank0.engine # 模型引擎文件
│   └── config.pbtxt # backend 配置文件,部署时候修改的配置就是此文件
└── tensorrt_llm_bls├── 1│   ├── lib│   │   ├── decode.py│   │   ├── __pycache__│   │   │   ├── decode.cpython-310.pyc│   │   │   └── triton_decoder.cpython-310.pyc│   │   └── triton_decoder.py│   ├── model.py│   └── __pycache__│       └── model.cpython-310.pyc└── config.pbtxt

可以看到 triton_model_repo 仓库中有五个模型 backend,其中:

  • ensemble model:它允许你把多个模型串联在一起,形成一个 papline,只能处理静态请求
  • postprocessing model:前置处理
  • preprocessing model:后置处理
  • tensorrt_llm model:tensorrt 引擎部署的模型
  • tensorrt_llm_bls model:bls 模式,它允许有分支结构,可以进行动态的处理

每个模型文件都是类似如下结构:

├── *****
│   ├── 1
│   │   ├── config.json # 模型配置文件
│   │   ├── model.py # backend 脚本
│   │   ├── __pycache__
│   │   │   └── model.cpython-310.pyc
│   │   └── rank0.engine # 模型引擎文件
│   └── config.pbtxt # backend 配置文件,部署时候修改的配置就是此文件

在部署完之后你可以通过以下两种方式进行大模型请求:

curl -X POST localhost:8000/v2/models/ensemble/generate -d '{"text_input": "你是什么语言模型?", "max_tokens": 1000, "bad_words": "", "stop_words": "<|eot_id|>"}'curl -X POST localhost:8000/v2/models/tensorrt_llm_bls/generate -d '{"text_input": "你是什么语言模型?", "max_tokens": 1000, "bad_words": "", "stop_words": "<|eot_id|>"}'

问题来了,他们有什么区别呢?

Ensemble 模式

Ensemble 不是一个模型,只是一个调度器。它允许把多个模型串联在一起,形成一个 pipeline,请求使用该模型的时候,只会根据配置的 pipeline 进行静态的调用处理。

config.pbtxt 配置文件内容:

# Copyright 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#  * Neither the name of NVIDIA CORPORATION nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.name: "ensemble"
platform: "ensemble"
max_batch_size: 64
input [{name: "text_input"data_type: TYPE_STRINGdims: [ 1 ]},...{name: "embedding_bias_weights"data_type: TYPE_FP32dims: [ -1 ]optional: true}
]
output [{name: "text_output"data_type: TYPE_STRINGdims: [ -1 ]},...{name: "batch_index"data_type: TYPE_INT32dims: [ 1 ]}
]
ensemble_scheduling {step [{model_name: "preprocessing"model_version: -1input_map {key: "QUERY"value: "text_input"}...},{model_name: "tensorrt_llm"model_version: -1input_map {key: "input_ids"value: "_INPUT_ID"}...},{model_name: "postprocessing"model_version: -1input_map {key: "TOKENS_BATCH"value: "_TOKENS_BATCH"}...}]
}

可以看到配置文件中配置了 scheduling,当使用 ensemble 模型的时候,他的调用链就是根据配置的 scheduling 进行处理的,注意每个配置文件中都包含了输入和输出,以及下一个模型的输入输出映射(input_map),即上一个模型的输出对应为下一个模型某个字段的输入,上面列出来的内容作了省略处理,具体可自行查看配置文件。

BLS 模式

有 Ensemble 的静态模式,必然有动态模式,BLS 就是动态模式,他和静态模式相比就多了个 model.py 脚本,事实上他的动态也是根据脚本中进行的逻辑判断实现的

model.py 脚本架构:

# Copyright 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#  * Neither the name of NVIDIA CORPORATION nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.import json
import tracebackimport triton_python_backend_utils as pb_utils
from lib.triton_decoder import TritonDecoderdef get_valid_param_value(param, default_value=''):value = param.get('string_value', '')return default_value if value.startswith('${') or value == '' else valueclass TritonPythonModel:def initialize(self, args):# Parse model configsmodel_config = json.loads(args['model_config'])params = model_config['parameters']accumulate_tokens_str = get_valid_param_value(params.get('accumulate_tokens', {}))self.accumulate_tokens = accumulate_tokens_str.lower() in ['true', 'yes', '1', 't']self.decoupled = pb_utils.using_decoupled_model_transaction_policy(model_config)self.logger = pb_utils.Loggerdefault_tensorrt_llm_model_name = 'tensorrt_llm'self.llm_model_name = get_valid_param_value(params.get('tensorrt_llm_model_name', {}),default_tensorrt_llm_model_name)self.draft_llm_model_name = get_valid_param_value(params.get('tensorrt_llm_draft_model_name', {}), None)self.multimodal_encoders_name = get_valid_param_value(params.get('multimodal_encoders_name', {}), None)self.decoder = TritonDecoder(streaming=self.decoupled,accumulate=self.accumulate_tokens,preproc_model_name="preprocessing",postproc_model_name="postprocessing",llm_model_name=self.llm_model_name,draft_llm_model_name=self.draft_llm_model_name,multimodal_encoders_name=self.multimodal_encoders_name)def execute(self, requests):responses = []for request in requests:if self.decoupled:response_sender = request.get_response_sender()try:req = self.decoder.convert_triton_request(request)req.validate()speculative_decode = (req.num_draft_tokens is not Noneand req.num_draft_tokens[0][0] > 0)if speculative_decode and (self.draft_llm_model_name is Noneor self.draft_llm_model_name == ""):raise Exception("cannot perform speculative decoding without draft model")is_multimodal = req.image_input is not Noneif speculative_decode and is_multimodal:raise Exception("Multimodal and speculative decoding is not currently supported")res_gen = self.decoder.decode(req,speculative_decoding=speculative_decode,is_multimodal=is_multimodal)for res in res_gen:triton_response = self.decoder.create_triton_response(res)if self.decoupled:response_sender.send(triton_response)else:responses.append(triton_response)if self.decoupled:response_sender.send(flags=pb_utils.TRITONSERVER_RESPONSE_COMPLETE_FINAL)except Exception:self.logger.log_error(traceback.format_exc())# If encountering an error, send a response with err msgerror_response = pb_utils.InferenceResponse(output_tensors=[],error=pb_utils.TritonError(traceback.format_exc()))if self.decoupled:response_sender.send(error_response)response_sender.send(flags=pb_utils.TRITONSERVER_RESPONSE_COMPLETE_FINAL)else:responses.append(error_response)self.decoder.reset_decoder()if self.decoupled:return Noneelse:assert len(responses) == len(requests)return responsesdef finalize(self):"""`finalize` is called only once when the model is being unloaded.Implementing `finalize` function is optional. This function allowsthe model to perform any necessary clean ups before exit."""print('Tensorrt_llm_bls Cleaning up...')

所有的 model.py 文件都是需要实现上面的三个方法,BLS 模式的动态实现就是 execute 的内容,可以自己编码,遇到什么条件的时候进行不同的操作(或者不同的模型调用)实现动态处理。

根据上面 config.pbtxt 配置文件和 model.py 脚本的简单介绍,大家也可以自行研究一下其他 backend 的对应文件。总之,我们在部署过程中需要进行的操作就是根据需要进行配置和代码修改,当然 triton_model_repo 仓库中并不是固定的上面这些 backend,而是可以根据需求自行增加或者删除。


系列文章:

一、大模型推理框架选型调研
二、TensorRT-LLM & Triton Server 部署过程记录
三、vLLM 大模型推理引擎调研文档
四、vLLM 推理引擎性能分析基准测试
五、vLLM 部署大模型问题记录
六、Triton Inference Server 架构原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECCV2024 Tracking 汇总

一、OneTrack: Demystifying the Conflict Between Detection and Tracking in End-to-End 3D Trackers paper&#xff1a; https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/01174.pdf 二、VETRA: A Dataset for Vehicle Tracking in Aerial Imagery paper&#…

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

2013 lost connection to MySQL server during query

1.问题 使用navicat连接doris&#xff0c;会有这个错误。 2.解决 换低版本的navicat比如navicat11。

【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)

零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前&#xff0c;我们要学习一款LVGL官方的UI设计工具SquareLine Studio&#xff0c;使用图形化设计方式设计出我们想要的界面&#xff0c;然后生成对应源文件导入工程使用…

人工智能公司未达到欧盟人工智能法案标准

关注公众号网络研究观获取更多内容。 据路透社获得的数据显示&#xff0c;领先的人工智能&#xff08;AI&#xff09;模型在网络安全弹性和防止歧视性输出等领域未能满足欧洲关键监管标准。 《欧盟人工智能法案》将在未来两年分阶段实施&#xff0c;旨在解决人们对这些技术在…

【计网】从零开始理解TCP协议 --- 拥塞控制机制,延迟应答机制,捎带应答,面向字节流

时间就是性命。 无端的空耗别人的时间&#xff0c; 其实是无异于谋财害命的。 --- 鲁迅 --- 从零开始理解TCP协议 1 拥塞控制2 延迟应答3 捎带应答4 面向字节流5 TCP异常情况TCP小结 1 拥塞控制 尽管TCP拥有滑动窗口这一高效的数据传输机制&#xff0c;能够确保在对方接收…

倍福TwinCAT程序中遇到的bug

文章目录 问题描述&#xff1a;TwinCAT嵌入式控制器CX5140在上电启动后&#xff0c;X001网口接网线通讯灯不亮&#xff0c;软件扫描不到硬件网口 解决方法&#xff1a;硬件断电重启后&#xff0c;X001网口恢复正常 问题描述&#xff1a;TwinCAT软件点击激活配置后&#xff0c;…

RHCE----时间服务器

配置 需要两个服务器&#xff0c;一个服务器&#xff08;服务端IP&#xff1a;192.168.19.130&#xff0c;客户端&#xff1a;192.168.19.131&#xff09; 客户端&#xff08;client131&#xff09; [rootserver1 ~]# vim /etc/chrony.conf 添加阿里云服务器&#xff0c;…

VMware虚拟机软件安装、卸载

VMware是一个软件.这个软件可以刻画出来多个不同配置的计算机硬件(裸机). VMware只能负责产生裸机,要想使用这台机器.需要为其安装操作系统. VMware常见的场景就是用来安装Linux操作系统.... 我们以后要学习大数据hadoop软件,hadoop软件在linux环境下安装.因此我们需要有台装有…

Kylin-Server-10-SP1通过网络升级到SP3

环境说明 虚拟化环境&#xff1a;VMware Workstation 16 Pro 测试镜像&#xff1a;Kylin-Server-10-SP1-Release-Build04-20200711-x86_64.iso Kylin-Server-V10-SP3-General-Release-2212-X86_64.iso 远程连接工具&#xff1a;MobaXterm 虚拟机配置&#xff1a;4C 4G 20G硬盘…

【深度学习中的注意力机制1】11种主流注意力机制112个创新研究paper+代码——缩放点积注意力(Scaled Dot-Product Attention)

【深度学习中的注意力机制1】11种主流注意力机制112个创新研究paper代码——缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09; 【深度学习中的注意力机制1】11种主流注意力机制112个创新研究paper代码——缩放点积注意力&#xff08;Scaled Dot-Product A…

5G NR:UE初始接入信令流程浅介

UE初始接入信令流程 流程说明 用户设备&#xff08;UE&#xff09;向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU。IN…

小白投资理财 - 解读资产指标

小白投资理财 - 解读资产指标 资产指标详情总资产&#xff08;Total Assets&#xff09;净资产&#xff08;Net Assets&#xff09;资产负债率&#xff08;Debt to Asset Ratio&#xff09;固定资产周转率&#xff08;Fixed Asset Turnover Ratio&#xff09;总资产周转率&…

软件开发的项目管理的风险有哪些?

软件开发项目管理中可能面临的风险&#xff1a; 序号风险类型描述1需求不明确项目需求没有被清晰定义或频繁变更&#xff0c;导致开发方向不明确或需要重做工作。2技术风险采用的技术可能存在缺陷或不兼容&#xff0c;或者团队缺乏必要的技术技能。3资源不足项目可能因为人力…

大数据存储计算平台EasyMR:大数据集群动态扩缩容,快速提升集群服务能力

在当今的数据驱动时代&#xff0c;组织面临着数据量的爆炸性增长。为了有效管理和存储这些数据&#xff0c;许多组织依赖于 Hadoop 这样的分布式存储系统。Hadoop 集群通过在多个节点上存储数据的冗余副本&#xff0c;提供了高可靠性和可扩展性。然而&#xff0c;随着数据量的不…

深⼊理解指针(2)

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. ⼆级指针 5. 指针数组 6. 指针数组模拟⼆维数组 1. 数组名的理解 我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[…

Java项目-基于Springboot的福聚苑社区团购系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

字节 HLLM 论文阅读

github连接&#xff1a;https://github.com/bytedance/HLLM 探讨问题&#xff1a; 推荐LLM的三个关键问题&#xff1a; LLM预训练权重通常被认为是对世界知识的概括&#xff0c;其对于推荐系统的价值&#xff1f;对推荐任务进行微调的必要性&#xff1f;LLM是否可以在推荐系统…

cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验

一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…

C++中的vector介绍(常用函数)

目录 vector的介绍及使用1.vector的介绍2.vector的使用2.1vector的定义2.2 vector iterator 的使用2.3vector 空间增长问题2.4 vector 增删查改2.5 vector 迭代器失效问题。&#xff08;重点&#xff09; 3.动态二维数组理解4.模拟实现reserve vector的介绍及使用 1.vector的介…