atvoss:异构计算AI算子自动调优与调度引擎,释放硬件极致性能

在当今AI技术飞速发展的时代,深度学习模型日益复杂,其背后的计算需求也达到了前所未有的高度。无论是大型语言模型(LLMs)、计算机视觉模型还是其他复杂的神经网络,都需要在高性能的异构计算处理器上以极高的效率运行,才能满足实际应用中对低延迟和高吞吐量的需求。然而,异构计算处理器的架构往往非常复杂,包含多级存储、专用计算单元(如矩阵乘法单元、向量处理单元)和高速互联等。要充分发挥这些硬件的潜力,仅仅依靠通用的编译或手动优化是远远不够的。每一个算子(Operation)在不同的输入形状、数据类型、甚至不同的硬件环境下,都可能存在数万种甚至更多的执行配置(例如数据分块、循环展开、并行策略、内存访问模式等)。

atvoss 仓库,即 Automatic Tuner for VOS and Scheduling,正是为了解决这一复杂挑战而生的。它是一个智能的自动调优和调度引擎,专注于在异构计算处理器上实现AI算子的极致性能。atvoss 能够通过系统化的探索和评估,自动寻找出每个算子的最优执行配置,并智能地安排算子在硬件上的执行顺序,从而最大限度地提高硬件利用率,降低计算延迟,并减少开发者的手动优化负担。它是异构计算AI软件栈中,释放硬件潜能、提升模型整体性能不可或缺的关键组成部分。

核心资源链接:

随着深度学习模型在规模和复杂性上的不断突破,其对计算资源的渴求也达到了新的高度。无论是训练动辄千亿参数的语言模型,还是部署需要实时响应的视觉感知系统,都要求异构计算处理器能够以最高效率运行。然而,异构计算架构的固有复杂性,使得"将模型代码编译为硬件高效执行指令"这一过程远非直观。每一个基础的AI算子(如卷积、矩阵乘法、归一化等),在其底层的硬件实现上,都存在着大量的优化空间和配置选项。手动探索这些选项,以找到最佳性能配置,不仅耗时耗力,而且极度依赖专家经验。

atvoss 仓库正是针对这一痛点设计的,它是一个智能的自动调优与调度引擎atvoss 的核心目标是自动化地完成对异构计算处理器上AI算子的性能优化工作,包括:

  • 算子执行配置的自动搜索:针对单个算子,自动探索其在特定输入、特定硬件上的最优实现参数(例如,数据分块策略、循环展开因子、并行线程数、内存访问模式等)。
  • 计算图级别的算子调度优化 :在整个模型计算图的层面上,智能地安排算子的执行顺序和资源分配,以最大化并行度,减少数据传输延迟,提升整体吞吐量。
    通过 atvoss,开发者可以摆脱繁琐的底层性能优化工作,让AI模型能够充分发挥异构计算硬件的潜力,实现卓越的性能表现。它为AI开发者和硬件平台之间的性能鸿沟架起了一座智能化的桥梁。

一、 atvoss 的核心使命与异构计算AI性能瓶颈

在追求AI模型极致性能的道路上,atvoss 扮演着关键角色,旨在解决异构计算环境下算子性能调优的固有难题。

1.1 深度学习模型中的性能挑战

现代深度学习模型呈现出以下特点,给高效部署带来了巨大挑战:

  • 计算密集型算子众多:模型中充斥着大量的矩阵乘法、卷积等计算密集型操作,它们占据了大部分的执行时间。
  • 内存访问模式复杂:模型需要频繁地从存储中读取参数和中间数据,写回结果,内存带宽往往成为瓶颈。
  • 动态性和多样性:模型的输入形状、批处理大小可能动态变化;模型架构本身也多种多样,没有一种"放之四海而皆准"的优化策略。

1.2 异构计算硬件的复杂性与调优难题

异构计算处理器为AI计算提供了强大的能力,但也带来了调优的复杂性:

  • 多级存储体系:包含寄存器、多级缓存、片上存储(如通用缓冲UB)、高速主存(HBM)等,数据在这些层级间的移动开销巨大。
  • 专用计算单元:例如,矩阵乘法单元(张量核)、向量处理单元,如何高效地利用这些单元需要精细的指令调度和数据排布。
  • 丰富的并行度 :多核、多线程、指令级并行等,要求算子实现能够充分挖掘这些并行能力。
    手动为每个算子在每种输入、每种硬件上寻找最佳的实现配置,几乎是不可能完成的任务。

1.3 自动调优与调度的必要性

面对上述挑战,算子自动调优与调度成为释放异构计算硬件潜力的必然选择:

  • 专家知识自动化:将硬件专家和性能工程师的经验通过算法和模型自动化,降低对人工经验的依赖。
  • 全方位搜索最优解:通过系统性探索,找到远超手动优化的性能配置,覆盖更广阔的优化空间。
  • 适应性与通用性:自动调优系统可以更好地适应不同模型、不同输入和不同硬件的特性,保持高性能。

二、 算子自动调优的原理与技术

atvoss 的核心在于其智能的算子自动调优机制,它结合了性能建模、搜索探索和硬件反馈等多种技术。

2.1 性能建模与成本预估

在探索大量可能的算子实现配置之前,atvoss 需要一种方式来评估它们的潜在性能:

  • 硬件性能模型:建立异构计算处理器的抽象性能模型,它能够模拟不同配置下算子在硬件上的执行时间、内存访问量、功耗等指标。
  • 指令级成本分析:对不同微指令序列的执行成本进行分析,考虑流水线冲突、内存访问延迟等因素。
  • 快速评估机制:为了加速搜索过程,模型必须足够轻量级,能够在短时间内对大量配置进行初步筛选。这通常涉及启发式规则和简化模型。

2.2 搜索空间与探索策略

算子配置的组合空间通常非常巨大,atvoss 需要高效的搜索策略来找到最优解:

  • 配置空间定义:为每个算子定义其可调参数的范围和粒度,例如数据分块的大小、循环展开的因子、并行线程的数量等。
  • 启发式搜索:利用专家经验和预设规则,排除明显低效的配置,缩小搜索范围。
  • 基于学习的搜索
    • 强化学习:将调优过程建模为强化学习问题,代理通过与环境(性能模型或实际硬件)交互,学习如何选择最佳配置。
    • 贝叶斯优化:利用历史测量数据构建代理模型,并根据代理模型选择下一个最有希望探索的配置点。
    • 进化算法:模拟自然选择过程,通过变异和交叉操作生成新的配置,并选择性能最优的配置进行下一代迭代。

2.3 硬件反馈与迭代优化

性能模型是抽象的,最终的性能验证需要真实硬件的反馈:

  • 实际性能测量:将经过选取的算子配置在真实异构计算处理器上进行部署和性能测量(Profiling)。
  • 数据驱动的迭代:将硬件测量的真实性能数据反馈回调优引擎,用于更新性能模型、指导下一轮搜索,或对模型进行微调。
  • 持续学习与适应atvoss 能够随着时间的推移,通过不断收集和学习硬件性能数据,持续改进其调优策略,适应硬件的变化或新的算子类型。

III. atvoss 的算子调度优化

除了单个算子的优化,atvoss 还负责在计算图层面进行智能调度,以确保整个模型的执行效率。

3.1 任务并行与依赖分析

计算图中的算子之间存在复杂的依赖关系,atvoss 需要精确分析以实现并行:

  • 数据依赖分析:确定哪些算子的输出是其他算子的输入,构建准确的数据流图。
  • 控制依赖分析:识别模型中的控制流结构(如条件分支、循环),确保正确的执行顺序。
  • 最大化并行度:识别图中可以并行执行的算子集合,并将其分发到不同的计算资源上,以充分利用硬件的多核和多流处理能力。

3.2 内存访问与数据流优化

高效的数据流是避免内存瓶颈的关键,atvoss 在调度时会考虑:

  • 内存复用与生命周期管理:通过分析中间张量的生命周期,尽可能地复用内存空间,减少总内存占用。
  • 数据局部性优化调度:优先调度那些共享相同输入数据的算子,以便数据能在缓存中被多次使用,减少对主存的访问。
  • 计算与通信重叠:利用异构计算处理器的DMA(Direct Memory Access)机制,在计算一个算子的同时,异步地将下一个算子的输入数据预取到片上存储,实现计算与数据传输的重叠。

3.3 异构资源分配与调度策略

异构计算处理器包含多种不同类型的计算资源,atvoss 需要智能分配:

  • 专用单元调度:将计算密集型任务(如矩阵乘法)调度到张量核,将向量操作调度到向量处理单元,最大限度发挥各类专用硬件的性能。
  • 负载均衡:在多个同类型计算单元之间合理分配任务,避免某些单元过载而其他单元空闲的情况。
  • 动态优先级与抢占 :在某些高级场景中,atvoss 甚至可以根据任务的实时优先级和时间要求,进行动态调度和资源抢占,以满足关键路径的性能需求。

IV. 与AI软件栈的深度融合

atvoss 并非一个孤立的工具,它与异构计算AI软件栈中的其他核心组件紧密协作,形成一个统一的优化生态。

4.1 atvoss 与计算图引擎 ge 的协作

atvoss 的输出直接服务于计算图引擎 ge (Graph Engine):

  • 优化算子库的提供者atvoss 自动调优生成的最佳算子Kernel(及其配置),被 ge 整合到其算子库中,作为编译时的可选实现。
  • 调度策略的输入atvoss 提供的图级调度建议,成为 ge 在生成最终可执行代码时进行任务编排的重要依据。
  • 统一的性能基线atvoss 的存在使得 ge 能够始终选择性能最优的算子实现,保证整个模型的执行效率。

4.2 算子元定义 metadef 的支撑作用

atvoss 的调优和调度离不开 metadef (Operator Metadata Definition) 提供的算子信息:

  • 算子行为的精确理解metadef 定义了算子的输入输出张量、属性、形状推导规则等,这些是 atvoss 理解算子语义、进行性能建模的基础。
  • 可调参数的范围metadef 可以扩展定义算子在 atvoss 中可以调优的参数范围和约束,例如分块大小的最大最小值。
  • 统一的接口规范metadef 确保了 atvossge 对算子的理解是一致的,避免了信息偏差。

4.3 无缝集成于开发工具链

atvoss 通过与异构计算AI平台提供的工具链集成,简化了开发者的工作流:

  • 自动编译流程 :开发者无需手动调用 atvoss。在通过 ge 编译模型时,atvoss 会在后台自动启动,对模型中的算子进行调优,并将其最佳配置注入到编译后的模型中。
  • 性能可视化与分析 :通过平台提供的性能分析工具,开发者可以直观地看到 atvoss 优化后的算子性能提升,以及调度策略带来的效果。
  • 命令行工具与API:为高级用户提供命令行工具或API,以便进行更细粒度的调优控制或自定义算子的调优。

V. 开发者赋能与自定义算子优化

atvoss 不仅优化了内置算子,更提供了强大的机制,赋能开发者对自定义算子进行自动化性能调优。

5.1 简化高性能Kernel开发

对于需要开发自定义算子的开发者而言,atvoss 大幅降低了性能优化门槛:

  • 摆脱繁琐的手动调优:开发者只需专注于算子功能的正确实现,而无需花费大量时间去手动尝试各种底层优化参数。
  • 确保高性能实现atvoss 可以自动探索并找到自定义算子在目标硬件上的最佳执行配置,即使开发者不是性能优化专家,也能获得高性能Kernel。
  • 加速创新周期:快速验证新算子或算法在异构计算硬件上的性能潜力,加速从算法研究到硬件部署的迭代速度。

5.2 自定义算子的调优接入

将自定义算子接入 atvoss 的调优流程通常需要遵循一定规范:

  • 可调参数的描述:在定义自定义算子时,除了其输入输出和属性,还需要明确指定哪些内部参数是可调的,以及它们的取值范围和约束。
  • 调优接口的实现 :提供一个接口,允许 atvoss 能够生成不同的参数组合,并能够调用自定义算子的代码进行性能测试。
  • 元定义注册 :通过 metadef 体系,将自定义算子的可调参数信息注册到整个异构计算AI软件栈中。

5.3 性能调试与分析反馈

atvoss 提供工具协助开发者理解优化效果:

  • 调优报告atvoss 可以生成详细的调优报告,列出不同配置的性能数据,以及最终选定的最优配置。
  • 瓶颈定位 :结合性能分析工具,开发者可以查看 atvoss 调优前后的性能对比,并定位可能存在的新的性能瓶颈。
  • 迭代优化:开发者可以根据报告和分析结果,进一步改进自定义算子的实现代码,或调整可调参数的搜索空间,进行多轮迭代优化。

VI. 未来展望与智能演进

atvoss 作为异构计算AI性能优化的核心引擎,将持续演进,以适应AI技术和硬件架构的快速发展。

6.1 基于学习的智能调优

未来的 atvoss 将进一步深化对机器学习技术的应用:

  • 自适应搜索策略:基于历史调优数据,训练更智能的代理模型,能够根据算子类型、输入特性和硬件环境,动态调整搜索策略。
  • 迁移学习与多任务学习:利用在相似算子或硬件上积累的知识,加速新算子或新硬件的调优过程,减少从零开始的冷启动问题。
  • 领域自适应调优:针对特定应用领域(如自动驾驶、推荐系统)的算子特性和性能要求,进行更具针对性的调优策略学习。

6.2 动态运行时优化

除了编译时的静态优化,atvoss 将向运行时动态优化发展:

  • 运行时参数调整:在模型运行时,根据实际输入数据和硬件负载,动态调整算子的执行参数,以适应实时变化的环境。
  • 自适应调度:运行时调度器可以根据当前系统资源使用情况、数据依赖和任务优先级,动态调整算子的执行顺序和并行度。
  • 在线性能监控与反馈 :在模型部署后,持续监控其性能指标,并将数据反馈给 atvoss,进行在线学习和优化。

6.3 跨平台与分布式场景扩展

atvoss 的优化能力将扩展到更广泛的计算场景:

  • 多处理器协同调优:在包含多个异构计算处理器的系统中,实现跨处理器算子任务的协同调优和负载均衡。
  • 分布式推理优化 :在分布式推理场景下,atvoss 将考虑数据通信、模型并行和流水线并行等因素,进行全局优化。
  • 异构系统统一调度:在混合了CPU、GPU和异构计算处理器等多种计算资源的系统中,实现统一的算子调度和资源管理,以最大化整个系统的效率。

VII. 总结:atvoss --- 异构计算AI性能的智能加速器

atvoss 仓库作为异构计算AI软件栈中的核心智能组件,其核心价值在于它为AI开发者提供了一个自动化、高效率的性能优化解决方案。它不仅仅是一个简单的优化工具,更是一个结合了复杂性能模型、先进搜索算法和硬件反馈机制的智能引擎,能够将深度学习模型在异构计算处理器上的执行效率推向极致。

atvoss 的核心贡献体现在:

  • 自动化性能调优:通过智能搜索,自动为每个算子找到最优的底层执行配置,大幅提升性能。
  • 智能算子调度:在计算图级别优化算子执行顺序和资源分配,最大化并行度并减少内存瓶颈。
  • 释放硬件潜力:深入理解异构计算处理器的复杂架构,充分利用其多级存储和专用计算单元。
  • 赋能开发者创新:降低高性能Kernel开发的门槛,加速AI算法从研究到部署的周期。

展望未来,atvoss 将持续演进,整合更多基于学习的智能调优策略,探索运行时动态优化,并扩展到更复杂的分布式和异构计算场景。它将作为异构计算AI性能优化的基石,持续赋能AI模型的快速迭代和广泛应用,共同开启一个更加高效、智能的AI计算新时代。


以下是一个概念性的 C++ 代码片段 ,用于说明开发者如何通过 atvoss 提供的一个虚拟 API 来注册一个自定义算子的可调参数,并将其纳入自动调优系统 。这个例子旨在体现 atvoss 作为调优引擎的抽象理念,展示开发者如何通过编程方式与其交互,而不是一个可直接编译运行的"实战代码"。它侧重于描述调优的"意图"和"参数空间"。

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <functional> // For std::function

// 假设 metadef 命名空间提供了算子元定义的工具和接口
// atvoss 会使用 metadef 中的信息来理解算子
namespace metadef {
    // 省略了前面文章中定义过的 DataType, TensorShape, AttributeValue 等
    // 假设这些基础类型已经存在并可用

    // 算子属性描述 (用于 metadef 注册算子时)
    struct AttrDesc {
        std::string name;
        // ... (其他属性,如类型、默认值等)
    };

    // 算子输入描述 (用于 metadef 注册算子时)
    struct InputDesc {
        std::string name;
        // ... (其他属性,如数据类型、形状约束等)
    };

    // 算子输出描述 (用于 metadef 注册算子时)
    struct OutputDesc {
        std::string name;
        // ... (其他属性)
    };

    // 形状推导函数的签名
    using ShapeInferFunc = std::function<std::vector<TensorShape>(
        const std::vector<TensorShape>& input_shapes,
        const std::map<std::string, AttributeValue>& attrs)>;

    // 概念性的 OpDefinition,代表一个完整的算子定义
    struct OpDefinition {
        std::string op_type;
        std::string domain;
        std::vector<InputDesc> inputs;
        std::vector<OutputDesc> outputs;
        std::vector<AttrDesc> attrs;
        ShapeInferFunc shape_infer_func;
        // ... 其他元信息
    };

    // 概念性的 OpRegistry,用于注册算子定义
    class OpRegistry {
    public:
        // 实际的注册函数可能更复杂,这里仅为概念展示
        static void RegisterOp(const OpDefinition& op_def) {
            std::cout << "[metadef] INFO: 注册算子 '" << op_def.op_type << "' 到 metadef。" << std::endl;
            // 内部会将 op_def 存储起来
        }
    };
} // namespace metadef

// 假设 atvoss 命名空间提供了自动调优的工具和接口
namespace atvoss {

    // 概念性的 TunableParam 类型,用于描述可调参数
    struct TunableParam {
        std::string name;             // 参数名称 (如 "tile_m", "unroll_factor")
        std::string param_type;       // 参数类型 (如 "int", "enum")
        std::vector<int> int_range;   // 如果是整数类型,其取值范围或离散值
        std::vector<std::string> enum_options; // 如果是枚举类型,其选项
        std::string description;      // 参数描述
    };

    // 概念性的 CustomKernelConfig,代表一个自定义Kernel的调优配置
    // 开发者需要实现一个函数,根据这些配置来执行算子
    struct CustomKernelConfig {
        std::string kernel_name;
        // 这是一个概念性的函数指针,代表根据给定的调优参数执行自定义Kernel的逻辑
        // 实际可能是通过动态库加载,或 JIT 编译
        std::function<void(const std::map<std::string, metadef::AttributeValue>& attrs,
                           const std::map<std::string, int>& tunable_params_values)> execute_kernel;
    };

    // 算子注册器类 (概念性)
    class OpTuningRegistry {
    public:
        // 注册一个自定义算子的可调参数及其Kernel执行器
        static void RegisterTunableOperator(
            const std::string& op_type,
            const std::string& domain,
            const std::vector<TunableParam>& tunable_params,
            CustomKernelConfig custom_kernel_config) { // 实际可能传入函数指针或回调
          
            std::cout << "[atvoss] INFO: 注册可调优算子: " << domain << "::" << op_type << std::endl;
            std::cout << "[atvoss] INFO: 包含以下可调参数:" << std::endl;
            for (const auto& param : tunable_params) {
                std::cout << "  - " << param.name << " (" << param.param_type << "): ";
                if (!param.int_range.empty()) {
                    std::cout << "Range [" << param.int_range[0] << ", " << param.int_range[1] << "]";
                } else if (!param.enum_options.empty()) {
                    std::cout << "Options {";
                    for (size_t i = 0; i < param.enum_options.size(); ++i) {
                        std::cout << param.enum_options[i] << (i == param.enum_options.size() - 1 ? "" : ", ");
                    }
                    std::cout << "}";
                }
                std::cout << std::endl;
            }
            std::cout << "[atvoss] INFO: Custom Kernel Configured: " << custom_kernel_config.kernel_name << std::endl;
            // 实际内部会存储这些信息,供自动调优引擎使用
        }

        // 概念性的 StartAutoTuning 函数
        static void StartAutoTuning(const std::string& op_type, const std::string& domain) {
            std::cout << "\n[atvoss] INFO: 启动算子 '" << domain << "::" << op_type << "' 的自动调优过程..." << std::endl;
            std::cout << "[atvoss] INFO: 1. 分析算子元定义和可调参数空间。" << std::endl;
            std::cout << "[atvoss] INFO: 2. 基于性能模型和搜索算法探索配置。" << std::endl;
            std::cout << "[atvoss] INFO: 3. 在硬件上测试部分配置并收集性能数据。" << std::endl;
            std::cout << "[atvoss] INFO: 4. 迭代优化,直到找到最佳配置。" << std::endl;
            std::cout << "[atvoss] INFO: 算子 '" << op_type << "' 的自动调优完成,最佳配置已保存。" << std::endl;
        }
    };

} // namespace atvoss

// =============================================================================
// 演示如何使用 metadef 和 atvoss 注册并调优一个自定义算子 "MyCustomConv"
// =============================================================================
void DefineAndTuneMyCustomConv() {
    using namespace metadef;
    using namespace atvoss;

    std::cout << "--- 概念性演示:自定义卷积算子注册与自动调优 ---\n" << std::endl;

    // --- 步骤1: 使用 metadef 注册算子的基本元定义 ---
    OpDefinition custom_conv_def;
    custom_conv_def.op_type = "MyCustomConv";
    custom_conv_def.domain = "my_custom_ops";
    custom_conv_def.inputs = {
        {.name = "input_tensor"},
        {.name = "weight_tensor"}
    };
    custom_conv_def.outputs = {
        {.name = "output_tensor"}
    };
    custom_conv_def.attrs = {
        {.name = "stride"},
        {.name = "padding"}
    };
    // 假设形状推导函数也已定义
    custom_conv_def.shape_infer_func = [](const std::vector<TensorShape>& input_shapes,
                                          const std::map<std::string, AttributeValue>& attrs) {
        // ... 复杂的卷积形状推导逻辑
        std::cout << "[metadef] INFO: MyCustomConv 形状推导函数被调用。" << std::endl;
        return std::vector<TensorShape>{{1, 64, 56, 56}}; // 示例输出形状
    };
    metadef::OpRegistry::RegisterOp(custom_conv_def);

    std::cout << "\n--- 步骤2: 使用 atvoss 注册自定义算子的可调参数和Kernel ---" << std::endl;

    // 定义 MyCustomConv 算子的可调参数
    std::vector<TunableParam> custom_conv_tunable_params = {
        {
            .name = "tile_m",
            .param_type = "int",
            .int_range = {32, 256}, // 比如在 32 到 256 之间以 32 为步长调优
            .description = "Output feature map M dimension tiling factor"
        },
        {
            .name = "tile_n",
            .param_type = "int",
            .int_range = {16, 128}, // N 维度分块因子
            .description = "Output feature map N dimension tiling factor"
        },
        {
            .name = "unroll_k",
            .param_type = "enum",
            .enum_options = {"1", "4", "8"}, // 循环展开因子
            .description = "Inner loop unroll factor for convolution"
        },
        {
            .name = "memory_access_pattern",
            .param_type = "enum",
            .enum_options = {"default", "col_major", "row_major"}, // 内存访问模式
            .description = "Strategy for accessing input/weight data in memory"
        }
    };

    // 概念性的自定义Kernel实现
    // 实际这里是一个编译好的函数指针,或者一个JIT编译器的句柄
    CustomKernelConfig custom_kernel;
    custom_kernel.kernel_name = "my_custom_conv_kernel_impl";
    custom_kernel.execute_kernel = [](const std::map<std::string, metadef::AttributeValue>& attrs,
                                       const std::map<std::string, int>& tunable_params_values) {
        // 这是一个概念性的执行函数,模拟自定义算子Kernel的执行
        // 在实际调优过程中,atvoss 会调用此函数并计时
        std::cout << "  -> 模拟执行 MyCustomConv Kernel,配置参数:" << std::endl;
        for (const auto& [param_name, param_value] : tunable_params_values) {
            std::cout << "     " << param_name << ": " << param_value << std::endl;
        }
        // ... 实际的计算逻辑,可能会使用到 attrs 和 tunable_params_values
    };

    atvoss::OpTuningRegistry::RegisterTunableOperator(
        custom_conv_def.op_type,
        custom_conv_def.domain,
        custom_conv_tunable_params,
        custom_kernel
    );

    std::cout << "\n--- 步骤3: 启动 `atvoss` 对自定义算子进行自动调优 ---" << std::endl;
    atvoss::OpTuningRegistry::StartAutoTuning(custom_conv_def.op_type, custom_conv_def.domain);

    std::cout << "\n--- 演示完成。`atvoss` 已经找到 MyCustomConv 的最佳配置并保存。---" << std::endl;
}

int main() {
    DefineAndTuneMyCustomConv();
    return 0;
}
相关推荐
九.九8 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见8 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭8 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
deephub8 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
大模型RAG和Agent技术实践8 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢8 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖8 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能
PythonPioneer9 小时前
在AI技术迅猛发展的今天,传统职业该如何“踏浪前行”?
人工智能
冬奇Lab9 小时前
一天一个开源项目(第20篇):NanoBot - 轻量级AI Agent框架,极简高效的智能体构建工具
人工智能·开源·agent
阿里巴巴淘系技术团队官网博客9 小时前
设计模式Trustworthy Generation:提升RAG信赖度
人工智能·设计模式