| 84 | // ====== Dataset ====== |
| 85 | |
| 86 | ggml_opt_dataset_t ggml_opt_dataset_init( |
| 87 | enum ggml_type type_data, |
| 88 | enum ggml_type type_label, |
| 89 | int64_t ne_datapoint, |
| 90 | int64_t ne_label, |
| 91 | int64_t ndata, |
| 92 | int64_t ndata_shard) { |
| 93 | GGML_ASSERT(ne_datapoint > 0); |
| 94 | GGML_ASSERT(ne_label >= 0); |
| 95 | GGML_ASSERT(ndata > 0); |
| 96 | GGML_ASSERT(ndata_shard > 0); |
| 97 | |
| 98 | ggml_opt_dataset_t result = new ggml_opt_dataset; |
| 99 | result->ndata = ndata; |
| 100 | result->ndata_shard = ndata_shard; |
| 101 | |
| 102 | { |
| 103 | struct ggml_init_params params = { |
| 104 | /*.mem_size =*/ 2*ggml_tensor_overhead(), |
| 105 | /*.mem_buffer =*/ nullptr, |
| 106 | /*.no_alloc =*/ true, |
| 107 | }; |
| 108 | result->ctx = ggml_init(params); |
| 109 | } |
| 110 | |
| 111 | result->data = ggml_new_tensor_2d(result->ctx, type_data, ne_datapoint, ndata); |
| 112 | result->nbs_data = ggml_nbytes(result->data) * ndata_shard/ndata; |
| 113 | |
| 114 | if (ne_label > 0) { |
| 115 | result->labels = ggml_new_tensor_2d(result->ctx, type_label, ne_label, ndata); |
| 116 | result->nbs_labels = ggml_nbytes(result->labels) * ndata_shard/ndata; |
| 117 | } else { |
| 118 | result->labels = nullptr; |
| 119 | result->nbs_labels = 0; |
| 120 | } |
| 121 | |
| 122 | result->buf = ggml_backend_alloc_ctx_tensors_from_buft(result->ctx, ggml_backend_cpu_buffer_type()); |
| 123 | |
| 124 | const int64_t nshards = ndata/ndata_shard; |
| 125 | result->permutation.resize(nshards); |
| 126 | for (int64_t i = 0; i < nshards; ++i) { |
| 127 | result->permutation[i] = i; |
| 128 | } |
| 129 | return result; |
| 130 | } |
| 131 | |
| 132 | void ggml_opt_dataset_free(ggml_opt_dataset_t dataset) { |
| 133 | ggml_backend_buffer_free(dataset->buf); |