| 1144 | |
| 1145 | |
| 1146 | class OutputFile: |
| 1147 | def __init__(self, fname_out: Path, endianess:gguf.GGUFEndian = gguf.GGUFEndian.LITTLE): |
| 1148 | self.gguf = gguf.GGUFWriter(fname_out, gguf.MODEL_ARCH_NAMES[ARCH], endianess=endianess) |
| 1149 | |
| 1150 | def add_meta_arch(self, params: Params) -> None: |
| 1151 | name = "bitnet" |
| 1152 | |
| 1153 | # TODO: better logic to determine model name |
| 1154 | if params.n_ctx == 4096: |
| 1155 | name = "bitnet2b_2501" |
| 1156 | elif params.path_model is not None: |
| 1157 | name = str(params.path_model.parent).split('/')[-1] |
| 1158 | |
| 1159 | self.gguf.add_name (name) |
| 1160 | self.gguf.add_vocab_size (params.n_vocab) |
| 1161 | self.gguf.add_context_length (params.n_ctx) |
| 1162 | self.gguf.add_embedding_length (params.n_embd) |
| 1163 | self.gguf.add_block_count (params.n_layer) |
| 1164 | self.gguf.add_feed_forward_length (params.n_ff) |
| 1165 | self.gguf.add_rope_dimension_count(params.n_embd // params.n_head) |
| 1166 | self.gguf.add_head_count (params.n_head) |
| 1167 | self.gguf.add_head_count_kv (params.n_head_kv) |
| 1168 | self.gguf.add_add_bos_token (True) |
| 1169 | |
| 1170 | if params.n_experts: |
| 1171 | self.gguf.add_expert_count(params.n_experts) |
| 1172 | |
| 1173 | if params.n_experts_used: |
| 1174 | self.gguf.add_expert_used_count(params.n_experts_used) |
| 1175 | |
| 1176 | if params.f_norm_eps: |
| 1177 | self.gguf.add_layer_norm_rms_eps(params.f_norm_eps) |
| 1178 | else: |
| 1179 | raise ValueError('f_norm_eps is None') |
| 1180 | |
| 1181 | if params.f_rope_freq_base is not None: |
| 1182 | self.gguf.add_rope_freq_base(params.f_rope_freq_base) |
| 1183 | |
| 1184 | if params.n_orig_ctx is not None: |
| 1185 | self.gguf.add_rope_scaling_orig_ctx_len(params.n_orig_ctx) |
| 1186 | |
| 1187 | if params.rope_finetuned is not None: |
| 1188 | self.gguf.add_rope_scaling_finetuned(params.rope_finetuned) |
| 1189 | |
| 1190 | if params.ftype is not None: |
| 1191 | self.gguf.add_file_type(params.ftype) |
| 1192 | |
| 1193 | def extract_vocabulary_from_model(self, vocab: Vocab) -> tuple[list[bytes], list[float], list[gguf.TokenType]]: |
| 1194 | tokens = [] |
| 1195 | scores = [] |
| 1196 | toktypes = [] |
| 1197 | |
| 1198 | # NOTE: `all_tokens` returns the base vocabulary and added tokens |
| 1199 | for text, score, toktype in vocab.all_tokens(): |
| 1200 | tokens.append(text) |
| 1201 | scores.append(score) |
| 1202 | toktypes.append(toktype) |
| 1203 |
no outgoing calls
no test coverage detected