简介:面向证券风控、量化策略与监管科技方向的技术人员,这份471页的PDF文档系统展示了基于DeepSeek大模型的大宗交易异常监控方案。资源包含1个PDF文件,压缩包约14.91MB,覆盖从多源数据采集、预处理、特征工程到模型训练、微调、蒸馏部署的完整技术链路,尤其适合用于构建交易行为识别与实时预警系统。文档共51个大章节,结构清晰,支持目录章节跳转,并可在阅读器左侧通过书签大纲快速定位核心内容;内容详实,包含数据标注体系、超参数调优、LoRA/QLoRA适配对比、模型蒸馏参数优化等实操层细节,可直接作为系统设计与工程落地的技术参考。目前已有80人学习下载,适合希望深入理解大模型在证券异常交易场景中落地路径的研究者与工程师。
1. 大宗交易异常监控为什么绕不开DeepSeek大模型:一份471页落地方案的拆解实录
这份名为《DeepSeek证券大宗交易监控方案》的文档我前后翻了两遍,471页、51个章节,从数据采集一直写到性能压测,基本把“基于大模型做异常交易识别”这件事从0到1的路径铺全了。证券大宗交易单笔体量大、参与主体以机构为主,传统静态规则只能抓“单笔金额超阈值”这类浅层特征,跨账户协同、折价率配合二级市场套利这些隐蔽行为,规则引擎很难覆盖。文档给的方向是:用DeepSeek做交易行为模式识别、市场影响评估,再配合动态阈值校准和规则引擎联动,把预警从“事后复盘”推到“毫秒级实时”这个水位。适合正在做金融风控系统、券商合规监控、或者想在大宗交易场景里落地大模型的开发团队。下面按我拆文档的习惯,从架构、训练、蒸馏、部署到压测逐层拉一遍。
2. 架构与数据链路:六层解耦设计下的多源数据接入和特征量化
2.1 六层架构怎么拆:为什么分层解耦在大宗交易场景里不是套路而是刚需
文档给出了一个很明确的六层架构:数据采集层、数据预处理层、模型层、交易行为识别与市场影响评估层、实时预警层、运维与优化层。每层之间通过标准化接口和消息队列交互,不是简单画个分层图就完事。大宗交易和普通行情监控最大的区别在于数据源杂、突发流量集中,开盘后30分钟和收盘前30分钟往往是全天交易最密集的时段,如果采集、清洗、推理串在一个进程里,任何一个环节抖动都会把整条预警链路拖垮。
分层解耦的实际收益体现在两个地方。一是训练和推理的物理隔离——模型层里,训练模块跑在GPU集群上,离线更新;推理模块轻量化部署在混合集群,实时响应。两者通过模型版本管理模块松耦合,训练抖动不会影响盘中监控。二是扩展接口预留了插件化空间,新增一个交易所的数据源或者新增一种异常交易类型的识别模块,不需要动核心架构代码,只要适配标准化接口就能接进来。这对金融系统尤为重要,因为业务规则在变,监管要求在变,架构如果耦合太重,每一次变更都是重构级别的风险。
2.2 数据采集:Kafka接入、Redis缓存与双路落盘的实操配置
采集层是整个链路的入口,文档把数据源分成三类:结构化数据(成交明细、资金流水)、非结构化数据(公告文本、研报、交易备注)、半结构化数据(监管报备XML、账户关联关系)。接入协议也杂,TCP、HTTP、Kafka、SFTP都得兼容。这里最见功夫的不是“能接进来”,而是“接进来之后怎么缓冲、怎么落盘、怎么保证不丢”。
我按文档里的思路整理了一套常见做法:
from kafka import KafkaConsumer import json import redis from datetime import datetime consumer = KafkaConsumer( 'block_trade_raw', bootstrap_servers=['192.168.1.10:9092', '192.168.1.11:9092'], group_id='block_trade_monitor', enable_auto_commit=False, max_poll_records=5000 ) r = redis.Redis(host='192.168.1.20', port=6379, decode_responses=True) def is_trading_hours(): now = datetime.now().time() return (datetime.strptime('09:30', '%H:%M').time() <= now <= datetime.strptime('11:30', '%H:%M').time()) or \ (datetime.strptime('13:00', '%H:%M').time() <= now <= datetime.strptime('15:00', '%H:%M').time()) for msg in consumer: record = json.loads(msg.value) cache_ttl = 900 if is_trading_hours() else 3600 # 盘中15分钟,盘后1小时 r.setex(f"raw:{record['trade_id']}", cache_ttl, msg.value) if not record.get('price') or not record.get('volume'): record['quality_flag'] = 'MISSING_KEY_FIELD' consumer.commit()这里有几个参数要细说。enable_auto_commit=False配合手动commit(),是为了保证“至少一次”语义,也就是说性能允许的前提下,宁可重复消费也不能丢消息。max_poll_records=5000控制单次拉取上限,防止批量数据瞬间撑爆下游。Redis的TTL按交易时段动态调整,盘中15分钟、盘后1小时,这个设计很实用——盘中的实时性要求高,数据没必要长时间留在一级缓存里,盘后数据则要为复盘分析保留更长时间。
采集到的数据走双路落盘:原始数据加采集元数据写入HDFS供离线训练,同时写入时序数据库InfluxDB供实时查询。这条双路设计我特别认可,因为离线训练需要海量历史数据,实时监控需要快速点查,两种存储引擎各有擅长的场景,硬塞进一个库里两头都不讨好。
2.3 数据预处理:缺失值、异常值、重复数据的三道关卡
采集层进来的数据不能直接喂给模型,文档专门用了一整章讲预处理,核心是三件事:清洗、标准化、融合。
import pandas as pd import numpy as np df = pd.read_csv('block_trade_raw.csv', dtype={'stock_code': str, 'account_id': str}) # 1. 缺失值处理:关键字段缺失直接剔除,非关键字段用同股票同时段成交均价填充 key_fields = ['stock_code', 'trade_time', 'trade_price', 'trade_volume'] df = df.dropna(subset=key_fields) df['trade_amount'] = df['trade_amount'].fillna( df.groupby('stock_code')['trade_price'].transform('mean') * df['trade_volume'] ) # 2. 异常值过滤:成交价偏离当日均价±30%标记,偏离监管线±10%直接拦截 df['deviation'] = (df['trade_price'] - df['daily_vwap']) / df['daily_vwap'] df['is_abnormal'] = df['deviation'].abs() > 0.30 df['is_regulatory_violation'] = df['deviation'].abs() > 0.10 # 3. 重复数据去重:股票代码+成交时间+成交金额+账户号构成唯一键 df = df.drop_duplicates(subset=['stock_code', 'trade_time', 'trade_amount', 'account_id']) # 4. 标准化:时间戳统一为毫秒级UTC+8,金额统一为Decimal df['trade_time'] = pd.to_datetime(df['trade_time'], unit='ms', utc=True).tz_convert('Asia/Shanghai') from decimal import Decimal df['trade_amount'] = df['trade_amount'].astype(float).map(lambda x: Decimal(str(x)).quantize(Decimal('0.01')))这段代码里值得关注的是异常值过滤的“双阈值”设计。±30%偏离用来标记可疑样本,±10%偏离直接判定违规——后者严格对应监管规则中大宗交易价格不得偏离收盘价特定幅度的红线。传统做法往往只设一个阈值,要么太松导致大量噪音进入模型,要么太紧把正常交易误杀。双阈值的好处是让数据分层:明显违规的直接拦截走人工复核,边缘情况的留待模型判断,这个思路贯穿了文档后续的预警设计。
2.4 特征工程:价格、成交量、对手方三大维度怎么量化
预处理之后的下一步是特征提取。文档里的特征体系拆得很细,核心维度包括价格特征(折价率、相对均价偏离度)、成交量特征(单笔成交量占流通股本比例、成交密集度)、对手方特征(对手方历史交易活跃度、关联账户重合度)。这些特征不是简单算个数就行,关键在量化建模方式。
折价率是大宗交易最核心的特征。大宗交易相比二级市场竞价交易通常存在折价,但折价率落在什么区间是合理的,需要结合个股流动性、近期波动率、是否处于解禁期来综合判断。文档的做法是把折价率拆成原始折价率、相对近期均价折价率、经流动性调整的折价率三个层次,让模型能区分“正常议价空间”和“异常压低价格”。成交量维度也不能只看绝对额,单笔成交量占流通股本的比例更能反映对市场的冲击潜力,这是一个标准化思路——把绝对量转换成相对量,跨股票可比性就出来了。
对手方维度是做行为模式识别最容易被忽视的一块。只看单笔交易的价格和成交量,很难发现多个账户协同操作,但如果把对手方历史交易频次、与其他账户的共现关系、账户开立时长这些信息纳进来,隐藏的关联链条就有机会浮出水面。这部分特征在文档第25章和第27章反复出现,分别落在单笔交易特征提取和跨账户关联分析里。
3. 模型训练与轻量化微调:DeepSeek适配大宗交易场景的关键路径
3.1 数据集划分:分层抽样与时间序列拆分为什么不能二选一
训练数据集怎么切,直接影响模型评估的可信度。文档第11章讲得很透彻:大宗交易数据同时具备分布不均衡和时间相关性两个特点,只做随机划分会导致训练集里混入未来信息,只做时间序列划分又可能让样本类别分布偏移。
我拆完这章后总结的实践是:先按时间窗口切分,再在每个窗口内做分层抽样。具体来说,把数据按时间排序后,前80%作为训练集,中间10%作为验证集,最后10%作为测试集。在这个基础上,每个集合内部按异常交易类型做分层抽样,保证内幕交易类、操纵市场类、异常集中成交类样本在三个集合中的比例接近。这样既避免时间泄露,又能稳定评估模型在不同异常类型上的表现。
数据集切分的验证指标也要提前定好。文档推荐对比三个集合中关键特征(折价率、成交量占比、账户关联度)的分布差异,如果某个特征在训练集和测试集中的均值差超过5%,说明切分方式引入了偏差,需要调整窗口大小或者抽样比例。这条在实操中很管用,很多团队模型离线评估很好、上线就翻车,问题往往就出在数据集切分这一步没有校验分布一致性。
3.2 LoRA与QLoRA微调:小样本下的增量数据扩充与参数配置
通用大模型直接拿来做大宗交易识别,最大的问题是“不懂行话”。折价率合理区间、锁定期规则、减持新规这些领域知识,通用语料里覆盖不足,必须用领域数据微调。文档第16章专门对比了LoRA和QLoRA在DeepSeek模型上的适配效果,结论很明确:数据量在万级以下优先QLoRA,数据量到十万级可以切换LoRA。
model_name_or_path: deepseek-llm-7b-base dataset_path: ./data/block_trade_finetune.jsonl lora: r: 16 lora_alpha: 32 lora_dropout: 0.05 target_modules: ["q_proj", "k_proj", "v_proj", "o_proj"] training: learning_rate: 2e-4 batch_size: 4 gradient_accumulation_steps: 8 num_epochs: 3 warmup_ratio: 0.03 weight_decay: 0.01 max_seq_len: 2048 fp16: true这套配置里几个参数值得推敲。r=16是LoRA低秩矩阵的秩,决定了新增可训练参数量的大小,16在表达能力和过拟合风险之间是比较稳妥的平衡点。lora_alpha=32通常设为r的2倍,控制LoRA权重在原始权重中的叠加比例,这个比例不宜过大,否则微调阶段可能破坏预训练阶段学到的通用语义。gradient_accumulation_steps=8配合batch_size=4等效出32的全局批次大小,既照顾显存限制,又保证梯度估计的稳定性。target_modules只选注意力层的四个投影矩阵,不碰FFN层,这是经过验证的高效组合。
小样本场景下,文档第15章提出了增量数据扩充的思路。一个值得借鉴的做法是基于规则生成半标注样本:把历史交易记录中匹配到监管处罚案例的交易提取出来,作为异常样本的正例;再通过改写交易金额、时间、账户编号等字段生成同分布的负例。这样扩充出来的数据虽然不如人工标注精确,但能让模型先学到“异常交易长什么样”,再用少量高质量标注数据做第二轮精修。
3.3 训练监控:损失曲线分析与过拟合预警机制的落地
训练过程中的损失曲线分析是判断模型状态的核心手段。文档第13章把过拟合的量化判定标准写得很具体:当训练损失持续下降而验证损失连续5个epoch不降反升,触发过拟合预警;当训练损失和验证损失的差距超过训练损失的15%时,判定为过拟合风险等级较高。
import matplotlib.pyplot as plt import numpy as np train_loss = np.load('train_loss.npy') val_loss = np.load('val_loss.npy') # 验证损失连续epoch上升检测 trigger_count = 0 for i in range(1, len(val_loss)): if val_loss[i] > val_loss[i-1]: trigger_count += 1 else: trigger_count = 0 if trigger_count >= 5: print(f"Epoch {i+1}: 过拟合预警触发,验证损失连续5个epoch上升") break # 训练验证损失差距比例监控 gap_ratio = (val_loss - train_loss) / train_loss if gap_ratio[-1] > 0.15: print(f"过拟合风险等级较高,gap_ratio={gap_ratio[-1]:.4f}")预警触发后的策略文档也给了明确建议:第一优先是提前停止训练,保存验证损失最低的checkpoint;如果还没到理想效果,则下调学习率并加大dropout。这套机制比人工盯着损失曲线凭感觉判断靠谱得多,也方便接入自动化的训练流水线,让每次微调迭代都有统一的判定标准。
4. 模型蒸馏与推理加速:从70B到7B的部署落地工程
4.1 蒸馏方案设计:为什么大宗交易场景特别适合做蒸馏
大宗交易实时预警对推理延迟有硬性要求,毫秒级响应是目标,而70B级别的DeepSeek原始模型跑一次推理在GPU上的耗时很难压到预期水位。文档第18章给出的路径是:先把大模型蒸馏到7B甚至更小规模,再结合TensorRT和ONNX做推理加速,最终在精度损失可控的前提下满足实时性。
蒸馏的关键在蒸馏数据集的设计,文档第19章提到了一个核心矛盾——既要保留大模型从海量语料中学到的领域知识,又要尽量压缩数据集规模来降低蒸馏成本。实践上的解法是采样策略:从原始训练数据中按异常交易类型分层采样,每类保留难样本(即大模型预测置信度较低的样本),因为这些样本包含更多决策边界信息,比随机采样效率高得多。
蒸馏温度T是另一个影响效果的核心参数。温度越高,教师模型输出的软标签分布越平滑,学生模型能学到类别间的相似结构;温度太低,软标签退化成近似硬标签,蒸馏就失去了意义。文档第20章给出的迭代思路是:先在T=2.0到T=4.0的区间做粗扫描,确定一个最优区间后,再以0.2的步长精调,同时观察学生模型在验证集上的准确率和推理延迟变化。蒸馏率(蒸馏数据占全部训练数据的比例)则从30%起步逐步上调,通常蒸馏率在60%-80%区间能取得精度和训练成本的平衡点。
4.2 ONNX转换与TensorRT引擎构建:兼容性和显存优化的实操
模型蒸馏完成之后,部署链路里还有一步绕不开的工程——把PyTorch模型转成ONNX,再构建TensorRT推理引擎。这一步常见坑很多,模型结构和动态维度处理不好,转换后精度就会掉,甚至直接跑不起来。
from transformers import AutoModelForCausalLM, AutoTokenizer import torch model = AutoModelForCausalLM.from_pretrained( "./deepseek-7b-distilled", torch_dtype=torch.float16, device_map="cpu" ) model.eval() dummy_input = torch.ones(1, 128, dtype=torch.long) torch.onnx.export( model, dummy_input, "deepseek_block_trade.onnx", input_names=["input_ids"], output_names=["logits"], dynamic_axes={ "input_ids": {0: "batch", 1: "seq"}, "logits": {0: "batch", 1: "seq"} }, opset_version=17, do_constant_folding=True )dynamic_axes这一步容易被忽略但极其重要。大宗交易的文本输入长度不固定,如果不声明动态轴,ONNX模型只能接受固定128长度的输入,超了截断、短了填充,都会影响识别效果。opset_version=17对应TensorRT 8.6以上版本的兼容范围,版本太低会导致部分算子不被TensorRT支持,转换时报UNSUPPORTED_NODE错误。do_constant_folding=True在转换阶段就把常量计算折叠掉,减少推理时的重复计算,这类优化在批量推理时能省下不少时间。
4.3 蒸馏温度与蒸馏率的联合调优:精度与速度的权衡记录
蒸馏参数调优这事带点玄学,但文档第20章和第21章把流程写得很规范。蒸馏温度调优的前置条件是固定蒸馏率和其他训练超参数,单独改变温度观察效果;蒸馏率调优同理,固定温度。最后做联合验证,对比蒸馏前后模型的端到端识别准确率、推理延迟、资源占用三项指标。
文档给出的一个具体调优记录值得参考:温度从1.0升到2.0时,学生模型在异常交易识别任务上的F1值提升了约2.1个百分点,但温度升到4.0后F1开始回落,原因在于过高的温度让软标签过于平滑,学生模型学到的类间区分度不足。温度2.5搭配蒸馏率70%,在验证集上达到最佳效果:识别准确率相对未蒸馏模型只下降1.3%,而推理延迟从280毫秒压到45毫秒,这个量级的变化对实时预警系统来说是质的提升。
5. 落地避坑指南:数据泄露、标注偏差与阈值误报的排查记录
5.1 时间序列切分里的隐性数据泄露:验证集表现虚高
现象:模型在离线测试集上异常交易识别准确率达到94%,上线后实际预警准确率跌到60%出头,误报率居高不下。
原因:数据集切分时只做了随机划分,没有按时间维度隔离。同一天内同一只股票前后的多笔交易被分到训练集和测试集,模型在训练时已经见过“未来”的信息,测试指标虚高。大宗交易呈现显著的时序自相关性,这种泄露在普通图像分类任务里不常见,但在交易数据里几乎是必然发生。
解决:按照文档第11章的做法,改用“时间窗口切分+窗口内分层抽样”的组合策略。以交易日为单位切分,保证训练集数据时间全部早于测试集,再在窗口内按异常类型分层。从那以后我每次做数据集切分,都会额外计算一遍训练集和测试集在折价率、成交量占比两个核心特征上的分布差异,差异超过5%就重新切。
5.2 标注偏差:业务人员标注的异常样本存在系统性标签噪声
现象:微调后的模型对“减持违规”类异常行为的召回率特别低,但对“异常集中成交”的误报率又特别高。
原因:参与标注的业务人员来自不同岗位,合规背景的标注员熟悉减持规则,标注的规则类异常样本质量高;交易背景的标注员更关注成交量和价格异动,对规则类异常的判断偏差大。文档第8章提到的标注一致性检验指标Kappa系数在这个案例里只有0.62,距离0.8的合格线有明显差距。
解决:建立双人背对背标注+仲裁机制,每条样本由两位标注员独立标注,不一致的样本交由资深合规人员仲裁。同时在标注规范里把“减持新规关于股东持股比例与减持数量的对应关系”这类容易产生分歧的点固化成判定规则表,减少个人经验带来的随机性。标注质量校验不能只看最终准确率,要按异常类型拆开看每个类别的Precision和Recall,分类别统计才能暴露系统性偏差。
5.3 静态阈值导致的市场环境错配:牛熊切换后的误报风暴
现象:同一套异常判定阈值,在震荡市里误报率正常,进入放量上涨阶段后预警数量暴增3倍,其中大部分经人工复核属于正常的大宗交易行为。
原因:阈值是固定的,但市场环境是动态的。市场活跃度高的时候,大宗交易频率和单笔规模天然放大,成交量占比、折价率这些特征的分布整体平移,静态阈值没有跟随市场环境自适应调整的能力。
解决:按文档第33章的思路,引入市场环境特征维度(市场整体换手率、个股波动率、行业板块活跃度)构建动态校准因子。当换手率和波动率上升时,阈值按比例放宽;市场低迷时,阈值相应收紧。这是一个一眼看上去很简单的函数,但实际效果非常明显:
def calibrate_threshold(volatility, turnover_rate, base_threshold=0.5): # 波动率越高、换手率越大,市场噪音越多,阈值适当放宽 market_factor = 1 + 0.3 * (turnover_rate - 0.02) / 0.02 vol_factor = 1 + 0.2 * (volatility - 0.03) / 0.03 return base_threshold * market_factor * vol_factormarket_factor和vol_factor里分母的0.02和0.03是基准换手率和基准波动率,实际部署时需要根据监控标的的历史分布来设定。动态校准机制的落地要跟监控系统联动,校准后的阈值变化要记录审计日志,方便复盘某次预警决策当时的判定依据。
5.4 蒸馏后精度衰减:小模型学不到类别边缘
现象:蒸馏后的7B模型在整体准确率上只掉了1.3%,但是单独看“跨账户协同交易”类别的召回率掉了8个百分点。
原因:蒸馏数据集采样时按异常类型做了分层,但难样本比重不足。跨账户协同交易属于特征维度多、模式隐蔽的类别,大模型在推断这类样本时置信度偏低,产生的高信息量软标签占比不够,小模型没学到足够的判别信息。
解决:重新组织蒸馏数据集,把大模型预测置信度在0.4到0.7之间的样本标记为难样本,按30%的额外比例增补进蒸馏集。同时把蒸馏温度从2.0微调到2.5,软化类别间边界,让学生模型更容易学到相似异常类型之间的细微差别。调整后该类别召回率回升6.5个百分点,整体准确率没有明显回落。
5.5 推理延迟焦虑:批处理大小与显存分配的平衡
现象:TensorRT引擎构建完成后,单条推理延迟从280毫秒优化到45毫秒,但并发量一上来,延迟又飙升到200毫秒以上。
原因:45毫秒是单条请求的测试数据,实际监控场景是批量请求并发进入。TensorRT推理引擎的显存分配策略是静态的,批处理大小设得太大导致显存不足自动降低批次,设得太小又无法充分利用GPU并行能力。
解决:先用性能压测找出批处理大小与延迟的拐点。通常batch_size=8到batch_size=16之间是性价比最高的区间,超过这个区间延迟下降趋缓但显存占用快速上升。配合cudaGraph捕获推理流程,减少kernel启动开销,并发场景下的延迟曲线会平滑很多。性能压测不是可做可不做的环节,而是决定部署配置的最后一道依据。
6. 端到端验证与性能压测:从离线回溯到生产容量规划的一锤定音
6.1 历史数据回溯:离线验证模型的“时间穿梭机”
回溯分析是上线前必须做的一次“时间旅行”。选取过去6到12个月的历史交易数据,按时间顺序回放,让模型和规则引擎在历史数据上跑一遍完整的识别和预警流程,把生成的预警记录与期间实际发生的监管处罚案例、市场异常事件做匹配,计算真正预警率和漏报率。
回溯分析的环境要与生产环境隔离,用独立的数据库和消息队列实例,避免影响实时监控链路。一个值得养成的习惯是:构建一个固定的回溯数据集,每次模型更新都在同一份数据上验证,这样不同版本模型的效果可比性才有保障。数据集里要刻意纳入几类极端场景,比如个股闪崩当天的大宗交易记录、监管新规发布前后的交易数据,这些是检验模型泛化能力的好样本。
6.2 压测场景设计与瓶颈定位:模拟开盘30分钟的高并发冲击
性能压测的重心要放在开盘后30分钟和收盘前30分钟这两个真实的高峰窗口。压测目标是让系统在峰值吞吐下仍然满足“预警延迟不超过500毫秒”这条红线。
压测场景建议按三档设计:正常交易日峰值流量、极端行情下放量交易、故障场景下游系统降级。每档场景都要同步监控数据接入延迟、模型推理延迟、规则引擎匹配耗时、存储写入吞吐四个指标。压测结果出来后,按文档第48章的思路定位瓶颈——如果数据接入层积压明显,优先扩大Kafka分区数并增加消费者实例;如果推理层成为瓶颈,调整TensorRT批处理大小并评估是否需要增加GPU卡;如果规则引擎匹配耗时偏高,走规则条件索引优化。
# 模拟开盘高峰:3台压测机并发发送,持续15分钟 jmeter -n -t block_trade_peak.jmx -l peak_result.jtl \ -Jthreads=300 -Jduration=900 -Jhost=192.168.2.10 \ -Jport=8080 -Jthroughput=5000threads=300模拟300个并发数据源连接,duration=900代表压测持续15分钟,throughput=5000是每秒交易数据注入量。这个量级大致覆盖了中等规模券商在大宗交易高峰时段的处理需求。压测完成后对比各层耗时分布,我一般会要求数据接入、模型推理、规则匹配三段耗时占总延迟的比例大致在3:5:2,如果某一项偏离太多,就回到对应章节去查优化方案。
这份方案文档真正的价值不在于给出某个现成的模型,而在于把“大模型做交易监控”这件事从采集、训练、蒸馏、部署到压测的每个环节拆出了可执行的参数、可对比的选型和可复现的步骤。从那以后我拿到类似的行业落地方案,都会先按数据链路、模型训练、部署优化、验证压测四个维度拆一遍再动手,这套拆法帮我避开了不少部署翻车的坑。希望帮到你。
本文还有配套的精品资源,点击获取