diff options
| author | Jonas Knobloch <jonas.knobloch@t-online.de> | 2026-09-10 01:59:34 +0200 |
|---|---|---|
| committer | Jonas Knobloch <jonas.knobloch@t-online.de> | 2026-09-10 01:59:34 +0200 |
| commit | f998fee7427403698f9262d1e92d1a307c652094 (patch) | |
| tree | 88fa03f0a13045d9e13ab4235475a6ff8512de5d /research/entropy/cmd/dict3/main.go | |
| parent | 123a37a04b0076c569cbed7c2669ab1087e2cba7 (diff) | |
WIP
Diffstat (limited to 'research/entropy/cmd/dict3/main.go')
| -rw-r--r-- | research/entropy/cmd/dict3/main.go | 159 |
1 files changed, 0 insertions, 159 deletions
diff --git a/research/entropy/cmd/dict3/main.go b/research/entropy/cmd/dict3/main.go deleted file mode 100644 index a6b0211..0000000 --- a/research/entropy/cmd/dict3/main.go +++ /dev/null @@ -1,159 +0,0 @@ -package main - -import ( - "bufio" - "database/sql" - "fmt" - "io" - "log" - "os" - - _ "github.com/duckdb/duckdb-go/v2" - "github.com/jonasknobloch/mbpe" - "go.jknobloc.com/x/dict" - "go.jknobloc.com/x/research/entropy" - "go.jknobloc.com/x/tokenizer/bpe" - - "go.jknobloc.com/x/shelf" -) - -type NoPreTok struct{} - -func (p *NoPreTok) PreTokenize(s string) []string { - return []string{s} -} - -func main() { - o := shelf.Abs("results/runs-entropy/lesci_minipile_test_256_seed_default/gpt2_256_m000_minipile_seed/lesci.db") - - var db *sql.DB - - if database, err := initDatabase(o); err != nil { - log.Fatal(err) - } else { - db = database - } - - defer db.Close() - - db.SetMaxOpenConns(1) - - var file *os.File - - if f, err := os.Open(shelf.Abs("results/knobloch/minipile/dict.txt")); err != nil { - log.Fatal(err) - } else { - file = f - } - - tok := tokenizerMBPE() - - var dict *dict.Dict[*entropy.Entry] - - if d, err := loadDict(file, tok); err != nil { - log.Fatal(err) - } else { - dict = d - } - - if err := entropy.Run(db, dict); err != nil { - log.Fatal(err) - } -} - -func initDatabase(dsn string) (*sql.DB, error) { - var db *sql.DB - - if database, err := sql.Open("duckdb", dsn); err != nil { - return nil, err - } else { - db = database - } - - if err := db.Ping(); err != nil { - _ = db.Close() - - return nil, err - } - - return db, nil -} - -func loadDict(r io.Reader, tok *mbpe.Tokenizer) (*dict.Dict[*entropy.Entry], error) { - d := dict.NewDict[*entropy.Entry]() - - // TODO we could count non empty lines to pre alloc dict - - scanner := bufio.NewScanner(r) - - for scanner.Scan() { - line := scanner.Text() - - if err := scanner.Err(); err != nil { - return nil, err - } - - var s string - var n int - - if _, err := fmt.Sscanf(line, "%s %d", &s, &n); err != nil { - return nil, err - } - - // TODO see cmd/main.go we currently need mbpe tok ?? - - if n < 100 { - continue - } - - ids := tok.Tokenize(s) - - if len(ids) < 4 { - continue - } - - b := to[int, uint8](ids) // TODO that conversion is fucking ass - - // TODO vs decode each buffer suffix and use s as map key - - d.Set(string(b), &entropy.Entry{ - Encoded: s, // TODO encoded or decoded - TokenIDs: b, - LogProbs: make([]float32, len(ids)), - N: 0, - }) - } - - return d, nil -} - -func to[a bpe.Integer, b bpe.Integer](s []a) []b { - r := make([]b, len(s)) - - // TODO handle overflow - - for i, v := range s { - r[i] = b(v) - } - - return r -} - -func tokenizerMBPE() *mbpe.Tokenizer { - var tok *bpe.Tokenizer - - v := shelf.Abs("tokenizers/minipile/tokenizer_gpt2_256_m000_minipile/vocab.json") - m := shelf.Abs("tokenizers/minipile/tokenizer_gpt2_256_m000_minipile/merges.txt") - - if t, err := bpe.NewTokenizerFromFiles(v, m, bpe.DefaultConfig()); err != nil { - log.Fatal(err) - } else { - tok = t - } - - foo := bpe.MBPE(tok) - - foo.SetPreTokenizer(&NoPreTok{}) - - return foo -} |
