Ошибка смены байта белый файл Safetensor в C.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка смены байта белый файл Safetensor в C.

Сообщение Anonymous »

Я пытаюсь прочитать файл Safetensors в C. В качестве документации «Чтение на Huggingface» я беру первый 8 байт файла для размера заголовка; < /p>

Код: Выделить всё

...
uint64_t header_size = 0;
int read_header_size = fread(&header_size, sizeof(uint64_t), 1, fp);
...
< /code>
А после этого я читаю заголовок данных; < /p>
...
char *header_str = MALLOC(header_size + 1);
int read_header_str = fread(header_str, 1, header_size, fp);
header_str[header_size] = '\0';
...
Я анализирую заголовок с помощью cjson safe_tensor-> header = cjson_parse (header_str); и нет никакой ошибки. Все отлично работает в файле заголовка.{
"conv2d/bias": {
"dtype": "F32",
"shape": [32],
"data_offsets": [0, 128]
},
"conv2d/kernel": {
"dtype": "F32",
...
...

< /code>
Затем я принимаю каждый элемент заголовка и чтение как байт как смещение; < /p>
uint64_t tensor_idx = 0;
uint64_t tensor_offset = 8 + header_size;
cJSON_ArrayForEach(tensor_item, safe_tensor->header) {
if(strcmp(tensor_item->string, "__metadata__") == 0) continue;

cJSON* dtype_json = cJSON_GetObjectItem(tensor_item, "dtype");
cJSON* shape_json = cJSON_GetObjectItem(tensor_item, "shape");

...
...

fseek(fp, tensor_offset, SEEK_SET);
int read_tensor_data = fread(safe_tensor->data[tensor_idx]->data, data_size, num_elements, fp);

tensor_offset += data_size * num_elements;
tensor_idx++;

< /code>
data_size IS 4 из -за F32, и я вычисляю num_elements из Shape (умножение всех элементов массива в shape_json). < /p>
Он работал с набором данных, который я обнаружил из моделей Huggingface и набора данных, который я сгенерировал. Но когда я пытаюсь экспортировать модель Керас в качестве защитников, она не работает; < /p>
def get_layer_parameter_names(layer):
"""Returns parameters based on layer name."""
layer_type = layer.__class__.__name__
param_names = []

# Dense & Conv
if layer_type in ["Dense", "Conv1D", "Conv2D", "Conv3D"]:
param_names = ["kernel", "bias"]

# Normalization
elif layer_type == "BatchNormalization":
param_names = ["gamma", "beta", "moving_mean", "moving_variance"]
elif layer_type == "LayerNormalization":
param_names = ["gamma", "beta"]
...
...
else:
weights = layer.get_weights()
param_names = [f"weight_{i}" for i in range(len(weights))] if weights else []

return param_names

def save_keras_model_to_safetensors(model, output_path):
tensors = {}
all_layer_names = []

for layer in model.layers:
all_layer_names.append(layer.name)
layer_weights = layer.get_weights()
param_names = get_layer_parameter_names(layer)

for name, weight in zip(param_names, layer_weights):
key = f"{layer.name}/{name}"
tensors[key] = np.array(weight, dtype=np.float32)

save_file(tensors, output_path, metadata=None)
< /code>
Библиотека Safetensors может очень хорошо обрабатывать экспорт и импорт с этим кодом, и она фактически экспортирует все параметры класса. Но когда я пытаюсь импортировать файл Safetensors, который я экспортировал с этой функцией, я получил проблему. Затем он читает первый тензорный файл точно правильно. Но когда дело доходит до второго тензора, каждая переменная смещается вправо на 1 ноль. Аналогичным образом, в 3 -м тензоре 2 нуля смещаются вправо (1 ноль справа по сравнению с предыдущим). Например; < /p>
Tensor[0][0] = 0.16358605 // expected: 0.16358605
Tensor[0][1] = -0.087356716 // expected: -0.087356716
Tensor[1][0] = -0.40413815 // expected: -4.04138158
Tensor[1][1] = 0.13498262 // expected: 1.34982622
Tensor[2][0] = -0.00154723 // expected: -1.54723778
Tensor[2][1] = 0.00372836 // expected: 3.72836853
< /code>
Каким могла быть моей ошибкой? У вас есть и идея?


Подробнее здесь: https://stackoverflow.com/questions/796 ... -file-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»