CANN 组合库深度解析:MetaDef与Ops-NN的元数据定义与神经网络算子集成

本文基于CANN开源社区的metadef和ops-nn仓库进行技术解读

CANN组织地址:https://atomgit.com/cann

metadef仓库地址:https://atomgit.com/cann/metadef

ops-nn仓库地址:https://atomgit.com/cann/ops-nn

前言

元数据定义和神经网络算子是模型表示和执行的基础。MetaDef(元数据定义)与Ops-NN(神经网络算子库)如何协同工作?如何实现高效的元数据定义和神经网络算子集成?

本文探讨MetaDef与Ops-NN的协同机制,以及如何通过两者的配合实现高效的模型表示和执行。

什么是组合元数据定义算子集成

MetaDef与Ops-NN的组合:

复制代码
没有协同:
元数据定义和算子库各自独立 → 模型表示不一致 → 执行效率低

有协同:
元数据定义和算子库协同 → 模型表示一致 → 执行效率高

架构:

复制代码
模型定义
    ↓
MetaDef(元数据定义)
    ↓
Ops-NN(神经网络算子)
    ↓
NPU硬件

核心概念

1. 元数据定义

元数据定义:

c 复制代码
#include "metadef/metadef.h"

// 元数据配置
typedef struct {
    metadata_type_t type;          // 元数据类型
    metadata_format_t format;      // 元数据格式
    metadata_version_t version;    // 元数据版本
    validation_policy_t policy;    // 验证策略
} metadata_config_t;

// 创建元数据配置
metadata_config_t *create_metadata_config(metadata_type_t type);

// 元数据类型
typedef enum {
    METADATA_TYPE_OPERATOR,        // 算子元数据
    METADATA_TYPE_TENSOR,          // 张量元数据
    METADATA_TYPE_GRAPH,           // 图元数据
    METADATA_TYPE_ATTRIBUTE        // 属性元数据
} metadata_type_t;

2. 神经网络算子

神经网络算子:

c 复制代码
// 算子元数据
typedef struct {
    char *name;                    // 算子名称
    operator_type_t type;          // 算子类型
    input_metadata_t *inputs;      // 输入元数据
    output_metadata_t *outputs;    // 输出元数据
    attribute_metadata_t *attributes; // 属性元数据
} operator_metadata_t;

// 创建算子元数据
operator_metadata_t *create_operator_metadata(char *name, operator_type_t type);

3. 元数据验证

元数据验证:

c 复制代码
// 验证配置
typedef struct {
    bool enable_type_checking;     // 启用类型检查
    bool enable_shape_checking;    // 启用形状检查
    bool enable_value_checking;    // 启用值检查
    bool enable_consistency_checking; // 启用一致性检查
} validation_config_t;

// 创建验证配置
validation_config_t *create_validation_config();

协同优化

1. 算子元数据定义

c 复制代码
// 算子元数据定义
void define_operator_metadata() {
    // 阶段1:创建元数据配置
    printf("Phase 1: Create Metadata Configuration\n");
  
    metadata_config_t *meta_config = create_metadata_config(METADATA_TYPE_OPERATOR);
    meta_config->format = METADATA_FORMAT_JSON;
    meta_config->version = METADATA_VERSION_2_0;
  
    printf("  Metadata configuration created\n");
  
    // 阶段2:定义卷积算子元数据
    printf("\nPhase 2: Define Convolution Operator Metadata\n");
  
    operator_metadata_t *conv_metadata = create_operator_metadata("Conv2D", OPERATOR_TYPE_CONV2D);
  
    // 定义输入元数据
    input_metadata_t *inputs = malloc(1 * sizeof(input_metadata_t));
    inputs[0].name = "input";
    inputs[0].dtype = DATA_TYPE_FLOAT32;
    inputs[0].shape[0] = -1;  // batch size
    inputs[0].shape[1] = 3;   // channels
    inputs[0].shape[2] = 224; // height
    inputs[0].shape[3] = 224; // width
    inputs[0].ndim = 4;
  
    conv_metadata->inputs = inputs;
    conv_metadata->num_inputs = 1;
  
    // 定义输出元数据
    output_metadata_t *outputs = malloc(1 * sizeof(output_metadata_t));
    outputs[0].name = "output";
    outputs[0].dtype = DATA_TYPE_FLOAT32;
    outputs[0].shape[0] = -1;  // batch size
    outputs[0].shape[1] = 64;  // channels
    outputs[0].shape[2] = 224; // height
    outputs[0].shape[3] = 224; // width
    outputs[0].ndim = 4;
  
    conv_metadata->outputs = outputs;
    conv_metadata->num_outputs = 1;
  
    // 定义属性元数据
    attribute_metadata_t *attributes = malloc(4 * sizeof(attribute_metadata_t));
  
    attributes[0].name = "kernel_size";
    attributes[0].type = ATTRIBUTE_TYPE_INT;
    attributes[0].value.int_value = 3;
  
    attributes[1].name = "stride";
    attributes[1].type = ATTRIBUTE_TYPE_INT;
    attributes[1].value.int_value = 1;
  
    attributes[2].name = "padding";
    attributes[2].type = ATTRIBUTE_TYPE_STRING;
    attributes[2].value.string_value = "SAME";
  
    attributes[3].name = "activation";
    attributes[3].type = ATTRIBUTE_TYPE_STRING;
    attributes[3].value.string_value = "ReLU";
  
    conv_metadata->attributes = attributes;
    conv_metadata->num_attributes = 4;
  
    printf("  Convolution operator metadata defined\n");
  
    // 阶段3:验证元数据
    printf("\nPhase 3: Validate Metadata\n");
  
    validation_config_t *val_config = create_validation_config();
    val_config->enable_type_checking = true;
    val_config->enable_shape_checking = true;
    val_config->enable_value_checking = true;
    val_config->enable_consistency_checking = true;
  
    validation_result_t *result = validate_operator_metadata(conv_metadata, val_config);
  
    if (result->is_valid) {
        printf("  Validation: PASSED\n");
    } else {
        printf("  Validation: FAILED\n");
        printf("  Errors:\n");
        for (int i = 0; i < result->num_errors; i++) {
            printf("    %d. %s\n", i + 1, result->errors[i]);
        }
    }
  
    // 阶段4:序列化元数据
    printf("\nPhase 4: Serialize Metadata\n");
  
    char *serialized = serialize_operator_metadata(conv_metadata, meta_config);
  
    printf("  Metadata serialized\n");
    printf("  Serialized metadata:\n%s\n", serialized);
}

2. 元数据与算子集成

c 复制代码
// 元数据与算子集成
void integrate_metadata_with_operator() {
    // 阶段1:加载元数据
    printf("Phase 1: Load Metadata\n");
  
    metadata_config_t *meta_config = create_metadata_config(METADATA_TYPE_OPERATOR);
    meta_config->format = METADATA_FORMAT_JSON;
  
    operator_metadata_t *metadata = load_operator_metadata("conv2d_metadata.json", meta_config);
  
    printf("  Metadata loaded\n");
    printf("  Operator name: %s\n", metadata->name);
    printf("  Operator type: %d\n", metadata->type);
  
    // 阶段2:创建算子
    printf("\nPhase 2: Create Operator\n");
  
    operator_t *op = create_operator_from_metadata(metadata);
  
    printf("  Operator created\n");
  
    // 阶段3:验证算子
    printf("\nPhase 3: Validate Operator\n");
  
    validation_config_t *val_config = create_validation_config();
    val_config->enable_type_checking = true;
    val_config->enable_shape_checking = true;
  
    validation_result_t *result = validate_operator(op, val_config);
  
    if (result->is_valid) {
        printf("  Validation: PASSED\n");
    } else {
        printf("  Validation: FAILED\n");
    }
  
    // 阶段4:执行算子
    printf("\nPhase 4: Execute Operator\n");
  
    // 准备输入数据
    int batch_size = 1;
    int height = 224;
    int width = 224;
  
    float *input = malloc(batch_size * 3 * height * width * sizeof(float));
    float *output = malloc(batch_size * 64 * height * width * sizeof(float));
  
    initialize_random(input, batch_size * 3 * height * width);
  
    // 执行算子
    execute_operator(op, input, output);
  
    printf("  Operator executed\n");
  
    // 阶段5:验证输出
    printf("\nPhase 5: Validate Output\n");
  
    bool is_valid = validate_output(output, metadata->outputs);
  
    if (is_valid) {
        printf("  Output validation: PASSED\n");
    } else {
        printf("  Output validation: FAILED\n");
    }
  
    // 清理资源
    free(input);
    free(output);
    destroy_operator(op);
    destroy_operator_metadata(metadata);
}

3. 自动元数据生成

c 复制代码
// 自动元数据生成
void auto_generate_metadata(operator_t *op) {
    // 阶段1:分析算子
    printf("Phase 1: Analyze Operator\n");
  
    operator_analysis_t *analysis = analyze_operator(op);
  
    printf("  Operator name: %s\n", analysis->name);
    printf("  Operator type: %d\n", analysis->type);
    printf("  Num inputs: %d\n", analysis->num_inputs);
    printf("  Num outputs: %d\n", analysis->num_outputs);
    printf("  Num attributes: %d\n", analysis->num_attributes);
  
    // 阶段2:生成元数据
    printf("\nPhase 2: Generate Metadata\n");
  
    operator_metadata_t *metadata = generate_operator_metadata(analysis);
  
    printf("  Metadata generated\n");
  
    // 阶段3:验证元数据
    printf("\nPhase 3: Validate Metadata\n");
  
    validation_config_t *val_config = create_validation_config();
    val_config->enable_type_checking = true;
    val_config->enable_shape_checking = true;
    val_config->enable_consistency_checking = true;
  
    validation_result_t *result = validate_operator_metadata(metadata, val_config);
  
    if (result->is_valid) {
        printf("  Validation: PASSED\n");
    } else {
        printf("  Validation: FAILED\n");
        printf("  Errors:\n");
        for (int i = 0; i < result->num_errors; i++) {
            printf("    %d. %s\n", i + 1, result->errors[i]);
        }
    }
  
    // 阶段4:保存元数据
    printf("\nPhase 4: Save Metadata\n");
  
    metadata_config_t *meta_config = create_metadata_config(METADATA_TYPE_OPERATOR);
    meta_config->format = METADATA_FORMAT_JSON;
  
    save_operator_metadata(metadata, "auto_generated_metadata.json", meta_config);
  
    printf("  Metadata saved\n");
}

使用场景

场景一:模型元数据定义

c 复制代码
// 模型元数据定义
void define_model_metadata() {
    // 阶段1:创建模型元数据
    printf("Phase 1: Create Model Metadata\n");
  
    graph_metadata_t *model_metadata = create_graph_metadata("ResNet50");
  
    // 阶段2:定义输入元数据
    printf("\nPhase 2: Define Input Metadata\n");
  
    input_metadata_t *input = malloc(1 * sizeof(input_metadata_t));
    input[0].name = "input";
    input[0].dtype = DATA_TYPE_FLOAT32;
    input[0].shape[0] = -1;  // batch size
    input[0].shape[1] = 3;   // channels
    input[0].shape[2] = 224; // height
    input[0].shape[3] = 224; // width
    input[0].ndim = 4;
  
    model_metadata->inputs = input;
    model_metadata->num_inputs = 1;
  
    printf("  Input metadata defined\n");
  
    // 阶段3:定义输出元数据
    printf("\nPhase 3: Define Output Metadata\n");
  
    output_metadata_t *output = malloc(1 * sizeof(output_metadata_t));
    output[0].name = "output";
    output[0].dtype = DATA_TYPE_FLOAT32;
    output[0].shape[0] = -1;  // batch size
    output[0].shape[1] = 1000; // classes
    output[0].ndim = 2;
  
    model_metadata->outputs = output;
    model_metadata->num_outputs = 1;
  
    printf("  Output metadata defined\n");
  
    // 阶段4:添加算子元数据
    printf("\nPhase 4: Add Operator Metadata\n");
  
    // 添加卷积层
    operator_metadata_t *conv1 = create_operator_metadata("conv1", OPERATOR_TYPE_CONV2D);
    add_operator_metadata(model_metadata, conv1);
  
    // 添加池化层
    operator_metadata_t *pool1 = create_operator_metadata("pool1", OPERATOR_TYPE_MAX_POOL);
    add_operator_metadata(model_metadata, pool1);
  
    // 添加全连接层
    operator_metadata_t *fc = create_operator_metadata("fc", OPERATOR_TYPE_DENSE);
    add_operator_metadata(model_metadata, fc);
  
    printf("  Operator metadata added\n");
    printf("  Total operators: %d\n", model_metadata->num_operators);
  
    // 阶段5:验证模型元数据
    printf("\nPhase 5: Validate Model Metadata\n");
  
    validation_config_t *val_config = create_validation_config();
    val_config->enable_type_checking = true;
    val_config->enable_shape_checking = true;
    val_config->enable_consistency_checking = true;
  
    validation_result_t *result = validate_graph_metadata(model_metadata, val_config);
  
    if (result->is_valid) {
        printf("  Validation: PASSED\n");
    } else {
        printf("  Validation: FAILED\n");
    }
  
    // 阶段6:保存模型元数据
    printf("\nPhase 6: Save Model Metadata\n");
  
    metadata_config_t *meta_config = create_metadata_config(METADATA_TYPE_GRAPH);
    meta_config->format = METADATA_FORMAT_JSON;
  
    save_graph_metadata(model_metadata, "resnet50_metadata.json", meta_config);
  
    printf("  Model metadata saved\n");
}

场景二:元数据驱动的算子执行

c 复制代码
// 元数据驱动的算子执行
void metadata_driven_execution() {
    // 阶段1:加载模型元数据
    printf("Phase 1: Load Model Metadata\n");
  
    metadata_config_t *meta_config = create_metadata_config(METADATA_TYPE_GRAPH);
    meta_config->format = METADATA_FORMAT_JSON;
  
    graph_metadata_t *model_metadata = load_graph_metadata("resnet50_metadata.json", meta_config);
  
    printf("  Model metadata loaded\n");
    printf("  Model name: %s\n", model_metadata->name);
    printf("  Num operators: %d\n", model_metadata->num_operators);
  
    // 阶段2:创建算子实例
    printf("\nPhase 2: Create Operator Instances\n");
  
    operator_t **operators = malloc(model_metadata->num_operators * sizeof(operator_t *));
  
    for (int i = 0; i < model_metadata->num_operators; i++) {
        operators[i] = create_operator_from_metadata(&model_metadata->operators[i]);
        printf("  Created operator: %s\n", model_metadata->operators[i].name);
    }
  
    // 阶段3:创建执行图
    printf("\nPhase 3: Create Execution Graph\n");
  
    execution_graph_t *graph = create_execution_graph();
  
    for (int i = 0; i < model_metadata->num_operators; i++) {
        add_operator_to_graph(graph, operators[i]);
    }
  
    printf("  Execution graph created\n");
  
    // 阶段4:执行图
    printf("\nPhase 4: Execute Graph\n");
  
    // 准备输入数据
    int batch_size = 1;
    int height = 224;
    int width = 224;
  
    float *input = malloc(batch_size * 3 * height * width * sizeof(float));
    float *output = malloc(batch_size * 1000 * sizeof(float));
  
    initialize_random(input, batch_size * 3 * height * width);
  
    // 执行图
    execute_graph(graph, input, output);
  
    printf("  Graph executed\n");
  
    // 阶段5:验证输出
    printf("\nPhase 5: Validate Output\n");
  
    bool is_valid = validate_output(output, model_metadata->outputs);
  
    if (is_valid) {
        printf("  Output validation: PASSED\n");
    } else {
        printf("  Output validation: FAILED\n");
    }
  
    // 清理资源
    free(input);
    free(output);
  
    for (int i = 0; i < model_metadata->num_operators; i++) {
        destroy_operator(operators[i]);
    }
    free(operators);
  
    destroy_execution_graph(graph);
    destroy_graph_metadata(model_metadata);
}

场景三:元数据版本管理

c 复制代码
// 元数据版本管理
void metadata_version_management() {
    // 阶段1:创建不同版本的元数据
    printf("Phase 1: Create Different Metadata Versions\n");
  
    // 创建版本1.0
    metadata_config_t *config_v1 = create_metadata_config(METADATA_TYPE_OPERATOR);
    config_v1->version = METADATA_VERSION_1_0;
    config_v1->format = METADATA_FORMAT_JSON;
  
    operator_metadata_t *metadata_v1 = create_operator_metadata("Conv2D_v1", OPERATOR_TYPE_CONV2D);
    save_operator_metadata(metadata_v1, "conv2d_v1.0.json", config_v1);
  
    printf("  Metadata version 1.0 created\n");
  
    // 创建版本2.0
    metadata_config_t *config_v2 = create_metadata_config(METADATA_TYPE_OPERATOR);
    config_v2->version = METADATA_VERSION_2_0;
    config_v2->format = METADATA_FORMAT_JSON;
  
    operator_metadata_t *metadata_v2 = create_operator_metadata("Conv2D_v2", OPERATOR_TYPE_CONV2D);
    save_operator_metadata(metadata_v2, "conv2d_v2.0.json", config_v2);
  
    printf("  Metadata version 2.0 created\n");
  
    // 阶段2:比较版本
    printf("\nPhase 2: Compare Versions\n");
  
    version_diff_t *diff = compare_metadata_versions(metadata_v1, metadata_v2);
  
    printf("  Version differences:\n");
    printf("    Added attributes: %d\n", diff->num_added);
    printf("    Removed attributes: %d\n", diff->num_removed);
    printf("    Modified attributes: %d\n", diff->num_modified);
  
    // 阶段3:升级元数据
    printf("\nPhase 3: Upgrade Metadata\n");
  
    operator_metadata_t *upgraded = upgrade_metadata(metadata_v1, METADATA_VERSION_2_0);
  
    printf("  Metadata upgraded\n");
  
    // 阶段4:验证升级后的元数据
    printf("\nPhase 4: Validate Upgraded Metadata\n");
  
    validation_config_t *val_config = create_validation_config();
    val_config->enable_type_checking = true;
    val_config->enable_consistency_checking = true;
  
    validation_result_t *result = validate_operator_metadata(upgraded, val_config);
  
    if (result->is_valid) {
        printf("  Validation: PASSED\n");
    } else {
        printf("  Validation: FAILED\n");
    }
  
    // 清理资源
    destroy_operator_metadata(metadata_v1);
    destroy_operator_metadata(metadata_v2);
    destroy_operator_metadata(upgraded);
    destroy_version_diff(diff);
}

性能优化

1. 元数据缓存

c 复制代码
// 元数据缓存
void metadata_cache_optimization() {
    // 创建元数据缓存
    metadata_cache_t *cache = create_metadata_cache();
  
    // 设置缓存策略
    cache->policy = CACHE_POLICY_LRU;
    cache->max_size = 1000;
  
    // 使用缓存
    operator_metadata_t *metadata = get_metadata_from_cache(cache, "Conv2D");
  
    if (metadata == NULL) {
        // 从文件加载
        metadata = load_operator_metadata("conv2d_metadata.json", config);
      
        // 添加到缓存
        add_metadata_to_cache(cache, "Conv2D", metadata);
    }
}

2. 元数据压缩

c 复制代码
// 元数据压缩
void metadata_compression_optimization() {
    // 加载元数据
    operator_metadata_t *metadata = load_operator_metadata("conv2d_metadata.json", config);
  
    // 序列化元数据
    char *serialized = serialize_operator_metadata(metadata, config);
  
    // 压缩元数据
    size_t original_size = strlen(serialized);
    char *compressed = compress_metadata(serialized, original_size);
    size_t compressed_size = strlen(compressed);
  
    printf("Original size: %d bytes\n", original_size);
    printf("Compressed size: %d bytes\n", compressed_size);
    printf("Compression ratio: %.2f%%\n", (1.0 - (float)compressed_size / original_size) * 100);
}

3. 元数据预加载

c 复制代码
// 元数据预加载
void metadata_preload_optimization() {
    // 创建元数据预加载器
    metadata_preloader_t *preloader = create_metadata_preloader();
  
    // 添加预加载任务
    add_preload_task(preloader, "conv2d_metadata.json");
    add_preload_task(preloader, "pool2d_metadata.json");
    add_preload_task(preloader, "dense_metadata.json");
  
    // 执行预加载
    execute_preload(preloader);
  
    // 使用预加载的元数据
    operator_metadata_t *metadata = get_preloaded_metadata(preloader, "conv2d_metadata.json");
}

与其他组件的关系

组件 关系
metadef 元数据定义
ops-nn 神经网络算子
ge 图引擎
runtime 运行时支持

关系:

复制代码
模型定义
    ↓
MetaDef(元数据定义)
    ↓
Ops-NN(神经网络算子)
    ↓
Runtime(运行时)
    ↓
NPU硬件

调试技巧

1. 元数据验证

c 复制代码
// 元数据验证
void validate_metadata_debug(operator_metadata_t *metadata) {
    // 启用详细验证
    validation_config_t *config = create_validation_config();
    config->enable_type_checking = true;
    config->enable_shape_checking = true;
    config->enable_value_checking = true;
    config->enable_consistency_checking = true;
    config->verbose = true;
  
    // 执行验证
    validation_result_t *result = validate_operator_metadata(metadata, config);
  
    // 打印详细结果
    if (result->is_valid) {
        printf("Validation: PASSED\n");
    } else {
        printf("Validation: FAILED\n");
        printf("Errors:\n");
        for (int i = 0; i < result->num_errors; i++) {
            printf("  %d. %s\n", i + 1, result->errors[i]);
            printf("     Location: %s:%d\n", result->errors[i].file, result->errors[i].line);
        }
    }
}

2. 元数据比较

c 复制代码
// 元数据比较
void compare_metadata_debug(operator_metadata_t *metadata1, operator_metadata_t *metadata2) {
    // 比较元数据
    version_diff_t *diff = compare_metadata_versions(metadata1, metadata2);
  
    printf("Metadata Comparison:\n");
    printf("  Same: %s\n", diff->is_same ? "Yes" : "No");
    printf("  Added: %d\n", diff->num_added);
    printf("  Removed: %d\n", diff->num_removed);
    printf("  Modified: %d\n", diff->num_modified);
  
    // 打印详细信息
    if (diff->num_added > 0) {
        printf("  Added attributes:\n");
        for (int i = 0; i < diff->num_added; i++) {
            printf("    - %s\n", diff->added[i]);
        }
    }
}

3. 元数据追踪

c 复制代码
// 元数据追踪
void track_metadata_usage(operator_metadata_t *metadata) {
    // 创建元数据追踪器
    metadata_tracker_t *tracker = create_metadata_tracker();
  
    // 注册元数据
    register_metadata(tracker, metadata);
  
    // 追踪使用情况
    metadata_usage_t *usage = get_metadata_usage(tracker, metadata->name);
  
    printf("Metadata Usage:\n");
    printf("  Name: %s\n", usage->name);
    printf("  Times used: %d\n", usage->times_used);
    printf("  Last used: %s\n", usage->last_used);
    printf("  Performance: %.2f ms\n", usage->performance * 1000);
}

常见问题

问题1:元数据验证失败

c 复制代码
// 错误:元数据定义不完整
input_metadata->dtype = DATA_TYPE_FLOAT32;
// 缺少shape信息!

// 正确:完整的元数据定义
input_metadata->dtype = DATA_TYPE_FLOAT32;
input_metadata->shape[0] = -1;
input_metadata->shape[1] = 3;
input_metadata->shape[2] = 224;
input_metadata->shape[3] = 224;
input_metadata->ndim = 4;

问题2:版本兼容性问题

c 复制代码
// 错误:版本不兼容
load_operator_metadata("conv2d_v2.0.json", v1_config);  // 不兼容!

// 正确:使用正确的版本
load_operator_metadata("conv2d_v1.0.json", v1_config);  // 兼容

问题3:元数据加载慢

c 复制代码
// 错误:未使用缓存
metadata = load_operator_metadata("conv2d_metadata.json", config);  // 每次都加载!

// 正确:使用缓存
metadata = get_metadata_from_cache(cache, "Conv2D");
if (metadata == NULL) {
    metadata = load_operator_metadata("conv2d_metadata.json", config);
    add_metadata_to_cache(cache, "Conv2D", metadata);
}  // 快!

应用场景总结

场景一:模型元数据定义

用于模型元数据定义。

场景二:元数据驱动的算子执行

用于元数据驱动的算子执行。

场景三:元数据版本管理

用于元数据版本管理。

场景四:元数据验证

用于元数据验证。

总结

MetaDef与Ops-NN的组合:

  • 元数据定义
  • 算子集成
  • 自动生成
  • 版本管理
  • 验证机制

通过元数据定义和神经网络算子的协同,实现了高效的模型表示和执行,是模型管理的重要工具。

相关链接

metadef仓库地址:https://atomgit.com/cann/metadef

ops-nn仓库地址:https://atomgit.com/cann/ops-nn

CANN组织地址:https://atomgit.com/cann

ge仓库地址:https://atomgit.com/cann/ge

相关推荐
墨风如雪12 小时前
那个霸榜的Pony Alpha现身了:智谱GLM-5硬刚Claude Opus
aigc
程序员鱼皮14 小时前
我用 GLM-5 做了个 AI 女友,能发自拍、发语音、还能帮我干活!
程序员·aigc·ai编程
小碗细面15 小时前
AI 编程三剑客:Spec-Kit、OpenSpec、Superpowers 深度对比与实战指南
aigc·ai编程
用户51914958484516 小时前
Canvas iOS - 教育技术解决方案的自动化构建与高效协作工具链
人工智能·aigc
向量引擎16 小时前
别再问GPT-5.3怎么还没记忆了!你的AI还没装“海马体”?揭秘让OpenClaw起飞的幕后大佬:高性能向量引擎实战指南(附Clawdbot保姆级配置)
人工智能·gpt·aigc·agi·api调用
量子位17 小时前
华为升级行业Agent算法架构!MindScale自己写prompt和工作流,KV Cache减少5.7倍token
aigc·agent·ai编程
量子位17 小时前
GLM-5真够顶的:超24小时自己跑代码,700次工具调用、800次切上下文!
人工智能·aigc
量子位17 小时前
神仙打架+1!讯飞星火X2硬核亮相,行业深度全面升级
人工智能·aigc
500佰1 天前
我又开发了一款桌面APP,功能强大
人工智能·aigc·个人开发·扩展屏应用开发