Skip to content

Commit bfdc596

Browse files
committed
gguf reader in file format detection
1 parent af170fc commit bfdc596

File tree

3 files changed

+121
-2
lines changed

3 files changed

+121
-2
lines changed

ggml.c

+97
Original file line numberDiff line numberDiff line change
@@ -19530,6 +19530,103 @@ struct gguf_context * gguf_init_empty(void) {
1953019530
return ctx;
1953119531
}
1953219532

19533+
19534+
struct gguf_context * gguf_read_headers(const char * fname)
19535+
{
19536+
FILE * file = fopen(fname, "rb");
19537+
if (!file) {
19538+
return NULL;
19539+
}
19540+
19541+
// offset from start of file
19542+
size_t offset = 0;
19543+
uint32_t magic = 0;
19544+
gguf_fread_el(file, &magic, sizeof(magic), &offset); bool ok = true;
19545+
struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
19546+
// read the header
19547+
{
19548+
ctx->header.magic = magic;
19549+
ctx->kv = NULL;
19550+
ctx->infos = NULL;
19551+
ctx->data = NULL;
19552+
ok = ok && gguf_fread_el(file, &ctx->header.version, sizeof(ctx->header.version), &offset);
19553+
ok = ok && gguf_fread_el(file, &ctx->header.n_tensors, sizeof(ctx->header.n_tensors), &offset);
19554+
ok = ok && gguf_fread_el(file, &ctx->header.n_kv, sizeof(ctx->header.n_kv), &offset);
19555+
19556+
if (!ok) {
19557+
fprintf(stderr, "%s: failed to read header\n", __func__);
19558+
fclose(file);
19559+
gguf_free(ctx);
19560+
return NULL;
19561+
}
19562+
}
19563+
19564+
// read the kv pairs
19565+
{
19566+
ctx->kv = GGML_ALIGNED_MALLOC(ctx->header.n_kv * sizeof(struct gguf_kv));
19567+
for (uint32_t i = 0; i < ctx->header.n_kv; ++i) {
19568+
struct gguf_kv * kv = &ctx->kv[i];
19569+
ok = ok && gguf_fread_str(file, &kv->key, &offset);
19570+
ok = ok && gguf_fread_el (file, &kv->type, sizeof(kv->type), &offset);
19571+
switch (kv->type) {
19572+
case GGUF_TYPE_UINT8: ok = ok && gguf_fread_el (file, &kv->value.uint8, sizeof(kv->value.uint8), &offset); break;
19573+
case GGUF_TYPE_INT8: ok = ok && gguf_fread_el (file, &kv->value.int8, sizeof(kv->value.int8), &offset); break;
19574+
case GGUF_TYPE_UINT16: ok = ok && gguf_fread_el (file, &kv->value.uint16, sizeof(kv->value.uint16), &offset); break;
19575+
case GGUF_TYPE_INT16: ok = ok && gguf_fread_el (file, &kv->value.int16, sizeof(kv->value.int16), &offset); break;
19576+
case GGUF_TYPE_UINT32: ok = ok && gguf_fread_el (file, &kv->value.uint32, sizeof(kv->value.uint32), &offset); break;
19577+
case GGUF_TYPE_INT32: ok = ok && gguf_fread_el (file, &kv->value.int32, sizeof(kv->value.int32), &offset); break;
19578+
case GGUF_TYPE_FLOAT32: ok = ok && gguf_fread_el (file, &kv->value.float32, sizeof(kv->value.float32), &offset); break;
19579+
case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
19580+
case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19581+
case GGUF_TYPE_ARRAY:
19582+
{
19583+
ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
19584+
ok = ok && gguf_fread_el(file, &kv->value.arr.n, sizeof(kv->value.arr.n), &offset);
19585+
19586+
switch (kv->value.arr.type) {
19587+
case GGUF_TYPE_UINT8:
19588+
case GGUF_TYPE_INT8:
19589+
case GGUF_TYPE_UINT16:
19590+
case GGUF_TYPE_INT16:
19591+
case GGUF_TYPE_UINT32:
19592+
case GGUF_TYPE_INT32:
19593+
case GGUF_TYPE_FLOAT32:
19594+
case GGUF_TYPE_BOOL:
19595+
{
19596+
kv->value.arr.data = malloc(kv->value.arr.n * GGUF_TYPE_SIZE[kv->value.arr.type]);
19597+
ok = ok && gguf_fread_el(file, kv->value.arr.data, kv->value.arr.n * GGUF_TYPE_SIZE[kv->value.arr.type], &offset);
19598+
} break;
19599+
case GGUF_TYPE_STRING:
19600+
{
19601+
kv->value.arr.data = malloc(kv->value.arr.n * sizeof(struct gguf_str));
19602+
for (uint32_t j = 0; j < kv->value.arr.n; ++j) {
19603+
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
19604+
}
19605+
} break;
19606+
case GGUF_TYPE_ARRAY:
19607+
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
19608+
};
19609+
} break;
19610+
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type");
19611+
};
19612+
19613+
if (!ok) {
19614+
break;
19615+
}
19616+
}
19617+
19618+
if (!ok) {
19619+
fprintf(stderr, "%s: failed to read key-value pairs\n", __func__);
19620+
fclose(file);
19621+
gguf_free(ctx);
19622+
return NULL;
19623+
}
19624+
}
19625+
19626+
fclose(file);
19627+
return ctx;
19628+
}
19629+
1953319630
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
1953419631
FILE * file = fopen(fname, "rb");
1953519632
if (!file) {

ggml.h

+2
Original file line numberDiff line numberDiff line change
@@ -1842,6 +1842,8 @@ extern "C" {
18421842
GGML_API struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params);
18431843
//GGML_API struct gguf_context * gguf_init_from_buffer(..);
18441844

1845+
GGML_API struct gguf_context * gguf_read_headers(const char * fnam);
1846+
18451847
GGML_API void gguf_free(struct gguf_context * ctx);
18461848

18471849
GGML_API const char * gguf_type_name(enum gguf_type type);

model_adapter.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <vector>
1111

1212
#include "model_adapter.h"
13+
#include "ggml.h"
1314

1415
#include <chrono>
1516

@@ -253,9 +254,28 @@ void print_tok_vec(std::vector<float> &embd)
253254
}
254255
else if(magic == 0x46554747)
255256
{
256-
fileformat = FileFormat::GGUF_LLAMA;
257+
fin.close();
258+
fileformat = FileFormat::GGUF_LLAMA;
259+
auto ctx = gguf_read_headers(fname.c_str());
260+
auto keyidx = gguf_find_key(ctx, "general.architecture");
261+
std::string modelarch = "";
262+
if (keyidx != -1) { modelarch = gguf_get_val_str(ctx, keyidx); }
263+
gguf_free(ctx);
264+
if(modelarch=="llama")
265+
{
266+
fileformat = FileFormat::GGUF_LLAMA;
267+
}
268+
else
269+
{
270+
printf("\nERROR: Detected unimplemented GGUF Arch: %s\n",modelarch.c_str());
271+
}
257272
}
258-
fin.close();
273+
274+
if(fin.is_open())
275+
{
276+
fin.close();
277+
}
278+
259279

260280
return fileformat;
261281
}

0 commit comments

Comments
 (0)