161 lines
5.0 KiB
Go
161 lines
5.0 KiB
Go
/*
|
|
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package llama2
|
|
|
|
import (
|
|
_ "unsafe"
|
|
|
|
"github.com/goplus/llgo/c"
|
|
)
|
|
|
|
const (
|
|
LLGoFiles = "llama2/llama2.c"
|
|
LLGoPackage = "link: -lm"
|
|
)
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// llgo:type C
|
|
type TokenIndex struct {
|
|
Str *c.Char
|
|
Id c.Int
|
|
}
|
|
|
|
// llgo:type C
|
|
type Tokenizer struct {
|
|
Vocab **c.Char
|
|
VocabScores *c.Float
|
|
SortedVocab *TokenIndex
|
|
VocabSize c.Int
|
|
MaxTokenLength c.Uint
|
|
BytePieces [512]uint8 // stores all single-byte strings
|
|
}
|
|
|
|
//go:linkname BuildTokenizer C.build_tokenizer
|
|
func BuildTokenizer(t *Tokenizer, tokenizerPath *c.Char, vocabSize c.Int)
|
|
|
|
//go:linkname FreeTokenizer C.free_tokenizer
|
|
func FreeTokenizer(t *Tokenizer)
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// llgo:type C
|
|
type Config struct {
|
|
Dim c.Int // transformer dimension
|
|
HiddenDim c.Int // for ffn layers
|
|
NLayers c.Int // number of layers
|
|
NHeads c.Int // number of query heads
|
|
NKVHeads c.Int // number of key/value heads (can be < query heads because of multiquery)
|
|
VocabSize c.Int // vocabulary size, usually 256 (byte-level)
|
|
SeqLen c.Int // max sequence length
|
|
}
|
|
|
|
// llgo:type C
|
|
type TransformerWeights struct {
|
|
// token embedding table
|
|
TokenEmbeddingTable *c.Float // (vocab_size, dim)
|
|
// weights for rmsnorms
|
|
RmsAttWeight *c.Float // (layer, dim) rmsnorm weights
|
|
RmsFfnWeight *c.Float // (layer, dim)
|
|
// weights for matmuls. note dim == n_heads * head_size
|
|
Wq *c.Float // (layer, dim, n_heads * head_size)
|
|
Wk *c.Float // (layer, dim, n_kv_heads * head_size)
|
|
Wv *c.Float // (layer, dim, n_kv_heads * head_size)
|
|
Wo *c.Float // (layer, n_heads * head_size, dim)
|
|
// weights for ffn
|
|
W1 *c.Float // (layer, hidden_dim, dim)
|
|
W2 *c.Float // (layer, dim, hidden_dim)
|
|
W3 *c.Float // (layer, hidden_dim, dim)
|
|
// final rmsnorm
|
|
RmsFinalWeight *c.Float // (dim,)
|
|
// (optional) classifier weights for the logits, on the last layer
|
|
Wcls *c.Float
|
|
}
|
|
|
|
// llgo:type C
|
|
type RunState struct {
|
|
// current wave of activations
|
|
X *c.Float // activation at current time stamp (dim,)
|
|
Xb *c.Float // same, but inside a residual branch (dim,)
|
|
Xb2 *c.Float // an additional buffer just for convenience (dim,)
|
|
Hb *c.Float // buffer for hidden dimension in the ffn (hidden_dim,)
|
|
Hb2 *c.Float // buffer for hidden dimension in the ffn (hidden_dim,)
|
|
Q *c.Float // query (dim,)
|
|
K *c.Float // key (dim,)
|
|
V *c.Float // value (dim,)
|
|
Att *c.Float // buffer for scores/attention values (n_heads, seq_len)
|
|
Logits *c.Float // output logits
|
|
// kv cache
|
|
KeyCache *c.Float // (layer, seq_len, dim)
|
|
ValueCache *c.Float // (layer, seq_len, dim)
|
|
}
|
|
|
|
// llgo:type C
|
|
type Transformer struct {
|
|
Config Config // the hyperparameters of the architecture (the blueprint)
|
|
Weights TransformerWeights // the weights of the model
|
|
State RunState // buffers for the "wave" of activations in the forward pass
|
|
|
|
// some more state needed to properly clean up the memory mapping (sigh)
|
|
Fd c.Int // file descriptor for memory mapping
|
|
Data *c.Float // memory mapped data pointer
|
|
FileSize uintptr // size of the checkpoint file in bytes
|
|
}
|
|
|
|
//go:linkname BuildTransformer C.build_transformer
|
|
func BuildTransformer(t *Transformer, checkpointPath *c.Char)
|
|
|
|
//go:linkname FreeTransformer C.free_transformer
|
|
func FreeTransformer(t *Transformer)
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// llgo:type C
|
|
type ProbIndex struct {
|
|
Prob c.Float
|
|
Index c.Int
|
|
} // struct used when sorting probabilities during top-p sampling
|
|
|
|
// llgo:type C
|
|
type Sampler struct {
|
|
VocabSize c.Int
|
|
Probindex *ProbIndex // buffer used in top-p sampling
|
|
Temperature c.Float
|
|
Topp c.Float
|
|
RngState uint64
|
|
}
|
|
|
|
//go:linkname BuildSampler C.build_sampler
|
|
func BuildSampler(sampler *Sampler, vocabSize c.Int, temperature c.Float, topp c.Float, rngSeed uint64)
|
|
|
|
//go:linkname FreeSampler C.free_sampler
|
|
func FreeSampler(sampler *Sampler)
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
//go:linkname Generate C.generate
|
|
func Generate(
|
|
transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler,
|
|
prompt *c.Char, steps c.Int)
|
|
|
|
//go:linkname Chat C.chat
|
|
func Chat(
|
|
transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler,
|
|
cliUserPrompt *c.Char, cliSystemPrompt *c.Char, steps c.Int)
|
|
|
|
// -----------------------------------------------------------------------------
|