実現したいこと
llama.cppでモデルを読み込み、推論を実行している最中のtensorの具体的な中身の構造を知りたいです。
ソースコードに疎いこともあり、そもそも実現できるのかすらもわかりません。
前提
forループの間にtensorの状態で、演算が分岐していることは把握できました。
ただし、tensorの構造が自分から見るとブラックボックスで、具体的にはどのようになっているかがわかりません。理想は、具体的な例を目に見える形で見たいです。
構造自体は把握していて、実際の推論中にどのような型や演算方法(以下のソースコードのop部分)がtensorに格納されているのかを知りたいです。
何か知見を持っている方がいればご教授お願いします。
よろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
-------tensorの型定義-----------------------------------------------------------------
struct ggml_tensor {
enum ggml_type type;
GGML_DEPRECATED(enum ggml_backend_type backend, "use the buffer type to find the storage location of the tensor"); struct ggml_backend_buffer * buffer; int64_t ne[GGML_MAX_DIMS]; // number of elements size_t nb[GGML_MAX_DIMS]; // stride in bytes: // nb[0] = ggml_type_size(type) // nb[1] = nb[0] * (ne[0] / ggml_blck_size(type)) + padding // nb[i] = nb[i-1] * ne[i-1] // compute data enum ggml_op op; // op params - allocated as int32_t for alignment int32_t op_params[GGML_MAX_OP_PARAMS / sizeof(int32_t)]; int32_t flags; struct ggml_tensor * grad; struct ggml_tensor * src[GGML_MAX_SRC]; // source tensor and offset for views struct ggml_tensor * view_src; size_t view_offs; void * data; char name[GGML_MAX_NAME]; void * extra; // extra things e.g. for ggml-cuda.cu // char padding[4]; };
----------ここまで-----------------------------------------------------
-------実際の演算を行うforループ(ggml_graph_compute_thread関数)--------------
for (int node_n = 0; node_n < cgraph->n_nodes && !tp->abort; node_n++) {
struct ggml_tensor * node = cgraph->nodes[node_n];
ggml_compute_forward(¶ms, node); if (state->ith == 0 && cplan->abort_callback && cplan->abort_callback(cplan->abort_callback_data)) { tp->abort = true; tp->ec = GGML_STATUS_ABORTED; } ggml_barrier(state->threadpool); }
--------ここまで---------------------------------
--------tensorの分岐----------------------------
static void ggml_compute_forward(struct ggml_compute_params * params, struct ggml_tensor * tensor) {
GGML_ASSERT(params);
if (tensor->op == GGML_OP_NONE || ggml_is_empty(tensor)) { return; } switch (tensor->op) { case GGML_OP_DUP: { ggml_compute_forward_dup(params, tensor); } break; case GGML_OP_ADD: { ggml_compute_forward_add(params, tensor); } break; case GGML_OP_ADD1: { ggml_compute_forward_add1(params, tensor); } break; case GGML_OP_ACC: { ggml_compute_forward_acc(params, tensor); } break; case GGML_OP_SUB: { ggml_compute_forward_sub(params, tensor); } break; case GGML_OP_MUL: { ggml_compute_forward_mul(params, tensor); } break;
.......(長いため省略)
----------ここまで-----------------------------
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
llama.cppのgitページにはggml/src/ggml.c上に、上記の関数が見当たらない可能性があります。
自分はcloneしてすべて見えているので、必要であれば随時ソースコードを添付させていただきます。
あなたの回答
tips
プレビュー