[ad_1]
Bây giờ chúng ta hãy đi vào nội dung thực sự của bài viết này. Phân tích ma trận (Q, Okay, V, O) của mô hình Llama-3–8B-Instruct thông qua các giá trị số ít của chúng!
Mật mã
Trước tiên hãy nhập tất cả các gói cần thiết trong phân tích này.
import transformers
import torch
import numpy as np
from transformers import AutoConfig, LlamaModel
from safetensors import safe_open
import os
import matplotlib.pyplot as plt
Sau đó, hãy tải xuống mô hình và lưu nó vào máy cục bộ của chúng tôi /tmp
danh mục.
MODEL_ID = "meta-llama/Meta-Llama-3-8B-Instruct"
!huggingface-cli obtain {MODEL_ID} --quiet --local-dir /tmp/{MODEL_ID}
Nếu bạn có nhiều GPU, đoạn mã sau có thể không phù hợp với bạn. Tuy nhiên, nếu bạn kém GPU như tôi, đoạn mã sau sẽ thực sự hữu ích để chỉ tải các lớp cụ thể của mô hình LLama-3–8B.
def load_specific_layers_safetensors(mannequin, model_name, layer_to_load):
state_dict = {}
information = (f for f in os.listdir(model_name) if f.endswith('.safetensors'))
for file in information:
filepath = os.path.be part of(model_name, file)
with safe_open(filepath, framework="pt") as f:
for key in f.keys():
if f"layers.{layer_to_load}." in key:
new_key = key.exchange(f"mannequin.layers.{layer_to_load}.", 'layers.0.')
state_dict(new_key) = f.get_tensor(key)missing_keys, unexpected_keys = mannequin.load_state_dict(state_dict, strict=False)
if missing_keys:
print(f"Lacking keys: {missing_keys}")
if unexpected_keys:
print(f"Surprising keys: {unexpected_keys}")
Lý do chúng tôi làm điều này là vì cấp độ GPU Google Colab miễn phí không đủ để tải LLama-3–8B ngay cả với fp16
độ chính xác. Hơn nữa, phân tích này đòi hỏi chúng ta phải làm việc trên fp32
độ chính xác do cách np.linalg.svd
được xây dựng. Tiếp theo, chúng ta có thể định nghĩa hàm most important để nhận các giá trị số ít cho một số đã cho matrix_type
, layer_number
Và head_number
.
def get_singular_values(model_path, matrix_type, layer_number, head_number):
"""
Computes the singular values of the desired matrix within the Llama-3 mannequin.Parameters:
model_path (str): Path to the mannequin
matrix_type (str): Kind of matrix ('q', 'ok', 'v', 'o')
layer_number (int): Layer quantity (0 to 31)
head_number (int): Head quantity (0 to 31)
Returns:
np.array: Array of singular values
"""
assert matrix_type in ('q', 'ok', 'v', 'o'), "Invalid matrix kind"
assert 0 <= layer_number < 32, "Invalid layer quantity"
assert 0 <= head_number < 32, "Invalid head quantity"
# Load the mannequin just for that particular layer since we have now restricted RAM even after utilizing fp16
config = AutoConfig.from_pretrained(model_path)
config.num_hidden_layers = 1
mannequin = LlamaModel(config)
load_specific_layers_safetensors(mannequin, model_path, layer_number)
# Entry the desired layer
# At all times index 0 since we have now loaded for the precise layer
layer = mannequin.layers(0)
# Decide the scale of every head
num_heads = layer.self_attn.num_heads
head_dim = layer.self_attn.head_dim
# Entry the desired matrix
weight_matrix = getattr(layer.self_attn, f"{matrix_type}_proj").weight.detach().numpy()
if matrix_type in ('q','o'):
begin = head_number * head_dim
finish = (head_number + 1) * head_dim
else: # 'ok', 'v' matrices
# Alter the head_number based mostly on num_key_value_heads
# That is performed since llama3-8b use Grouped Question Consideration
num_key_value_groups = num_heads // config.num_key_value_heads
head_number_kv = head_number // num_key_value_groups
begin = head_number_kv * head_dim
finish = (head_number_kv + 1) * head_dim
# Extract the weights for the desired head
if matrix_type in ('q', 'ok', 'v'):
weight_matrix = weight_matrix(begin:finish, :)
else: # 'o' matrix
weight_matrix = weight_matrix(:, begin:finish)
# Compute singular values
singular_values = np.linalg.svd(weight_matrix, compute_uv=False)
del mannequin, config
return record(singular_values)
Điều đáng chú ý là chúng ta có thể trích xuất các trọng số cho phần đầu được chỉ định trên các ma trận Okay, Q và V bằng cách thực hiện cắt theo hàng vì cách nó được thực hiện bởi ôm mặt.
Đối với ma trận O, chúng ta có thể thực hiện cắt theo cột để trích xuất các trọng số cho phần đầu xác định trên trọng số O nhờ đại số tuyến tính! Chi tiết có thể được nhìn thấy trong hình dưới đây.
[ad_2]
Source link