jiuge_weight.hpp 4.98 KB
Newer Older
PanZezhong's avatar
init  
PanZezhong committed
1
2
3
4
5
6
#ifndef JIUGE_WEIGHT_HPP
#define JIUGE_WEIGHT_HPP

#include "jiuge_impl.hpp"

#include <cmath>
PanZezhong's avatar
PanZezhong committed
7
inline std::shared_ptr<Tensor> getInEmbd(
PanZezhong's avatar
init  
PanZezhong committed
8
9
10
11
12
13
    JiugeMeta const *meta,
    JiugeWeights const *w) {
    auto shape = std::vector<size_t>({meta->dvoc, meta->d});
    return Tensor::weight((char *)w->input_embd, meta->dt_logits, shape);
}

PanZezhong's avatar
PanZezhong committed
14
inline std::shared_ptr<Tensor> getOutNorm(
PanZezhong's avatar
init  
PanZezhong committed
15
16
17
18
19
20
    JiugeMeta const *meta,
    JiugeWeights const *w) {
    auto shape = std::vector<size_t>({meta->d});
    return Tensor::weight((char *)w->output_norm, meta->dt_norm, shape);
}

PanZezhong's avatar
PanZezhong committed
21
inline std::shared_ptr<Tensor> getOutEmbd(
PanZezhong's avatar
init  
PanZezhong committed
22
23
24
25
26
27
28
    JiugeMeta const *meta,
    JiugeWeights const *w) {
    auto shape = std::vector<size_t>({meta->dvoc, meta->d});
    return Tensor::weight((char *)w->output_embd, meta->dt_logits, shape)
        ->permute({1, 0});
}

PanZezhong's avatar
PanZezhong committed
29
inline std::shared_ptr<Tensor> getAttnNorm(
PanZezhong's avatar
init  
PanZezhong committed
30
31
32
33
34
35
36
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer) {
    auto shape = std::vector<size_t>({meta->d});
    return Tensor::weight((char *)(w->attn_norm[layer]), meta->dt_norm, shape);
}

PanZezhong's avatar
PanZezhong committed
37
inline std::shared_ptr<Tensor> getAttnQKV(
PanZezhong's avatar
init  
PanZezhong committed
38
39
40
41
42
43
44
45
46
47
48
49
50
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer, size_t idev, size_t ndev) {
    auto nkvh = meta->nkvh;
    auto nh = meta->nh;
    auto dh = meta->dh;
    auto d = meta->d;
    size_t offset = idev * ((nkvh * 2 + nh) / ndev * dh) * d * dsize(meta->dt_mat);
    auto shape = std::vector<size_t>({(nh + 2 * nkvh) / ndev * dh, d});
    return Tensor::weight((char *)(w->attn_qkv[layer]) + offset, meta->dt_mat, shape)
        ->permute({1, 0});
}

PanZezhong's avatar
PanZezhong committed
51
inline std::shared_ptr<Tensor> getAttnQKVBias(
PanZezhong's avatar
init  
PanZezhong committed
52
53
54
55
56
57
58
59
60
61
62
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer, size_t idev, size_t ndev) {
    auto nkvh = meta->nkvh;
    auto nh = meta->nh;
    auto dh = meta->dh;
    size_t offset = idev * ((nkvh * 2 + nh) / ndev * dh) * dsize(meta->dt_mat);
    auto shape = std::vector<size_t>({1, (nh + 2 * nkvh) / ndev * dh});
    return Tensor::weight((char *)(w->attn_qkv_b[layer]) + offset, meta->dt_mat, shape);
}

PanZezhong's avatar
PanZezhong committed
63
64
65
inline std::shared_ptr<Tensor> getAttnO(JiugeMeta const *meta,
                                        JiugeWeights const *w, size_t layer,
                                        size_t idev, size_t ndev) {
PanZezhong's avatar
init  
PanZezhong committed
66
67
68
69
70
71
72
73
74
    auto nh = meta->nh;
    auto dh = meta->dh;
    auto d = meta->d;
    size_t offset = idev * d * (nh / ndev * dh) * dsize(meta->dt_mat);
    auto shape = std::vector<size_t>({d, nh / ndev * dh});
    return Tensor::weight((char *)(w->attn_o[layer]) + offset, meta->dt_mat, shape)
        ->permute({1, 0});
}

PanZezhong's avatar
PanZezhong committed
75
inline std::shared_ptr<Tensor> getFFNNorm(
PanZezhong's avatar
init  
PanZezhong committed
76
77
78
79
80
81
82
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer) {
    auto shape = std::vector<size_t>({meta->d});
    return Tensor::weight((char *)(w->ffn_norm[layer]), meta->dt_norm, shape);
}

PanZezhong's avatar
PanZezhong committed
83
inline std::shared_ptr<Tensor> getFFNGateUp(
PanZezhong's avatar
init  
PanZezhong committed
84
85
86
87
88
89
90
91
92
93
94
95
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer, size_t idev, size_t ndev) {
    auto di = meta->di;
    auto d = meta->d;
    size_t offset = idev * (2 * di / ndev) * d * dsize(meta->dt_mat);
    auto shape = std::vector<size_t>({2 * di / ndev, d});
    return Tensor::weight((char *)(w->ffn_gate_up[layer]) + offset,
                          meta->dt_mat, shape)
        ->permute({1, 0});
}

PanZezhong's avatar
PanZezhong committed
96
inline std::shared_ptr<Tensor> getFFNDown(
PanZezhong's avatar
init  
PanZezhong committed
97
98
99
100
101
102
103
104
105
106
107
    JiugeMeta const *meta,
    JiugeWeights const *w,
    size_t layer, size_t idev, size_t ndev) {
    auto di = meta->di;
    auto d = meta->d;
    size_t offset = idev * d * (di / ndev) * dsize(meta->dt_mat);
    auto shape = std::vector<size_t>({d, di / ndev});
    return Tensor::weight((char *)(w->ffn_down[layer]) + offset, meta->dt_mat, shape)
        ->permute({1, 0});
}

PanZezhong's avatar
PanZezhong committed
108
inline std::shared_ptr<Tensor> getSinTable(JiugeMeta const *meta) {
PanZezhong's avatar
init  
PanZezhong committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
    float *table = (float *)std::malloc(meta->dctx * meta->dh * sizeof(float));
    auto half_dh = meta->dh / 2;
    for (size_t i = 0; i < meta->dctx; i++) {
        for (size_t j = 0; j < half_dh; j++) {
            float _sin = std::sin(
                static_cast<float>(i) / std::pow(meta->theta, static_cast<float>(j) / half_dh));
            table[i * meta->dh + 2 * j] = _sin;
            table[i * meta->dh + 2 * j + 1] = _sin;
        }
    }
    auto shape = std::vector<size_t>({meta->dctx, meta->dh});
    auto tensor = Tensor::weight(table, meta->dt_logits, shape);
    std::free(table);
    return tensor;
}

PanZezhong's avatar
PanZezhong committed
125
inline std::shared_ptr<Tensor> getCosTable(JiugeMeta const *meta) {
PanZezhong's avatar
init  
PanZezhong committed
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
    float *table = (float *)std::malloc(meta->dctx * meta->dh * sizeof(float));
    auto half_dh = meta->dh / 2;
    for (size_t i = 0; i < meta->dctx; i++) {
        for (size_t j = 0; j < half_dh; j++) {
            float _cos = std::cos(
                static_cast<float>(i) / std::pow(meta->theta, static_cast<float>(j) / half_dh));
            table[i * meta->dh + 2 * j] = _cos;
            table[i * meta->dh + 2 * j + 1] = _cos;
        }
    }
    auto shape = std::vector<size_t>({meta->dctx, meta->dh});
    auto tensor = Tensor::weight(table, meta->dt_logits, shape);
    std::free(table);
    return tensor;
}

#endif