diff options
Diffstat (limited to 'research/knobloch/cmd/train/serialize.go')
| -rw-r--r-- | research/knobloch/cmd/train/serialize.go | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/research/knobloch/cmd/train/serialize.go b/research/knobloch/cmd/train/serialize.go new file mode 100644 index 0000000..9fbf968 --- /dev/null +++ b/research/knobloch/cmd/train/serialize.go @@ -0,0 +1,108 @@ +package main + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/jonasknobloch/mbpe" + + "go.jknobloc.com/x/shelf" +) + +func serialize() { + base := shelf.Abs("results/knobloch/minipile") + + var paths []string + + if ps, err := subDirs(base); err != nil { + log.Fatal(err) + } else { + paths = ps + } + + steps := []int{100512, 50256, 32768, 16384, 8192} + + outRoot := shelf.Abs("tokenizers") + + if err := os.MkdirAll(outRoot, os.ModePerm); err != nil { + log.Fatal(err) + } + + for _, step := range steps { + for _, path := range paths { + model := mbpe.NewMBPE() + + if err := model.Load(filepath.Join(path, "vocab.json"), filepath.Join(path, "merges.txt")); err != nil { + log.Fatal(err) + } + + model.Trim(step) + + dir := fmt.Sprintf("tokenizer_gpt2_%d_%s", step, filepath.Base(path)) + + out := filepath.Join(outRoot, dir) + + if err := os.Mkdir(out, os.ModePerm); err != nil { + log.Fatal(err) + } + + if err := model.Save(filepath.Join(out, "vocab.json"), filepath.Join(out, "merges.txt")); err != nil { + log.Fatal(err) + } + + var config string + var special string + + if bs, err := os.ReadFile(shelf.Abs("models/gpt2/tokenizer_config.json")); err != nil { + log.Fatal(bs) + } else { + config = string(bs) + } + + if bs, err := os.ReadFile(shelf.Abs("models/gpt2/special_tokens_map.json")); err != nil { + log.Fatal(err) + } else { + special = string(bs) + } + + config = strings.Replace(config, "50256", fmt.Sprintf("%d", step), -1) + + if err := os.WriteFile(filepath.Join(out, "tokenizer_config.json"), []byte(config), os.ModePerm); err != nil { + log.Fatal(err) + } + + if err := os.WriteFile(filepath.Join(out, "special_tokens_map.json"), []byte(special), os.ModePerm); err != nil { + log.Fatal(err) + } + } + } +} + +func subDirs(base string) ([]string, error) { + paths := make([]string, 0) + + err := filepath.WalkDir(base, func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + + rel, err := filepath.Rel(base, path) + + if err != nil { + return err + } + + depth := strings.Count(rel, string(os.PathSeparator)) + + if d.IsDir() && rel != "." && depth == 0 { + paths = append(paths, path) + } + + return nil + }) + + return paths, err +} |
