Skip to content

Commit a06767b

Browse files
committed
feat: add basic support to GGUF_TYPE_OBJ on cpp
1 parent e4d74cc commit a06767b

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
@@ -19082,8 +19082,9 @@ static const size_t GGUF_TYPE_SIZE[GGUF_TYPE_COUNT] = {
1908219082
[GGUF_TYPE_INT64] = sizeof(int64_t),
1908319083
[GGUF_TYPE_FLOAT64] = sizeof(double),
1908419084
[GGUF_TYPE_ARRAY] = 0, // undefined
19085+
[GGUF_TYPE_OBJ] = 0, // undefined
1908519086
};
19086-
static_assert(GGUF_TYPE_COUNT == 13, "GGUF_TYPE_COUNT != 13");
19087+
static_assert(GGUF_TYPE_COUNT == 14, "GGUF_TYPE_COUNT != 14");
1908719088

1908819089
static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
1908919090
[GGUF_TYPE_UINT8] = "u8",
@@ -19099,8 +19100,9 @@ static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
1909919100
[GGUF_TYPE_UINT64] = "u64",
1910019101
[GGUF_TYPE_INT64] = "i64",
1910119102
[GGUF_TYPE_FLOAT64] = "f64",
19103+
[GGUF_TYPE_OBJ] = "obj",
1910219104
};
19103-
static_assert(GGUF_TYPE_COUNT == 13, "GGUF_TYPE_COUNT != 13");
19105+
static_assert(GGUF_TYPE_COUNT == 14, "GGUF_TYPE_COUNT != 14");
1910419106

1910519107
union gguf_value {
1910619108
uint8_t uint8;
@@ -19289,6 +19291,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
1928919291
case GGUF_TYPE_FLOAT64: ok = ok && gguf_fread_el (file, &kv->value.float64, sizeof(kv->value.float64), &offset); break;
1929019292
case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
1929119293
case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19294+
case GGUF_TYPE_OBJ:
1929219295
case GGUF_TYPE_ARRAY:
1929319296
{
1929419297
ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
@@ -19317,6 +19320,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
1931719320
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
1931819321
}
1931919322
} break;
19323+
case GGUF_TYPE_OBJ:
1932019324
case GGUF_TYPE_ARRAY:
1932119325
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
1932219326
}
@@ -19518,7 +19522,7 @@ void gguf_free(struct gguf_context * ctx) {
1951819522
}
1951919523
}
1952019524

19521-
if (kv->type == GGUF_TYPE_ARRAY) {
19525+
if (kv->type == GGUF_TYPE_ARRAY || kv->type == GGUF_TYPE_OBJ) {
1952219526
if (kv->value.arr.data) {
1952319527
if (kv->value.arr.type == GGUF_TYPE_STRING) {
1952419528
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
@@ -19615,15 +19619,15 @@ const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id) {
1961519619

1961619620
const char * gguf_get_arr_str(const struct gguf_context * ctx, int key_id, int i) {
1961719621
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19618-
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19622+
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ);
1961919623
struct gguf_kv * kv = &ctx->kv[key_id];
1962019624
struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[i];
1962119625
return str->data;
1962219626
}
1962319627

1962419628
int gguf_get_arr_n(const struct gguf_context * ctx, int key_id) {
1962519629
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19626-
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19630+
GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ);
1962719631
return ctx->kv[key_id].value.arr.n;
1962819632
}
1962919633

@@ -19702,6 +19706,7 @@ const char * gguf_get_val_str(const struct gguf_context * ctx, int key_id) {
1970219706
const void * gguf_get_val_data(const struct gguf_context * ctx, int key_id) {
1970319707
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
1970419708
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_ARRAY);
19709+
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_OBJ);
1970519710
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_STRING);
1970619711
return &ctx->kv[key_id].value;
1970719712
}
@@ -19864,6 +19869,20 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
1986419869
}
1986519870
}
1986619871

19872+
void gguf_set_obj_str(struct gguf_context * ctx, const char * key, const char ** data, int n) {
19873+
const int idx = gguf_get_or_add_key(ctx, key);
19874+
19875+
ctx->kv[idx].type = GGUF_TYPE_OBJ;
19876+
ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
19877+
ctx->kv[idx].value.arr.n = n;
19878+
ctx->kv[idx].value.arr.data = malloc(n*sizeof(struct gguf_str));
19879+
for (int i = 0; i < n; i++) {
19880+
struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
19881+
str->n = strlen(data[i]);
19882+
str->data = strdup(data[i]);
19883+
}
19884+
}
19885+
1986719886
// set or add KV pairs from another context
1986819887
void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
1986919888
for (uint32_t i = 0; i < src->header.n_kv; i++) {
@@ -19880,6 +19899,15 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
1988019899
case GGUF_TYPE_FLOAT64: gguf_set_val_f64 (ctx, src->kv[i].key.data, src->kv[i].value.float64); break;
1988119900
case GGUF_TYPE_BOOL: gguf_set_val_bool(ctx, src->kv[i].key.data, src->kv[i].value.bool_); break;
1988219901
case GGUF_TYPE_STRING: gguf_set_val_str (ctx, src->kv[i].key.data, src->kv[i].value.str.data); break;
19902+
case GGUF_TYPE_OBJ:
19903+
{
19904+
const char ** data = malloc(src->kv[i].value.arr.n*sizeof(char *));
19905+
for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
19906+
data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
19907+
}
19908+
gguf_set_obj_str(ctx, src->kv[i].key.data, data, src->kv[i].value.arr.n);
19909+
free((void *)data);
19910+
} break;
1988319911
case GGUF_TYPE_ARRAY:
1988419912
{
1988519913
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
@@ -20044,6 +20072,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
2004420072
case GGUF_TYPE_FLOAT64: gguf_bwrite_el (buf, &kv->value.float64, sizeof(kv->value.float64)); break;
2004520073
case GGUF_TYPE_BOOL: gguf_bwrite_el (buf, &kv->value.bool_, sizeof(kv->value.bool_) ); break;
2004620074
case GGUF_TYPE_STRING: gguf_bwrite_str(buf, &kv->value.str ); break;
20075+
case GGUF_TYPE_OBJ:
2004720076
case GGUF_TYPE_ARRAY:
2004820077
{
2004920078
gguf_bwrite_el(buf, &kv->value.arr.type, sizeof(kv->value.arr.type));
@@ -20070,6 +20099,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
2007020099
gguf_bwrite_str(buf, &((struct gguf_str *) kv->value.arr.data)[j]);
2007120100
}
2007220101
} break;
20102+
case GGUF_TYPE_OBJ:
2007320103
case GGUF_TYPE_ARRAY:
2007420104
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
2007520105
}

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)