Skip to content

Commit 992a16b

Browse files
committed
gguf: file based writer (avoid writing everything to memory first!)
1 parent bdade69 commit 992a16b

File tree

1 file changed

+44
-4
lines changed

1 file changed

+44
-4
lines changed

ggml/src/gguf.cpp

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,6 +1349,46 @@ static void gguf_write_out(const struct gguf_context * ctx, Writer & gw, bool on
13491349
}
13501350
}
13511351

1352+
// file based writer
1353+
struct gguf_writer_file final : public gguf_writer_base {
1354+
FILE * file;
1355+
bool ok {true};
1356+
1357+
gguf_writer_file(FILE* file) : file(file) {}
1358+
1359+
using gguf_writer_base::write;
1360+
1361+
void write(const int8_t val) override {
1362+
const auto ret = fputc(val, file);
1363+
written_bytes++;
1364+
ok = ok && ret == val;
1365+
}
1366+
1367+
void write(const std::vector<int8_t> & val) override {
1368+
const auto ret = fwrite(val.data(), 1, val.size(), file);
1369+
written_bytes += val.size();
1370+
ok = ok && ret == val.size();
1371+
}
1372+
1373+
void write_tensor_data(const struct gguf_tensor_info & info, const size_t offset_data, const size_t alignment) override {
1374+
GGML_ASSERT(written_bytes - offset_data == info.offset);
1375+
1376+
GGML_ASSERT(ggml_is_contiguous(&info.t));
1377+
const size_t nbytes = ggml_nbytes(&info.t);
1378+
1379+
std::vector<int8_t> buf(nbytes);
1380+
if (info.t.buffer) {
1381+
ggml_backend_tensor_get(&info.t, buf.data(), 0, nbytes);
1382+
} else {
1383+
GGML_ASSERT(info.t.data);
1384+
memcpy(buf.data(), info.t.data, nbytes);
1385+
}
1386+
write(buf);
1387+
1388+
pad(alignment);
1389+
}
1390+
};
1391+
13521392
void gguf_write_to_buf(const struct gguf_context * ctx, std::vector<int8_t> & buf, bool only_meta) {
13531393
gguf_writer_buf gw(buf);
13541394
gguf_write_out(ctx, gw, only_meta);
@@ -1362,11 +1402,11 @@ bool gguf_write_to_file(const struct gguf_context * ctx, const char * fname, boo
13621402
return false;
13631403
}
13641404

1365-
std::vector<int8_t> buf;
1366-
gguf_write_to_buf(ctx, buf, only_meta);
1367-
const bool ok = fwrite(buf.data(), 1, buf.size(), file) == buf.size();
1405+
gguf_writer_file gw(file);
1406+
gguf_write_out(ctx, gw, only_meta);
1407+
13681408
fclose(file);
1369-
return ok;
1409+
return gw.ok;
13701410
}
13711411

13721412
size_t gguf_get_meta_size(const struct gguf_context * ctx) {

0 commit comments

Comments
 (0)