| | """ |
| | 处理参数,如参数翻转、参数替换等等 |
| | """ |
| | import os |
| | import torch |
| | import random |
| | import struct |
| | import pandas as pd |
| | from bitstring import BitArray |
| | from concurrent.futures import ThreadPoolExecutor |
| | import numpy as np |
| | import math |
| |
|
| |
|
| | def split_file(file_path, chunk_size=8): |
| | """ |
| | 分割源文件成为元素BitArray的list |
| | :param file_path: 源文件路径 |
| | :param chunk_size: 分割粒度 Bit |
| | :return: 返回一个元素BitArray的list |
| | """ |
| | |
| | bit_data = BitArray(filename = file_path) |
| | chunks = [bit_data[i:i+chunk_size] for i in range(0, len(bit_data), chunk_size)] |
| | return chunks |
| |
|
| |
|
| | def merge_file(output_file, chunks): |
| | """ |
| | 将BitArray的list合并成一个文件 |
| | :param output_file: 目标文件路径 |
| | :param chunks: BitArray的list |
| | :return: 合并后的文件 |
| | """ |
| | merge_data = BitArray() |
| | for chunk in chunks: |
| | merge_data.append(chunk) |
| |
|
| | with open(output_file, 'wb') as file: |
| | merge_data.tofile(file) |
| |
|
| |
|
| |
|
| | def layer_low_n_bit_fLip(initParaPath, flipParaPath, bit_n, *layers): |
| | """ |
| | 翻转pth的layers层fa的低n bit |
| | :param initParaPath: 原始参数pth |
| | :param flipParaPath: 翻转之后的参数pth |
| | :param bit_n: 翻转低多少bit |
| | :return: void |
| | """ |
| | para = torch.load(initParaPath) |
| |
|
| | for layer in layers: |
| | if len(para[layer].data.shape) < 1: |
| | continue |
| | |
| | layerTensor = para[layer].data |
| | |
| | layerTensor_initView = layerTensor.view(torch.int32) |
| | |
| | layerTensor_embedded_int = layerTensor_initView ^ bit_n |
| | layerTensor_embedded = layerTensor_embedded_int.view(torch.float32) |
| | |
| |
|
| | para[layer].data = layerTensor_embedded |
| |
|
| | torch.save(para, flipParaPath) |
| | return |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | if __name__ == "__main__": |
| | |
| | print("Test Done") |
| |
|