当前位置: 首页 > article >正文

CANN量化注意力梯度算子

aclnnQuantFlashAttentionScoreGrad【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品xAtlas A2 训练系列产品/Atlas A2 推理系列产品xAtlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×功能说明接口功能实现“Transformer Attention Score”的融合量化的反向计算。计算公式$$ YSoftmax(\frac{\hat{Q}\hat{K}^T*(dS_q*dS_k)}{\sqrt{d}})\hat{V}*dS_v $$为方便表达以变量$S$和$P$表示计算公式$$ S\frac{\hat{Q}\hat{K}^T*(dS_q * dS_k)}{\sqrt{d}} $$$$ PSoftmax(S) $$$$ YP\hat{V} * dS_v $$则注意力的反向计算公式为$$ \hat{dS} dS * dsScale $$$$ \hat{P} P * pScale $$$$ dV\hat{P}^T\hat{dY} * (dS_{dy} * dS_p) $$$$ dQ\frac{(\hat{(dS)}\hat{K})}{\sqrt{d}}(dS_{ds} * dS_k) $$$$ dK\frac{(\hat{(dS)}^T*\hat{Q})}{\sqrt{d}} * (dS_{ds} * dS_q) $$函数原型每个算子分为两段式接口必须先调用“aclnnQuantFlashAttentionScoreGradGetWorkspace”接口获取计算所需workspace大小以及包含了算子计算流程的执行器再调用“aclnnQuantFlashAttentionScoreGrad”接口执行计算。aclnnStatus aclnnQuantFlashAttentionScoreGradGetWorkspace( const aclTensor *query, const aclTensor *keyIn, const aclTensor *value, const aclTensor *dy, const aclTensor *attenMaskOptional, const aclTensor *softmaxMax, const aclTensor *softmaxSum, const aclTensor *attentionIn, const aclTensor *dScaleQ, const aclTensor *dScaleK, const aclTensor *dScaleV, const aclTensor *dScaleDy, const aclTensor *dsScale, const aclTensor *pScale, double scaleValue, int64_t preTokens, int64_t nextTokens, int64_t headNum, char *inputLayout, int64_t sparseMode, int64_t outDtype, aclTensor *dqOut, aclTensor *dkOut, aclTensor *dvOut, uint64_t *workspaceSize, aclOpExecutor **executor)aclnnStatus aclnnQuantFlashAttentionScoreGrad( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)aclnnQuantFlashAttentionScoreGradGetWorkspace参数说明参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续Tensorquery输入公式中的Q。数据类型与keyIn/value一致。HIFLOAT8ND4√keyIn输入公式中的K。数据类型与query/value一致。HIFLOAT8ND4√value输入公式中的V。数据类型与query/keyIn一致。HIFLOAT8ND4√dy输入公式中的dY。-HIFLOAT8ND4√attenMaskOptional可选输入暂不使用BOOL、UINT8ND4√softmaxMax输入注意力正向计算的中间输出。shape[B,N,Sq,1]。FLOAT32ND4√softmaxSum输入注意力正向计算的中间输出。shape[B,N,Sq,1]。FLOAT32ND4√attentionIn输入注意力正向的最终输出。数据类型和shape与query一致。BFLOAT16ND4√dScaleQ输入是query输入的反量化参数。支持[B,N1,Ceil(Sq/blocksize),1], blocksize目前支持512FLOAT32ND4√dScaleK输入是key输入的反量化参数。支持[B,N2,Ceil(Skv/blocksize),1], blocksize目前支持512FLOAT32ND4√dScaleV输入是value输入的反量化参数。支持[B,N2,Ceil(Skv/blocksize),1], blocksize目前支持512FLOAT32ND4√dScaleDy输入是dy输入的反量化参数。支持[B,N1,Ceil(Sq/blocksize),1], blocksize目前支持512FLOAT32ND4√dsScale输入是ds的量化参数。支持[1]FLOAT32ND1√pScale输入是p的量化参数。支持[1]FLOAT32ND1√scaleValue输入公式中的scale缩放系数默认值为1。-DOUBLE---preTokens可选输入暂不使用。-INT64---nextTokens可选输入暂不使用。-INT64---headNum输入单卡head个数对应query的N轴。-INT64---inputLayout输入query/key/value的数据排布格式。支持BSND。String---sparseMode可选输入暂不使用。-INT64---outDtype输入值为0表示dqOut等输出是FLOAT16为1表示是BFLOAT16。-INT64---dqOut输出公式中的dQquery的梯度。-BFLOAT16ND4√dkOut输出公式中的dKkeyIn的梯度。-BFLOAT16ND4√dvOut输出公式中的dVvalue的梯度。-BFLOAT16ND4√workspaceSize输出返回Device侧需要申请的workspace大小。-----executor输出返回算子执行器包含计算流程。-----返回值返回aclnnStatus状态码具体参见aclnn返回码。第一段接口完成入参校验出现以下场景时报错返回码错误码描述ACLNN_ERR_PARAM_NULLPTR161001传入参数是必选输入输出或者必选属性且是空指针。ACLNN_ERR_PARAM_INVALID161002query、keyIn、value、dy、softmaxMax、softmaxSum、attentionIn、dScaleQ、dScaleK、dScaleV、dScaleDy、dqOut、dkOut、dvOut的数据类型和shape不在支持的范围内。aclnnQuantFlashAttentionScoreGrad参数说明参数名输入/输出描述workspace输入在Device侧申请的workspace内存地址。workspaceSize输入在Device侧申请的workspace大小由第一段接口aclnnQuantFlashAttentionScoreGradGetWorkspaceSize获取。executor输入op执行器包含了算子计算流程。stream输入指定执行任务的Stream。返回值aclnnStatus返回状态码具体参见aclnn返回码。约束说明确定性计算aclnnQuantFlashAttentionScoreGrad默认确定性实现。输入query、key、value、dy的约束如下Bbatchsize必须相等。inputLayout必须一致。D支持128。输入query/dy的N和key/value的N必须相等。关于数据shape的约束目前支持以下场景LayoutQueryShapeKeyShapeBSND[1, 54000, 5, 128][1, 54000, 5, 128]BSND[1, 9360, 40, 128][1, 9360, 40, 128]BSND[1, 54000, 10, 128][1, 54000, 10, 128]BSND[1, 9360, 80, 128][1, 9360, 80, 128]BSND[1, 57600, 5, 128][1, 57600, 5, 128]BSND[1, 7200, 40, 128][1, 512, 40, 128]部分场景下如果计算量过大可能会导致算子执行超时aicore error类型报错errorStr为timeout or trap error此时建议做轴切分处理注这里的计算量会受B、S、N、D等参数的影响值越大计算量越大。关于softmaxMax与softmaxSum参数的约束输入格式固定为[B, N, S, 1]。headNum的取值必须和传入的Query中的N值保持一致。调用示例示例代码如下仅供参考具体编译和执行过程请参考编译与运行样例。#include iostream #include vector #include cstdint #include cmath #include acl/acl.h #include aclnnop/aclnn_flash_attention_score_grad.h #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shapeSize 1; for (auto i : shape) { shapeSize * i; } return shapeSize; } void PrintOutResult(std::vectorint64_t shape, void** deviceAddr) { auto size GetShapeSize(shape); std::vectorfloat resultData(size, 0); auto ret aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), *deviceAddr, size * sizeof(resultData[0]), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result from device to host failed. ERROR: %d\n, ret); return); for (int64_t i 0; i size; i) { LOG_PRINT(mean result[%ld] is: %f\n, i, resultData[i]); } } int Init(int32_t deviceId, aclrtStream* stream) { // 固定写法资源初始化 auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return ret); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); return ret); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); return ret); return 0; } template typename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor) { auto size GetShapeSize(shape) * sizeof(T); // 调用aclrtMalloc申请device侧内存 auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return ret); // 调用aclrtMemcpy将host侧数据拷贝到device侧内存上 ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return ret); // 计算连续tensor的strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } // 调用aclCreateTensor接口创建aclTensor *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } int main() { // 1. 固定写法device/stream初始化参考acl API手册 // 根据自己的实际device填写deviceId int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return ret); // 2. 构造输入与输出需要根据API的接口自定义构造 int64_t B 1; int64_t N1 40; int64_t N2 40; int64_t S1 7200; int64_t S2 512; int64_t D 128; int64_t H1 N1 * D; int64_t H2 N2 * D; int64_t blockNumQ (S1 511)/ 512; int64_t blockNumKV (S2 511)/ 512; int64_t q_size B * N1 * S1 * D; int64_t kv_size B * N2 * S2 * D; int64_t softmax_size B * N1 * S1 * 1; int64_t scaleSizeQ B * N1 * blockNumQ * 1; int64_t scaleSizeKV B * N1 * blockNumKV * 1; std::vectorint64_t qShape {B, S1, N1, D}; std::vectorint64_t kShape {B, S2, N2, D}; std::vectorint64_t vShape {B, S2, N2, D}; std::vectorint64_t dxShape {B, S1, N1, D}; std::vectorint64_t attenmaskShape {S1, S2}; std::vectorint64_t softmaxMaxShape {B, N1, S1, 1}; std::vectorint64_t softmaxSumShape {B, N1, S1, 1}; std::vectorint64_t attentionInShape {B, S1, N1, D}; std::vectorint64_t dScaleQShape {B, N1, blockNumQ, 1}; std::vectorint64_t dScaleKShape {B, N1, blockNumKV, 1}; std::vectorint64_t dScaleVShape {B, N1, blockNumKV, 1}; std::vectorint64_t dScaleDyShape {B, N1, blockNumQ, 1}; std::vectorint64_t dsScaleShape {1}; std::vectorint64_t pScaleShape {1}; std::vectorint64_t dqShape {B, S1, N1, D}; std::vectorint64_t dkShape {B, S2, N2, D}; std::vectorint64_t dvShape {B, S2, N2, D}; std::vectorint64_t printShape {B, S2, 1, D}; void* qDeviceAddr nullptr; void* kDeviceAddr nullptr; void* vDeviceAddr nullptr; void* dxDeviceAddr nullptr; void* softmaxMaxDeviceAddr nullptr; void* softmaxSumDeviceAddr nullptr; void* attentionInDeviceAddr nullptr; void* dScaleQDeviceAddr nullptr; void* dScaleKDeviceAddr nullptr; void* dScaleVDeviceAddr nullptr; void* dScaleDyDeviceAddr nullptr; void* dsScaleDeviceAddr nullptr; void* pScaleDeviceAddr nullptr; void* dqDeviceAddr nullptr; void* dkDeviceAddr nullptr; void* dvDeviceAddr nullptr; aclTensor* q nullptr; aclTensor* k nullptr; aclTensor* v nullptr; aclTensor* dx nullptr; aclTensor* attenmask nullptr; aclTensor* softmaxMax nullptr; aclTensor* softmaxSum nullptr; aclTensor* attentionIn nullptr; aclTensor* dScaleQ nullptr; aclTensor* dScaleK nullptr; aclTensor* dScaleV nullptr; aclTensor* dScaleDy nullptr; aclTensor* dsScale nullptr; aclTensor* pScale nullptr; aclTensor* dq nullptr; aclTensor* dk nullptr; aclTensor* dv nullptr; std::vectoruint8_t qHostData(q_size, 1); std::vectoruint8_t kHostData(kv_size, 1); std::vectoruint8_t vHostData(kv_size, 1); std::vectoruint8_t dxHostData(q_size, 1); std::vectorfloat softmaxMaxHostData(softmax_size, 3.0); std::vectorfloat softmaxSumHostData(softmax_size, 3.0); std::vectorfloat attentionInHostData(q_size, 1.0); std::vectorfloat dScaleQHostData(scaleSizeQ, 1.0); std::vectorfloat dScaleKHostData(scaleSizeKV, 1.0); std::vectorfloat dScaleVHostData(scaleSizeKV, 1.0); std::vectorfloat dScaleDyHostData(scaleSizeQ, 1.0); std::vectorfloat dsScaleHostData(1, 1.0); std::vectorfloat pScaleHostData(1, 1.0); std::vectorfloat dqHostData(q_size, 0); std::vectorfloat dkHostData(kv_size, 0); std::vectorfloat dvHostData(kv_size, 0); ret CreateAclTensor(qHostData, qShape, qDeviceAddr, aclDataType::ACL_HIFLOAT8, q); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(kHostData, kShape, kDeviceAddr, aclDataType::ACL_HIFLOAT8, k); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(vHostData, vShape, vDeviceAddr, aclDataType::ACL_HIFLOAT8, v); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dxHostData, dxShape, dxDeviceAddr, aclDataType::ACL_HIFLOAT8, dx); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(softmaxMaxHostData, softmaxMaxShape, softmaxMaxDeviceAddr, aclDataType::ACL_FLOAT, softmaxMax); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(softmaxSumHostData, softmaxSumShape, softmaxSumDeviceAddr, aclDataType::ACL_FLOAT, softmaxSum); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(attentionInHostData, attentionInShape, attentionInDeviceAddr, aclDataType::ACL_BF16, attentionIn); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dScaleQHostData, dScaleQShape, dScaleQDeviceAddr, aclDataType::ACL_FLOAT, dScaleQ); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dScaleKHostData, dScaleKShape, dScaleKDeviceAddr, aclDataType::ACL_FLOAT, dScaleK); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dScaleVHostData, dScaleVShape, dScaleVDeviceAddr, aclDataType::ACL_FLOAT, dScaleV); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dScaleDyHostData, dScaleDyShape, dScaleDyDeviceAddr, aclDataType::ACL_FLOAT, dScaleDy); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dsScaleHostData, dsScaleShape, dsScaleDeviceAddr, aclDataType::ACL_FLOAT, dsScale); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(pScaleHostData, pScaleShape, pScaleDeviceAddr, aclDataType::ACL_FLOAT, pScale); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dqHostData, dqShape, dqDeviceAddr, aclDataType::ACL_BF16, dq); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dkHostData, dkShape, dkDeviceAddr, aclDataType::ACL_BF16, dk); CHECK_RET(ret ACL_SUCCESS, return ret); ret CreateAclTensor(dvHostData, dvShape, dvDeviceAddr, aclDataType::ACL_BF16, dv); CHECK_RET(ret ACL_SUCCESS, return ret); double scaleValue 1.0/sqrt(128); int64_t preTokens INT32_MAX; int64_t nextTokens INT32_MAX; int64_t headNum N1; int64_t sparseMode 0; char layOut[6] {B, S, N, D, 0}; int64_t outDtype 1; // 3. 调用CANN算子库API需要修改为具体的Api名称 uint64_t workspaceSize 0; aclOpExecutor* executor; // 调用aclnnFlashAttentionScoreGradV2第一段接口 ret aclnnQuantFlashAttentionScoreGradGetWorkspaceSize(q, k, v, dx, attenmask, softmaxMax, softmaxSum, attentionIn, dScaleQ, dScaleK, dScaleV,dScaleDy, dsScale, pScale, scaleValue, preTokens, nextTokens, headNum, layOut, sparseMode, outDtype, dq, dk, dv, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnQuantFlashAttentionScoreGradGetWorkspaceSize failed. ERROR: %d\n, ret); return ret); // 根据第一段接口计算出的workspaceSize申请device内存 void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } // 调用aclnnFlashAttentionScoreGradV2第二段接口 ret aclnnQuantFlashAttentionScoreGrad(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnFlashAttentionScoreGradV2 failed. ERROR: %d\n, ret); return ret); // 4. 固定写法同步等待任务执行结束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); return ret); // 5. 获取输出的值将device侧内存上的结果拷贝至host侧需要根据具体API的接口定义修改 PrintOutResult(printShape, dqDeviceAddr); PrintOutResult(printShape, dkDeviceAddr); PrintOutResult(printShape, dvDeviceAddr); // 6. 释放aclTensor和aclScalar需要根据具体API的接口定义修改 aclDestroyTensor(q); aclDestroyTensor(k); aclDestroyTensor(v); aclDestroyTensor(dx); aclDestroyTensor(attenmask); aclDestroyTensor(softmaxMax); aclDestroyTensor(softmaxSum); aclDestroyTensor(attentionIn); aclDestroyTensor(dScaleQ); aclDestroyTensor(dScaleK); aclDestroyTensor(dScaleV); aclDestroyTensor(dScaleDy); aclDestroyTensor(dsScale); aclDestroyTensor(pScale); aclDestroyTensor(dq); aclDestroyTensor(dk); aclDestroyTensor(dv); // 7. 释放device资源 aclrtFree(qDeviceAddr); aclrtFree(kDeviceAddr); aclrtFree(vDeviceAddr); aclrtFree(dxDeviceAddr); aclrtFree(softmaxMaxDeviceAddr); aclrtFree(softmaxSumDeviceAddr); aclrtFree(attentionInDeviceAddr); aclrtFree(dScaleQDeviceAddr); aclrtFree(dScaleKDeviceAddr); aclrtFree(dScaleVDeviceAddr); aclrtFree(dScaleDyDeviceAddr); aclrtFree(dsScaleDeviceAddr); aclrtFree(pScaleDeviceAddr); aclrtFree(dqDeviceAddr); aclrtFree(dkDeviceAddr); aclrtFree(dvDeviceAddr); if (workspaceSize 0) { aclrtFree(workspaceAddr); } aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }【免费下载链接】ops-transformer本项目是CANN提供的transformer类大模型算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-transformer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN量化注意力梯度算子

aclnnQuantFlashAttentionScoreGrad 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-transformer 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT…...

lvgl_v8之arc控件修改前景色和背景色代码示例

static void arc_draw_event_cb(lv_event_t* e) {lv_event_code_t code = lv_event_get_code(e);...

云原生开发脚手架Jetski:从工具集设计到自动化部署实战

1. 项目概述:从“Jetski”到“Jetpack”的云端开发范式革新最近在GitHub上看到一个名为“jetski”的项目,由开发者Calfur创建。初看这个名字,很多人可能会联想到水上摩托艇,但在软件开发的语境下,它指向的是一种截然不…...

通用人工智能系统(GPAIS)架构、挑战与可信治理实践

1. 通用人工智能系统(GPAIS)究竟是什么?如果你关注AI领域,最近一定频繁听到“通用人工智能系统”(General-Purpose AI Systems, GPAIS)这个词。它听起来像是科幻电影里那种无所不能的AI,但现实中…...

对话式AI的学术诚信挑战:从技术原理到架构级解决方案

1. 项目概述:当对话式AI成为双刃剑作为一名长期关注人工智能技术演进与落地的从业者,我见证了从早期基于规则的聊天机器人到如今以ChatGPT为代表的大型语言模型(LLM)的惊人飞跃。这项技术的核心,在于其基于Transformer…...

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑操作效率提升200%

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的电脑操作效率提升200% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows右键菜单…...

2026国内GPT API稳定服务商TOP10:企业级99.9%可用率口碑榜

摘要: 选GPT API服务商还在纠结稳定性?2026年的真实评测报告告诉你,企业级API网关的99.9%可用率不再是口号。本文从平台可用率、网络延迟、成本控制、合规安全四大维度,结合第三方实测数据,为你整理国内GPT API稳定服务…...

ChatCat:基于Electron的本地AI聊天客户端部署与配置指南

1. 项目概述:一个开源的本地AI聊天应用最近在折腾本地大语言模型(LLM)的朋友,可能都绕不开一个核心痛点:如何找到一个既轻量、易部署,又功能强大、界面友好的客户端来管理你的模型和对话?如果你…...

多模态大模型Awesome列表:从资源导航到高效学习与开发实践

1. 项目概述:一个多模态大模型的“藏宝图” 如果你最近在折腾大语言模型,尤其是对能“看懂”图片、“听懂”声音的多模态模型感兴趣,那你大概率已经听过或搜过“Awesome”系列的开源项目。这类项目通常是一个精心整理的列表,像一张…...

一键提取视频PPT:开源智能视频内容自动化提取的革命性工具

一键提取视频PPT:开源智能视频内容自动化提取的革命性工具 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 智能视频处理和内容自动化提取正在改变知识管理的工作流程。ex…...

ACL 2025 最佳论文解读:《Language Models Resist Alignment: Evidence From Data Compression》

ACL 2025 最佳论文解读:《Language Models Resist Alignment: Evidence From Data Compression》 本文面向大模型工程师和 NLP 从业者,帮助读者理解 ACL 2025 最佳论文《Language Models Resist Alignment: Evidence From Data Compression》的核心贡献…...

09-扩展知识——05. date 类 - 处理日期

05. date 类 - 处理日期 概述 date 类是 datetime 模块中专门处理日期(年、月、日)的类,不包含时间和时区信息。它是日常日期操作中最常用的类之一。维度内容What处理日期(年、月、日)的类Why专门处理日历日期&#xf…...

React聊天机器人组件集成指南:从UI定制到AI后端连接

1. 项目概述与核心价值最近在折腾一个基于React的前端聊天机器人项目,核心想法是把类似ChatGPT的对话交互体验,无缝集成到自己的Web应用里。这个需求其实挺普遍的,无论是做客服助手、智能问答面板,还是想给自己的产品加个AI对话的…...

STM32F103 学习笔记-21-串口通信(第5节)—串口2345代码移植和讲解

本章基于 STM32F103 标准外设库开发,从最基础的“串口是什么”讲起,通过生活化类比拆解硬件原理,配合逐行注释的可运行代码,让零基础读者读完就能实现单片机与电脑的双向通信。一、什么是串口通信?1.1 串口的本质&…...

保姆级 Kali Linux 安装教程|零基础小白也能看懂,从镜像下载到虚拟机配置全程图文详解,零报错上手

kali 背景 基于Debian的Linux操作系统 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,Back…...

LLMCompiler:大语言模型并行函数调用编译器原理与实践

1. 项目概述:一个为LLM设计的“并行函数调用编译器”如果你正在构建基于大语言模型(LLM)的智能体应用,并且被工具调用(Function Calling)的串行延迟和高昂成本所困扰,那么LLMCompiler这个项目值…...

2026 年了,国产大模型和 GPT/Claude的差距还有多大?

作为一名每天要在终端、代码库和几十个 API 接口里反复横跳的开发者,我在这几年见证了 AI 行业最疯狂的三年。记得 2023 年大家还在笑话国产大模型只会“套壳”,2024 年开始被 DeepSeek 的性价比震撼,而到了 2026 年的今天,坐在电…...

通用人工智能系统(GPAIS)的技术挑战与可信AI治理框架

1. GPAIS:从概念到现实,我们离“通用”还有多远?如果你关注AI领域,最近几年一定被各种“全能”模型刷过屏。从能写代码、画图、聊天的ChatGPT,到能处理多模态信息的GPT-4V,再到各种宣称能“理解世界”的智能…...

容器是怎么管理 Bean 的?

文章目录1. 核心蓝图:BeanDefinition2. 核心管理流程:生命周期流水线第一阶段:准备与实例化第二阶段:装配与填充第三阶段:初始化(Initialization)第四阶段:生存与销毁3. 核心机制&am…...

医学影像分割:2D超图像与3D网络性能对比与选型指南

1. 项目概述:从“切片”到“体素”的认知跃迁在医学影像分析领域,分割任务一直是核心中的核心。无论是肿瘤的勾画、器官的量化,还是病灶的追踪,精准的分割都是后续诊断、治疗规划和疗效评估的基石。长久以来,处理三维医…...

Bean 会被 JVM 回收吗?

文章目录核心结论:**会,但前提是它必须变得“不可达”。**1. Singleton Bean(单例):通常与容器同生死2. Prototype Bean(多例):管生不管死3. 决定 Bean 被回收的具体条件总结对照表核…...

Bean 什么时候会被销毁?

文章目录 1. 核心触发时机:容器关闭2. 不同作用域(Scope)的差异3. 销毁逻辑的具体执行顺序 Bean 的销毁时机主要取决于它的 作用域(Scope) 以及 容器(ApplicationContext)的状态。 在 Spring 中…...

航空发动机齿轮有限元可靠性分析与齿廓修形优化【附仿真】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)多保真度主动学习代理模型与模型修正: …...

CANN/hcomm通信域初始化

HcclCommInitRootInfo 【免费下载链接】hcomm HCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT:…...

OBS虚拟摄像头插件:4个虚拟摄像头同时工作的终极指南

OBS虚拟摄像头插件:4个虚拟摄像头同时工作的终极指南 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obsv/obs-virtual-cam 还在为OBS直播画面只能分享到一个应用而烦恼吗?今天我要介绍的obs-virtual-cam插件&…...

ThinkPad风扇控制革命:如何用TPFanCtrl2告别过热与噪音困扰

ThinkPad风扇控制革命:如何用TPFanCtrl2告别过热与噪音困扰 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 在ThinkPad用户群体中,风扇控制一直…...

深度解析 MCP (Model Context Protocol):构建 AI Agent 的核心纽带

深度解析 MCP (Model Context Protocol):构建 AI Agent 的核心纽带 摘要 在当前大模型(LLM)向智能体(Agent)演进的过程中,如何打破“信息孤岛”,实现模型与外部工具、数据库及本地文件系统的标准…...

收藏必看!2026年AI内卷混战风口拆解,小白也能轻松入局大模型

2026年刷各大平台,相信不少程序员和零基础小伙伴都被AI圈内卷刷屏!既能自主决策、智能交互的人形机器人遍地开花,还有全网爆火、玩法持续迭代升级的AI小龙虾OpenClaw强势出圈。当下大模型技术更新迭代速度极快,用日新月异来形容行…...

收藏!2026年转AI大模型应用开发,正确学习顺序别踩坑(小白/程序员必看)

本文深度剖析2026年AI智能体公司的生存困境,点出其商业模式局限、缺乏行业深耕经验的核心痛点,揭示其难以持续盈利的底层逻辑。同时,结合当下AI大模型的爆发式发展趋势,强调大模型应用开发的学习价值,为小白、程序员整…...

【2026最新版|收藏备用】用Skill简化大模型知识库连接,小白程序员入门必看

本文专为2026年入门大模型的小白、程序员打造,详细介绍如何通过Skill技术简化大模型与外部知识库的对接流程,对比传统RAG方法的繁琐痛点,手把手讲解Markdown(.md)格式文档的存储技巧、SKILL.md文件的技能描述与导航方法…...