12. 模型文件的配置信息
根据前面保存的模型文件 output/model.bin 的内容,可以知道,模型配置信息的起始位置是0,大小是28个字节,下面来分析模型配置的详细信息
命名为 test03.c,文件保存到 newsrc 目录下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include <math.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> // 用于存储和传递 Transformer 模型的超参数,即构建模型所需的各种参数。 // 在实际应用中,这个结构体的实例通常会作为参数传递给模型的构造函数,以初始化模型的结构。 typedef struct { // 代表 Transformer 模型的维度。在自然语言处理中,这个维度通常是嵌入(embedding)层和所有 Transformer 层的输出维度。 int dim; // transformer dimension // 代表前馈神经网络层(Feed Forward Neural Network Layer,即 Transformer 模型中的全连接层)的隐藏层维度。 int hidden_dim; // for ffn layers // 表示模型中的层数量。在一个标准的 Transformer 模型中,一个层包含一个多头自注意力机制(Multi-head Self Attention Mechanism)和一个前馈神经网络层。 int n_layers; // number of layers // 表示多头注意力机制中查询头的数量。多头注意力允许模型同时关注输入序列中的多个位置 int n_heads; // number of query heads // 表示键/值对的头的数量。这可以小于查询头的数量,因为有一些模型可能使用多查询功能。 int n_kv_heads; // number of key/value heads (can be < query heads because of multiquery) // 代表模型的词汇表大小。对于字节级的模型,词汇量通常为 256,因为有 256 个可能的字节值。 int vocab_size; // vocabulary size, usually 256 (byte-level) // 表示模型可以处理的最大序列长度。序列长度是输入到模型中的 token(如单词或字节)的数量。 int seq_len; // max sequence length } Config; int main(int argc, char *argv[]) { Config config; char *checkpoint = "../output/model.bin"; FILE *file = fopen(checkpoint, "rb"); if (!file) { fprintf(stderr, "Couldn't open file %s\n", checkpoint); exit(EXIT_FAILURE); } // 读取文件中的 Config 结构体信息。 if (fread(&config, sizeof(Config), 1, file) != 1) { fprintf(stderr, "Couldn't read file %s\n", checkpoint); exit(EXIT_FAILURE); } fclose(file); printf("sizeof(Config) = %ld\n", sizeof(Config)); printf("dim = %d\n", config.dim); printf("hidden_dim = %d\n", config.hidden_dim); printf("n_layers = %d\n", config.n_layers); printf("n_heads = %d\n", config.n_heads); printf("n_kv_heads = %d\n", config.n_kv_heads); printf("vocab_size = %d\n", config.vocab_size); printf("seq_len = %d\n", config.seq_len); return 0; } |
编译 test03.c
1 2 |
make test03 cc test03.c -o test03 |
运行 test03
1 2 3 4 5 6 7 8 9 |
./test03 sizeof(Config) = 28 dim = 4096 hidden_dim = 11008 n_layers = 32 n_heads = 32 n_kv_heads = 32 vocab_size = -32000 seq_len = 4096 |