大模型交叉研讨课目录

链接: 大模型交叉研讨课

课程安排

第一部分:大模型基础

  • 第一节:自然语言处理基础知识 【6月27日】
  • 第二节:神经网络基础知识 【6月29日】
  • 第三节:Transformer与预训练模型 【7月1日】

第二部分:大模型技术

  • 第四节:Prompt Tuning, Delta Tuning 背景以及技术【7月4日】
  • 第五节:BMInf, BMTrain,BMCook相关背景和技术和使用【7月6日】
  • 第六节:基于大模型的文本理解与生成解决方案【7月8日】

第三部分:大模型交叉应用

  • 第七节:大模型X生物医学 【7月11日】
  • 第八节:大模型X法律智能 【7月13日】
  • 第九节:大模型X脑科学 【7月15日】


Transformers for NLP 第一章

第一章 What are Transformers?

工业4.0

这一章,作者认为Transformers 是工业4.0这个观点进行了阐述。

An Industry 4.0 project manager can go to OpenAI’s cloud platform, sign up, obtain an API key, and get to work in a few minutes. A user can then enter a text, specify the NLP task, and obtain a response sent by a GPT-3 transformer engine. Finally, a user can go to GPT-3 Codex and create applications with no knowledge of programming. Prompt engineering is a new skill that emerged from these models.

首先是云平台,然后提供API访问 包括像Codex都是,只要大模型提供了云API 都算是工业4.0 。 工业4.0 其实是数据驱动的人工智能型的网络化“智能工厂”,确实现在类似的API,其实还没有进入工业领域。

围绕现在transformers这个模型,其实建立起来的是foudation models,算是模型基础设施,后面这种基础设施也只有大厂会来做。

AI 的新范式,感觉是以基础大模型+微调 组成的。 这确实算是一种新的颠覆。

生成代码的Codex

输入:

输出的代码:

工业4.0 AI的角色

  1. API – 大模型
  2. 库 – 开源库
  3. 训练和微调 – 提供计算,训练和微调服务
  4. 开发技巧 – 模型落地

Transformers for NLP笔记

版本:Transformers for Natural Language Processing_Build, train, and fine-tune deep neural network architectures for NLP with Python, PyTorch, TensorFlow, BERT, and GPT-3 2nd Edition

官方代码: https://github.com/Denis2054/Transformers-for-NLP-2nd-Edition

目录:

  • Chapter 1: What are Transformers?
  • Chapter 2: Getting Started with the Architecture of the Transformer Model
  • Chapter 3: Fine-Tuning BERT Models
  • Chapter 4: Pretraining a RoBERTa Model from Scratch
  • Chapter 5: Downstream NLP Tasks with Transformers
  • Chapter 6: Machine Translation with the Transformer
  • Chapter 7: The Rise of Suprahuman Transformers with GPT-3 Engines
  • Chapter 8: Applying Transformers to Legal and Financial Documents for AI Text Summarization
  • Chapter 9: Matching Tokenizers and Datasets
  • Chapter 10: Semantic Role Labeling with BERT-Based Transformers
  • Chapter 11: Let Your Data Do the Talking: Story, Questions, and Answers
  • Chapter 12: Detecting Customer Emotions to Make Predictions
  • Chapter 13: Analyzing Fake News with Transformers
  • Chapter 14: Interpreting Black Box Transformer Models
  • Chapter 15: From NLP to Task-Agnostic Transformer Models
  • Chapter 16: The Emergence of Transformer-Driven Copilots

08.DPU网络开发SDK—DPDK(七)

接上次内容继续对rte_eal_init()所做的工作进行分析。
 
24. 内存初始化
24.2. 内存分配
调用eal_memalloc_init()来处理内存分配,前半部分根据进程是primary还是secondary走不同的流程,后半部分两者相同。

前后两个初始化过程中,用到了一个特殊的func,rte_memseg_list_walk(),该func的传入参数是一个rte_memseg_list_walk_t类型的函数指针及void *通用指针。在list_walk()中,会对rte_config.mem_config.memsegs列表中每一个memseg list依次调用函数指针指向的函数,且保证了整个过程中是在mem_config.memory_hotplug_lock锁的保护下进行的。

  • 以secondary方式
通过list_walk()来调用secondary_msl_create_walk()来为每个memseg list分配内存,该func中,根据primary的memseg list的大小,初始化一个local_memsegs结构,初始化还是调用rte_fbarray_init()来实现。primary的memseg list的大小从mem_config.memsegs获取到。

  • 以primary方式
该过程中,通过test_memfd_create执行memfd_create系统调用,测试当前系统是否支持创建匿名的内存共享,检查结果根据当前系统的一些配置情况决定是否以错误退出。

分primary和secondary之后,不管哪种方式初始化,都会执行fd_list_create_walk()。create_walk()对每个memseg list调用alloc_list(),alloc_list()会初始化文件描述符列表数组fd_list,每个memseg list对应一个数组项,数组项中会指向一块内存,用于存储文件描述符,这里的文件描述符即为匿名内存共享文件的描述符。

24.3. 初始化大页
初始化大页同样分primary和secondary

  • 以primary方式
调用rte_eal_hugepage_init(),如果internal_config设置了legacy_mem,那么调用eal_legacy_hugepage_init(),否则调用eal_dynmem_hugepage_init()。

 A. eal_dynmem_hugepage_init()
对于每一种大小类型的大页,确定好每个socket上页面的数量;统计出每个numa node上的内存大小;根据这些信息调用eal_dymem_calc_num_pages_per_socket()最终确定每种大小类型的页面的数量。

确定好这些信息之后,多次调用eal_memalloc_alloc_seg_bulk()来映射页面,该func通过list_walk()调用alloc_seg_walk()来完成这些工作。

B. eal_legacy_hugepage_init()
分为两种情况执行,一种禁用hugetlbfs情况下,另一种是在启用情况下。
 
a. 禁用hugetlbfs
此时允许的内存大小为64GB,页面大小为4KB,以此得出所需要的一个页面数量之后,调用eal_memseg_list_init_named()来重新初始化mem_config.memsegs[0]这个memseg list。然后通过eal_memseg_list_alloc()间接调用eal_get_virtual_area()为memseg分配虚拟地址,下一步通过mmap()系统调用创建匿名映射并获得匿名映射地址addr,接下来通过eal_memseg_list_populate()填充mem_config.memsegs[0]这个memseg list,以addr为基准计算出每个memseg的地址,填到相应的结构体中。
 
b. 启用hugetlbfs
首先统计出用了哪几种大小类型的大页内存,并且计算出总的大页内存页面数量,分别存放在used_hp数组和nr_hugepages当中。接下来开辟一块内存tmp_hp,用于存放nr_hugepages个struct hugepage_file结构,hugepage_file结构用于存放一些信息,比如该大页被映射到进程地址空间的哪个虚拟地址,大页物理地址是多少,所属socket_id是多少。

接下来,对于每一种页面大小类型的大页,做如下操作:

1.调用map_all_hugepages()映射该大小类型的所有大页,具体做法是调用open()打开大页在/sys文件系统中的文件,然后mmap()之后获取一个虚拟地址,并记录在结构体当中。

2.如果启用了物理地址,且IOVA的模式不是VA,那么调用find_physaddrs()获取到每个大页的物理地址并保存下来,否则调用set_physaddrs()设定一个伪物理地址。

3.调用find_numasocket()确定每个大页所属的socket_id。

4.根据物理地址将tmp_hp进行排序。

接下来根据tmp_hp中的信息,统计出每个socket每种大小类型的大页的数量,更新这些信息更新到internal_config.hugepage_info结构体当中,并最终确定每个socket下大页的数量。

接下来调用create_shared_memory()创建一个共享文件,大小为nr_hugepages个struct hugepage_file结构体,路径为/var/run/dpdk/rte/hugepage_data;接下来调用copy_hugepages_to_shared_mem()将该进程中分配到的大页信息写入到该文件当中。需要指出的是,到此为止所需要分配的内存就分配完了,后续不会再根据需要再额外分配大页内存,即使在DPDK进程运行过程中遇到内存耗尽的情况,所以在最后的收尾工作中,会将一些不需要的memseg list做释放处理。

  • 以secondary方式
调用rte_eal_hugepage_attach()来实现,同样分为是否设置了lagacy_mem,分别调用eal_legacy_hugepage_attach()和eal_hugepage_attach()

A. eal_legacy_hugepage_attach()
打开primary进程创建的文件/var/run/dpdk/rte/hugepage_data,并读取相应的信息,该文件的是多个hugepage_file结构体。对于每一个结构体中包含的信息,通过mmap()将大页内存还原到当前secondary进程当中,并以此初始化memseg list。

B. eal_hugepage_attach()
调用eal_memalloc_sync_with_primary(),该func会调用sync_walk()。sync_walk()会根据primary进程中的memseg list信息初始化自己的memseg list。sync_walk()会调用sync_existing()去打开/sys文件系统中的大页文件去确认已经被primary分配的内存和未被primary分配的内存跟memseg list中的信息是一致的,在确保一致的情况下才可以进行后续工作。
未完待续… 
往期回顾:
07.DPU网络开发SDK—DPDK(六)
06.DPU网络开发SDK—DPDK(五)
05.DPU网络开发SDK—DPDK(四)