image-20210616113503631

大赛官网 | 大赛资料 | 报名链接 | 技术社区 | 微信群

【编程挑战赛道】赛题详细说明

1. 比赛概述

比赛日期 7月8日 -- 9月15日

面向人群 IT 行业开发人员,高校计算机或者相关专业学生,对计算机行业新技术感兴趣

比赛目的 基于人工智能推荐系统的核心算法,在异构内存架构上编程高性能、具备持久化特性的数据结构。我们将通过深入浅出的技术资料,指导你快速掌握相关技能。

支持 你可以从以下渠道获得技术或者比赛相关支持

2. 赛题背景

向量搜索在各个领域有广泛的应用,包括计算机视觉、搜索、推荐等,只要物料(比如,图片、视频、文档、商品)被向量化表示了,就可以通过向量搜索来查询相似的物品。在推荐系统中其通常流程为,当在线请求送来一个目标向量,系统首先经过向量搜索进行初步筛选得到相似的向量,再经过精排来确定最后的推荐项。由于向量搜索一般使用于在线推荐系统,对内存消耗和性能均有较高的要求。异构内存一方面可以通过大容量的持久内存降低硬件成本,另一方面通过分级存储优化保障其高性能。

3. 比赛平台和模拟环境

3.1 比赛平台

比赛使用第四范式的 OpenAIOS 平台 https://openaios.4paradigm.com/。比赛启动以后,在主页 活动与赛事 下面找到 【比赛】【AI应用与异构内存编程挑战赛】编程挑战赛道,打开以后,如果已经报名(否则请先填写表单报名),则会在下面看到按钮一键初始化环境。初始化以后你将会在开发环境下找到对应赛道的环境 ai-coding (确保状态为 Running),就可以使用命令行窗口登录环境了。

image-20210706133239155

注意点:

  1. 每位选手每天使用时间将会有一定的配额(6小时),请合理规划使用时间
  2. 如果选手每天需要分段使用,那么每次使用完成请删除开发环境,否则将连续计时
  3. 【重要】开发环境下有持久化目录/ai2021,请将需要提交的代码存放在该目录下,删除开发环境不会影响存放在该目录下的数据,否则其他目录将会在删除环境以后丢失。

3.2 自己搭建模拟环境

选手也可以在自己的计算机或者其他公有云上搭建一个用来debug程序的模拟环境,注意该环境只是为了验证程序正确性,对于性能没有任何参考意义。

4. 赛题详细描述

4.1 赛题简介

比赛总体完成的任务为,基于给出的向量搜索示例程序,把本来存在内存上的索引数据结构存储到持久内存上,然后基于这个索引考察搜索效率

完成比赛中有如下几个注意点:

  1. 完成比赛需要一点点的持久化编程基础知识,学习成本大概为 1 个小时 ☛【持久内存编程参考资料】
  2. 我们会给出一个基于纯内存的基础实现版本,选手基于此版本代码做修改来利用基于持久内存的异构内存架构
  3. 我们会给出向量搜索的算法背景,但是你也可以忽略,不理解算法逻辑也不会影响到你的实现(☛【 算法背景】)
  4. 为了减少编程复杂性,本次不考察程序意外中断以后的恢复正确性,只考察最基本的持久性,即程序正常退出以后,从正常保存的数据中进行恢复
  5. 我们预留空间供有能力的选手来优化性能提升排名,有兴趣的同学记得一定要看我们的【性能优化指南】章节哦

4.2 算法介绍

由于我们已经给出了基于纯内存的参考代码,并且代码本身逻辑并不复杂,所以如果仅仅为了完成比赛,将纯内存版本改造为基于持久内存的版本,了解算法本身并不是必须的。如果你期望了解算法背景,可以参考这里☛【 算法背景】。

4.3 代码框架和参考实现

启动比赛环境以后(参考 3.1 比赛平台),从以下地址clone我们为你提供的代码框架,请基于该框架进行开发。

注意,请务必将 clone 以后的代码放在你的持久化路径 /ai2021下面,并且基于该框架进行开发,评测程序将会自动抓取该目录下的代码进行测试打分。你的代码存放完整路径结构应该为:/ai2021/vec_search 。也请仔细阅读vec_search下的README文件,有关相关代码结构和辅助脚本的使用。

以下列出了代码 repo vec_search 下的文件结构

4.4 接口和调用逻辑

下载代码框架以后,请参照里面的接口。需要实现的功能的相关接口定义请参照:include/index.h请勿修改该接口文件,否则可能导致评测程序运行异常。

以下列出 include/index.h给出的代码接口:

此文件include/index.h为包含索引结构的类的接口,是选手最主要需要关注的代码部分。代码库下的文件给出了纯内存的参考实现版本impl/index_impl.h,选手需要根据该参考实现版本改写为基于持久内存的版本(具体实现要求见 4.5 实现要求)。整体上需要满足的调用逻辑顺序和注意点为:

  1. 首先调用 VectorIndexInterface 构建对象:

    1. 如果 path 上已经有建立好的索引文件,则直接使用
    2. 否则建立 pmem pool,索引文件将由后面的 build_index 生成并保存到 path
  2. 单线程调用 add_item 把所有向量放入内部数据结构

    1. 请将参考代码改写,将数据保存到持久内存上
  3. 所有向量都插入以后,单线程调用 build_index,在持久内存上建立索引文件

  4. 程序正常退出,重启

    1. 由于索引文件直接放在持久内存上,理论上正常退出,重启以后,程序只需要从持久内存上直接读取即可,即走步骤 1-a 的逻辑
    2. 注意:我们给出的 DRAM 参考代码并没有包含持久化逻辑,这部分持久化功能需要选手实现
  5. 测试程序多线程调用 search_top1,进行性能评估

4.5 实现要求

开始开发前,务必仔细阅读 repo 代码包 vec_search 里面的 README,关于注意事项和所提供的工具集。

实现功能要求

  1. 我们给出基础的 DRAM 版本实现(impl/index_impl.h),请勿改变 build_index 内部建树的逻辑和过程,也不要修改几个功能函数的计算逻辑(create_hyperplane, margin),否则可能影响正确性测试

  2. 你要完成的基本改造任务为,将两个数据结构(items和索引)存储到持久内存上(详见我们代码内关于修改的注释):

    1. 调用 add_item 以后,items 由于会大于内存,需要保存在持久内存上
    2. 索引数据结构保存到持久内存
  3. 基于给出的代码框架和比赛要求,建议修改的文件只有两个(修改部分参考代码注释):

    1. impl/index_impl.h:给出了 DRAM 基础版本实现,选手修改为基于持久内存版本
    2. include/distance.h:需要根据 PMDK 的接口(比如持久指针),进行修改
    3. 如果你的优化措施中需要有额外的修改,建议和我们联系确认
  4. 向量搜索函数 search_top1 会被多线程调用测试,来作为性能排名依据,如果引入了一些优化,需要注意线程安全

  5. 我们的代码包里也包含了若干个单元测试程序,请确保通过测试,详见代码包里的 README 文件

  6. (可选)我们的测试数据模拟真实情况,会有明显的热点存在,可以参考我们的提示做性能优化:6. 性能优化指南

一般要求和建议

  1. 代码包 vec_search 下载以后存放到开发环境的持久化存储路径:/ai2021,完整的代码包存储路径为

    注意:请严格保证该路径正确,你的环境里只有该路径为持久化存储路径!该路径也是我们评测程序抓取选手代码的路径,所以记得一定要将提交的代码放在该路径下。

  2. 持久内存挂载路径为:/pmem

  3. 编程语言:C++

  4. 持久内存编程库:持久内存编程使用 PMDK 库,为了减少学习成本,我们推荐使用其中的 libpmemobj-cpp,请参考我们的 编程参考资料

  5. 容器资源使用规格:4 cores, 64 GB PMem, 8 GB DRAM

  6. 容器使用额度:每天6小时,注意如果一天内需要分段使用,记得每次使用完成以后删除该容器(删除后持久化路径 /ai2021 下保持的代码数据依然可用),否则会继续计时

  7. 你也可以在模拟环境上进行调试,参考 3.2 自己搭建模拟环境

5. 评审逻辑

评审将会分为两部分,分别为正确性和性能测试。只有完全通过正确性测试的程序,才会进入性能测试,具有最终排名。

正确性测试

性能测试

自测脚本

我们提供了若干个自测脚本,来帮助选手测试正确性和做初步的性能测试,请阅读代码库内的 README 文件

评测方式

我们的评测程序将会比赛启动一段时间后(详见邮件和微信群通知),自动抓取存放于 /ai2021/vec_search 下面的代码进行评测,并发布当前排名。评测产生的日志文件将会存放在 /ai2021/vec_search/bench.log 目录下供参考。最终排名的评测将会基于比赛结束时最终提交在 /ai2021/vec_search目录下的代码为准。

6. 性能优化指南

在异构内存架构中,为了达到高性能,那么冷热数据的分级存储必不可少。在本次实验中,我们的测试数据将会模拟真实场景,存在明显的数据热点(即在一段时间内,会大量重复访问部分数据)。选手可以根据这个特点,设计分级存储的机制,比如

由于向量搜索函数(search_top1)会被多线程调用,优化引入额外数据结构的时候请特别注意线程安全。

7. 持久内存编程参考资料

以下资料主要针对本次比赛需要使用的技术背景,供阅读和参考

8. 排名

可以在此页面查看每天更新的排名:https://memark.io/ai_2021/rank.php