Skip to content

Commit 927bb36

Browse files
committed
feat: add basic support to GGUF_TYPE_OBJ on cpp
1 parent 6b27382 commit 927bb36

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

examples/llava/clip.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ static std::string gguf_kv_to_str(const struct gguf_context * ctx_gguf, int i) {
185185
switch (type) {
186186
case GGUF_TYPE_STRING:
187187
return gguf_get_val_str(ctx_gguf, i);
188+
case GGUF_TYPE_OBJ:
188189
case GGUF_TYPE_ARRAY:
189190
{
190191
const enum gguf_type arr_type = gguf_get_arr_type(ctx_gguf, i);
@@ -753,7 +754,7 @@ struct clip_ctx * clip_model_load(const char * fname, const int verbosity = 1) {
753754
const char * name = gguf_get_key(ctx, i);
754755
const enum gguf_type type = gguf_get_kv_type(ctx, i);
755756
const std::string type_name =
756-
type == GGUF_TYPE_ARRAY
757+
type == GGUF_TYPE_ARRAY || type == GGUF_TYPE_OBJ
757758
? format("%s[%s,%d]", gguf_type_name(type), gguf_type_name(gguf_get_arr_type(ctx, i)), gguf_get_arr_n(ctx, i))
758759
: gguf_type_name(type);
759760

ggml.c

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19071,8 +19071,9 @@ static const size_t GGUF_TYPE_SIZE[GGUF_TYPE_COUNT] = {
1907119071
[GGUF_TYPE_INT64] = sizeof(int64_t),
1907219072
[GGUF_TYPE_FLOAT64] = sizeof(double),
1907319073
[GGUF_TYPE_ARRAY] = 0, // undefined
19074+
[GGUF_TYPE_OBJ] = 0, // undefined
1907419075
};
19075-
static_assert(GGUF_TYPE_COUNT == 13, "GGUF_TYPE_COUNT != 13");
19076+
static_assert(GGUF_TYPE_COUNT == 14, "GGUF_TYPE_COUNT != 14");
1907619077

1907719078
static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
1907819079
[GGUF_TYPE_UINT8] = "u8",
@@ -19088,8 +19089,9 @@ static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
1908819089
[GGUF_TYPE_UINT64] = "u64",
1908919090
[GGUF_TYPE_INT64] = "i64",
1909019091
[GGUF_TYPE_FLOAT64] = "f64",
19092+
[GGUF_TYPE_OBJ] = "obj",
1909119093
};
19092-
static_assert(GGUF_TYPE_COUNT == 13, "GGUF_TYPE_COUNT != 13");
19094+
static_assert(GGUF_TYPE_COUNT == 14, "GGUF_TYPE_COUNT != 14");
1909319095

1909419096
union gguf_value {
1909519097
uint8_t uint8;
@@ -19278,6 +19280,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
1927819280
case GGUF_TYPE_FLOAT64: ok = ok && gguf_fread_el (file, &kv->value.float64, sizeof(kv->value.float64), &offset); break;
1927919281
case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
1928019282
case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19283+
case GGUF_TYPE_OBJ:
1928119284
case GGUF_TYPE_ARRAY:
1928219285
{
1928319286
ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
@@ -19306,6 +19309,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
1930619309
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
1930719310
}
1930819311
} break;
19312+
case GGUF_TYPE_OBJ:
1930919313
case GGUF_TYPE_ARRAY:
1931019314
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
1931119315
}
@@ -19507,7 +19511,7 @@ void gguf_free(struct gguf_context * ctx) {
1950719511
}
1950819512
}
1950919513

19510-
if (kv->type == GGUF_TYPE_ARRAY) {
19514+
if (kv->type == GGUF_TYPE_ARRAY || kv->type == GGUF_TYPE_OBJ) {
1951119515
if (kv->value.arr.data) {
1951219516
if (kv->value.arr.type == GGUF_TYPE_STRING) {
1951319517
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
@@ -19604,15 +19608,15 @@ const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id) {
1960419608

1960519609
const char * gguf_get_arr_str(const struct gguf_context * ctx, int key_id, int i) {
1960619610
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19607-
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19611+
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ);
1960819612
struct gguf_kv * kv = &ctx->kv[key_id];
1960919613
struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[i];
1961019614
return str->data;
1961119615
}
1961219616

1961319617
int gguf_get_arr_n(const struct gguf_context * ctx, int key_id) {
1961419618
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19615-
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19619+
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ);
1961619620
return ctx->kv[key_id].value.arr.n;
1961719621
}
1961819622

@@ -19691,6 +19695,7 @@ const char * gguf_get_val_str(const struct gguf_context * ctx, int key_id) {
1969119695
const void * gguf_get_val_data(const struct gguf_context * ctx, int key_id) {
1969219696
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
1969319697
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_ARRAY);
19698+
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_OBJ);
1969419699
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_STRING);
1969519700
return &ctx->kv[key_id].value;
1969619701
}
@@ -19853,6 +19858,20 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
1985319858
}
1985419859
}
1985519860

19861+
void gguf_set_obj_str(struct gguf_context * ctx, const char * key, const char ** data, int n) {
19862+
const int idx = gguf_get_or_add_key(ctx, key);
19863+
19864+
ctx->kv[idx].type = GGUF_TYPE_OBJ;
19865+
ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
19866+
ctx->kv[idx].value.arr.n = n;
19867+
ctx->kv[idx].value.arr.data = malloc(n*sizeof(struct gguf_str));
19868+
for (int i = 0; i < n; i++) {
19869+
struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
19870+
str->n = strlen(data[i]);
19871+
str->data = strdup(data[i]);
19872+
}
19873+
}
19874+
1985619875
// set or add KV pairs from another context
1985719876
void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
1985819877
for (uint32_t i = 0; i < src->header.n_kv; i++) {
@@ -19869,6 +19888,15 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
1986919888
case GGUF_TYPE_FLOAT64: gguf_set_val_f64 (ctx, src->kv[i].key.data, src->kv[i].value.float64); break;
1987019889
case GGUF_TYPE_BOOL: gguf_set_val_bool(ctx, src->kv[i].key.data, src->kv[i].value.bool_); break;
1987119890
case GGUF_TYPE_STRING: gguf_set_val_str (ctx, src->kv[i].key.data, src->kv[i].value.str.data); break;
19891+
case GGUF_TYPE_OBJ:
19892+
{
19893+
const char ** data = malloc(src->kv[i].value.arr.n*sizeof(char *));
19894+
for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
19895+
data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
19896+
}
19897+
gguf_set_obj_str(ctx, src->kv[i].key.data, data, src->kv[i].value.arr.n);
19898+
free((void *)data);
19899+
} break;
1987219900
case GGUF_TYPE_ARRAY:
1987319901
{
1987419902
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
@@ -20033,6 +20061,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
2003320061
case GGUF_TYPE_FLOAT64: gguf_bwrite_el (buf, &kv->value.float64, sizeof(kv->value.float64)); break;
2003420062
case GGUF_TYPE_BOOL: gguf_bwrite_el (buf, &kv->value.bool_, sizeof(kv->value.bool_) ); break;
2003520063
case GGUF_TYPE_STRING: gguf_bwrite_str(buf, &kv->value.str ); break;
20064+
case GGUF_TYPE_OBJ:
2003620065
case GGUF_TYPE_ARRAY:
2003720066
{
2003820067
gguf_bwrite_el(buf, &kv->value.arr.type, sizeof(kv->value.arr.type));
@@ -20059,6 +20088,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
2005920088
gguf_bwrite_str(buf, &((struct gguf_str *) kv->value.arr.data)[j]);
2006020089
}
2006120090
} break;
20091+
case GGUF_TYPE_OBJ:
2006220092
case GGUF_TYPE_ARRAY:
2006320093
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
2006420094
}

ggml.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,6 +2138,7 @@ extern "C" {
21382138
GGUF_TYPE_UINT64 = 10,
21392139
GGUF_TYPE_INT64 = 11,
21402140
GGUF_TYPE_FLOAT64 = 12,
2141+
GGUF_TYPE_OBJ = 13,
21412142
GGUF_TYPE_COUNT, // marks the end of the enum
21422143
};
21432144

@@ -2209,6 +2210,7 @@ extern "C" {
22092210
GGML_API void gguf_set_val_str (struct gguf_context * ctx, const char * key, const char * val);
22102211
GGML_API void gguf_set_arr_data(struct gguf_context * ctx, const char * key, enum gguf_type type, const void * data, int n);
22112212
GGML_API void gguf_set_arr_str (struct gguf_context * ctx, const char * key, const char ** data, int n);
2213+
GGML_API void gguf_set_obj_str (struct gguf_context * ctx, const char * key, const char ** data, int n);
22122214

22132215
// set or add KV pairs from another context
22142216
GGML_API void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src);

llama.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,7 @@ static std::string gguf_kv_to_str(const struct gguf_context * ctx_gguf, int i) {
738738
switch (type) {
739739
case GGUF_TYPE_STRING:
740740
return gguf_get_val_str(ctx_gguf, i);
741+
case GGUF_TYPE_OBJ:
741742
case GGUF_TYPE_ARRAY:
742743
{
743744
const enum gguf_type arr_type = gguf_get_arr_type(ctx_gguf, i);
@@ -2117,7 +2118,7 @@ namespace GGUFMeta {
21172118
static T get_kv(const gguf_context * ctx, const int k) {
21182119
const enum gguf_type kt = gguf_get_kv_type(ctx, k);
21192120

2120-
if (kt != GKV::gt) {
2121+
if (kt != GKV::gt && kt != GGUF_TYPE_OBJ && GKV::gt != GGUF_TYPE_ARRAY) {
21212122
throw std::runtime_error(format("key %s has wrong type %s but expected type %s",
21222123
gguf_get_key(ctx, k), gguf_type_name(kt), gguf_type_name(GKV::gt)));
21232124
}
@@ -2345,7 +2346,7 @@ struct llama_model_loader {
23452346
const char * name = gguf_get_key(ctx_gguf, i);
23462347
const enum gguf_type type = gguf_get_kv_type(ctx_gguf, i);
23472348
const std::string type_name =
2348-
type == GGUF_TYPE_ARRAY
2349+
type == GGUF_TYPE_ARRAY || type == GGUF_TYPE_OBJ
23492350
? format("%s[%s,%d]", gguf_type_name(type), gguf_type_name(gguf_get_arr_type(ctx_gguf, i)), gguf_get_arr_n(ctx_gguf, i))
23502351
: gguf_type_name(type);
23512352

0 commit comments

Comments
 (0)