【Pytorch】語言模型上的動態量化

目錄

■導言

①定義模型

②加載文本數據

③加載預訓練模型

④測試動態量化

■結論



■導言

量化涉及將模型的權重和激活從float轉換為int,這可以導致更小的模型大小和更快的推理,并且只對準確性造成很小的影響。

本文將把最簡單的量化形式-動態量化-應用于基于lstm的下一個單詞預測模型,與PyTorch示例中的單詞語言模型非常相似。

# importsimport osfrom io import openimport timeimport torchimport torch.nn as nnimport torch.nn.functional as F

①定義模型

定義LSTM模型體系結構,遵循單詞語言模型示例中的模型。

# 定義一個包含編碼器、循環層和解碼器的LSTM模型
class LSTMModel(nn.Module):"""容器模塊,包含編碼器、遞歸模塊(LSTM)和解碼器。"""def __init__(self, ntoken, ninp, nhid, nlayers, dropout=0.5):"""初始化LSTM模型。參數:ntoken (int): 詞匯表大小,即輸入數據的類別數。ninp (int): 輸入層維度,即詞嵌入的維度。nhid (int): 隱藏層維度,即LSTM中每個單元的隱藏狀態維度。nlayers (int): LSTM的層數。dropout (float): Dropout率,用于防止過擬合,默認為0.5。"""super(LSTMModel, self).__init__()# Dropout層,用于在訓練過程中隨機丟棄一部分神經元,防止過擬合self.drop = nn.Dropout(dropout)# 編碼器層:將輸入的離散詞索引轉換為密集向量表示(詞嵌入)self.encoder = nn.Embedding(ntoken, ninp)# LSTM層:負責處理序列數據,提取時序特征self.rnn = nn.LSTM(ninp, nhid, nlayers, dropout=dropout)# 解碼器層:將LSTM輸出的隱藏狀態映射回詞匯表空間,預測下一個詞self.decoder = nn.Linear(nhid, ntoken)# 初始化模型參數self.init_weights()# 保存隱藏層維度和網絡層數供后續使用self.nhid = nhidself.nlayers = nlayersdef init_weights(self):"""初始化模型參數,采用均勻分布進行初始化"""initrange = 0.1# 對編碼器的權重進行初始化self.encoder.weight.data.uniform_(-initrange, initrange)# 解碼器偏置初始化為0self.decoder.bias.data.zero_()# 解碼器權重也使用相同的均勻分布初始化self.decoder.weight.data.uniform_(-initrange, initrange)def forward(self, input, hidden):"""前向傳播函數。參數:input (Tensor): 當前批次的輸入數據,形狀為(seq_len, batch_size)。hidden (tuple): 初始隱藏狀態(h0, c0)。返回:decoded (Tensor): 輸出結果,表示每個時間步的預測詞概率。hidden (tuple): 更新后的隱藏狀態。"""# 將輸入通過編碼器轉化為嵌入向量,并應用Dropoutemb = self.drop(self.encoder(input))# 將嵌入后的數據傳入LSTM進行處理,得到輸出和新的隱藏狀態output, hidden = self.rnn(emb, hidden)# 對LSTM的輸出應用Dropoutoutput = self.drop(output)# 通過解碼器將輸出映射到詞匯表空間,得到每個詞的概率分布decoded = self.decoder(output)return decoded, hiddendef init_hidden(self, bsz):"""初始化隱藏狀態(h0 和 c0),通常在每輪開始時調用。參數:bsz (int): batch size,當前批次的大小。返回:tuple: 包含初始隱藏狀態的兩個張量(h0, c0),形狀均為(nlayers, bsz, nhid)"""weight = next(self.parameters())  # 獲取第一個參數作為參考,創建相同類型的張量# 初始化為全零張量return (weight.new_zeros(self.nlayers, bsz, self.nhid),weight.new_zeros(self.nlayers, bsz, self.nhid))

這段代碼定義了一個基于 LSTM 的語言模型,主要包括以下幾個部分:

  1. 編碼器:將輸入的詞索引轉換為詞向量(Embedding)。
  2. LSTM 層:處理序列數據,提取時序信息。
  3. 解碼器:將 LSTM 的輸出映射回詞匯表空間,用于預測下一個詞。
  4. Dropout:防止訓練過程中的過擬合。
  5. 參數初始化:對 Embedding 和 Linear 層的參數進行均勻分布初始化。
  6. 隱藏狀態管理:提供初始化隱藏狀態的方法,便于模型在每次新序列開始時重置記憶。

②加載文本數據

接下來,加載 Wikitext-2?數據集進入Corpus, 再次跟隨單詞語言模型預處理示例。

# 定義一個詞典類,用于建立詞語與索引之間的映射
class Dictionary(object):def __init__(self):# word2idx: 詞語到索引的映射字典self.word2idx = {}# idx2word: 索引到詞語的列表(用于反查)self.idx2word = []def add_word(self, word):"""向詞典中添加一個詞。如果該詞尚未存在,則將其加入列表和字典;否則直接返回已有的索引。參數:word (str): 要添加的詞語返回:int: 該詞對應的索引"""if word not in self.word2idx:self.idx2word.append(word)self.word2idx[word] = len(self.idx2word) - 1return self.word2idx[word]def __len__(self):"""返回詞典中不同詞語的數量"""return len(self.idx2word)# 定義語料庫類,用于加載和處理文本數據集
class Corpus(object):def __init__(self, path):"""初始化語料庫對象,并加載訓練、驗證和測試數據。參數:path (str): 數據集存放路徑"""self.dictionary = Dictionary()# 加載并分詞訓練集、驗證集和測試集self.train = self.tokenize(os.path.join(path, 'train.txt'))self.valid = self.tokenize(os.path.join(path, 'valid.txt'))self.test = self.tokenize(os.path.join(path, 'test.txt'))def tokenize(self, path):"""對指定路徑的文本文件進行分詞處理。步驟:1. 遍歷文件內容,將所有詞語加入詞典;2. 再次遍歷文件,將每句話轉換為對應的索引張量;3. 將所有句子的索引拼接成一個大的張量返回。參數:path (str): 文件路徑返回:Tensor: 包含整個文件詞匯索引的一維張量"""assert os.path.exists(path)# 第一步:讀取文本并構建詞典with open(path, 'r', encoding="utf8") as f:for line in f:words = line.split() + ['<eos>']  # 每句話以 '<eos>' 結尾表示結束for word in words:self.dictionary.add_word(word)# 第二步:將文本轉換為索引張量with open(path, 'r', encoding="utf8") as f:idss = []  # 存儲每個句子的索引張量for line in f:words = line.split() + ['<eos>']ids = []for word in words:ids.append(self.dictionary.word2idx[word])idss.append(torch.tensor(ids).type(torch.int64))  # 轉換為PyTorch張量ids = torch.cat(idss)  # 將多個句子拼接為一個一維張量return ids# 設置數據集路徑
model_data_filepath = 'data/'# 創建語料庫對象,加載WikiText-2數據集
corpus = Corpus(model_data_filepath + 'wikitext-2')

這段代碼的主要功能是:

  • Dictionary?類:構建詞典,實現詞語與索引之間的雙向映射。
  • Corpus?類:加載并處理文本數據集,包括訓練集、驗證集和測試集。

使用?tokenize?方法將文本轉換為詞索引張量。

每句話末尾添加特殊標記?<eos>?表示句子結束。

  • 最終通過?corpus?實例加載 WikiText-2 數據集,可用于后續模型訓練或評估。

③加載預訓練模型

將一些預訓練的權重加載到這個模型架構中。下載所需的預訓練模型:

wget https://s3.amazonaws.com/pytorch-tutorial-assets/word_language_model_quantize.pth
?

將下載的文件放在數據目錄中或相應地更新 model_data_filepath。

ntokens = len(corpus.dictionary)model = LSTMModel(ntoken = ntokens,ninp = 512,nhid = 256,nlayers = 5,
)model.load_state_dict(torch.load(model_data_filepath + 'word_language_model_quantize.pth',map_location=torch.device('cpu'),weights_only=True))model.eval()
print(model)

輸出:

LSTMModel((drop): Dropout(p=0.5, inplace=False)(encoder): Embedding(33278, 512)(rnn): LSTM(512, 256, num_layers=5, dropout=0.5)(decoder): Linear(in_features=256, out_features=33278, bias=True))

現在生成一些文本,以確保預訓練模型工作正確。

# 初始化一個隨機輸入,表示起始詞的索引(形狀為 (1, 1),即一個詞)
input_ = torch.randint(ntokens, (1, 1), dtype=torch.long)# 初始化模型的隱藏狀態,batch_size = 1
hidden = model.init_hidden(1)# 設置溫度參數,用于控制生成結果的隨機性:
# 溫度越高,輸出越隨機;溫度越低,輸出越確定。
temperature = 1.0# 要生成的總詞數
num_words = 1000# 打開文件以寫入生成的文本
with open(model_data_filepath + 'out.txt', 'w') as outf:with torch.no_grad():  # 不需要計算梯度,加快推理速度for i in range(num_words):# 模型前向傳播,得到當前詞的輸出和新的隱藏狀態output, hidden = model(input_, hidden)# 對輸出進行處理,得到每個詞的概率分布word_weights = output.squeeze().div(temperature).exp().cpu()# 根據概率分布隨機選取下一個詞的索引word_idx = torch.multinomial(word_weights, 1)[0]# 將當前預測的詞作為下一次生成的輸入input_.fill_(word_idx)# 將索引轉換為實際詞語word = corpus.dictionary.idx2word[word_idx]# 寫入文件,每20個詞換行,否則空格分隔outf.write(str(word.encode('utf-8')) + ('\n' if i % 20 == 19 else ' '))# 每生成100詞打印進度if i % 100 == 0:print('| 已生成 {}/{} 個詞'.format(i, num_words))# 讀取并打印生成的全部文本
with open(model_data_filepath + 'out.txt', 'r') as outf:all_output = outf.read()print(all_output)

輸出:

| Generated 0/1000 words
| Generated 100/1000 words
| Generated 200/1000 words
| Generated 300/1000 words
| Generated 400/1000 words
| Generated 500/1000 words
| Generated 600/1000 words
| Generated 700/1000 words
| Generated 800/1000 words
| Generated 900/1000 words
b'.' b'David' b'<unk>' b'states' b'the' b'album' b'of' b'the' b'key' b'(' b'3' b'@.@' b'2' b'miles' b'per' b'hour' b'destructive' b'73' b'@.@' b'8'
b'm' b')' b'ten' b'years' b'with' b'edible' b'intellectual' b'instruments' b',' b'that' b'was' b'subdivided' b'into' b'an' b'star' b'Hampshires' b'.' b'1981' b',' b'Megan'
b'Room' b'campaigned' b'in' b'1956' b'in' b'Jacob' b'Lake' b'in' b'Floyd' b'of' b'Garden' b'which' b'was' b'introduced' b'by' b'Enuff' b'<unk>' b',' b'<unk>' b'of'
b'a' b'special' b'state' b'opens' b'with' b'a' b'Amusements' b'from' b'North' b'Korea' b'and' b'Temple' b'County' b'.' b'Everson' b',' b'with' b'a' b'Shanghai' b'ultimate'
b'potential' b'play' b',' b'also' b'on' b'October' b'7' b',' b'1848' b',' b'and' b'collaborated' b'up' b'an' b'main' b'(' b'three' b'species' b'hills' b')'
b'.' b'<eos>' b'A.' b'galericulata' b'is' b'a' b'popular' b'white' b'post' b'@-@' b'spored' b',' b'raising' b'in' b'the' b'fourth' b'century' b',' b'and' b'it'
b'was' b'many' b'450' b'claims' b'where' b'there' b'are' b'no' b'official' b'amounts' b'of' b'digital' b'species' b'that' b'are' b'found' b'to' b'be' b'mild' b'.'
b'<eos>' b'<eos>' b'=' b'=' b'Musical' b'records' b'=' b'=' b'<eos>' b'<eos>' b'Gods' b'Narvik' b'a' b'year' b'meets' b'to' b'be' b'found' b'for' b'Hawaii'
b',' b'and' b'the' b'common' b'starling' b'has' b'also' b'described' b'it' b'weak' b'community' b'kings' b'.' b'Continuing' b'regarding' b'<unk>' b',' b'they' b'were' b'partially'
b'deeply' b'distinguished' b'in' b'Ireland' b'.' b'The' b'range' b'of' b'Bullet' b'material' b'is' b'a' b'non' b'@-@' b'imposed' b'planet' b'each' b',' b'even' b'outright'
b'terminology' b',' b'usually' b'available' b',' b'by' b'Russia' b'.' b'The' b'spotless' b'transit' b'along' b'a' b'24' b'Bulletin' b'and' b'could' b'be' b'expected' b'.'
b'There' b'are' b'90' b'mg' b'phallic' b'method' b'<unk>' b'as' b',' b'between' b'2016' b'and' b'1913' b',' b'and' b'first' b'a' b'important' b'sensors' b'since'
b'it' b'has' b'reached' b'a' b'clade' b',' b'distinguished' b',' b'other' b'predators' b'and' b'air' b'long' b'.' b'There' b'are' b'no' b'time' b'of' b'Ceres'
b'in' b'within' b'two' b'years' b'.' b'Five' b'size' b',' b'with' b'35' b'@,@' b'Catholics' b',' b'is' b'proposed' b'to' b'do' b'so' b'unless' b'they'
b'were' b'extremes' b'to' b'ask' b'songs' b'.' b'Chapels' b',' b'until' b'January' b'1988' b',' b'when' b'Dawn' b"'s" b'gravity' b',' b'even' b'eaten' b'by'
b'another' b'shortage' b'.' b'It' b'is' b'possible' b'that' b'group' b'suspended' b',' b'because' b'of' b'the' b'Intermediate' b',' b'related' b'after' b'this' b',' b'they'
b'makes' b'as' b'two' b'as' b'they' b'affect' b'them' b',' b'merged' b'up' b'on' b'DAGs' b'.' b'In' b'Molecular' b'<unk>' b',' b'males' b'may' b'be'
b'occasionally' b'closed' b'in' b'England' b',' b'eye' b'children' b'and' b'unrelated' b'attempts' b'to' b'start' b'variable' b'and' b'coordination' b'.' b'<unk>' b',' b'which' b','
b'unlike' b'other' b'birds' b',' b'mainly' b'fresh' b',' b'<unk>' b'they' b'are' b'<unk>' b'and' b'they' b'are' b'spotted' b'in' b'trees' b'.' b'This' b'kakapo'
b'can' b'be' b'of' b'one' b'side' b'of' b'William' b'<unk>' b'to' b'produce' b'for' b'electron' b'behaviour' b'prove' b'.' b'In' b'the' b'19th' b'century' b','
b'the' b'Skye' b'mural' b'(' b'immigrants' b'has' b'the' b'highest' b'birds' b')' b',' b'to' b'look' b'round' b'or' b'<unk>' b'.' b'With' b'8' b'million'
b'tons' b'(' b'13' b'@.@' b'5' b'in' b')' b'or' b'knowledge' b',' b'their' b'mass' b'can' b'have' b'relocated' b'to' b'the' b'distances' b'of' b'peak'
b'birds' b'.' b'<eos>' b'Mycena' b'galericulata' b'reaches' b'a' b'very' b'apparent' b'amount' b'of' b'scholars' b',' b'as' b'of' b'late' b'November' b'230' b',' b'2006'
b',' b'will' b'buy' b'the' b'overlap' b',' b'especially' b'by' b'<unk>' b'Trypanosoma' b',' b'<unk>' b',' b'and' b'sur' b'Notably' b'\xe2\x80\x93' b'Africa' b'.' b'The'
b'birds' b"'" b'clutch' b'surface' b'weight' b'and' b'kakapo' b'asserts' b'that' b'they' b'are' b'serving' b'as' b'"' b'<unk>' b'"' b',' b'a' b'flock' b'that'
b'feed' b'increase' b'by' b'Call' b'daylight' b'on' b'22' b'August' b'1801' b'.' b'The' b'surviving' b'species' b'of' b'this' b'similar' b'classification' b'is' b'meant' b'to'
b'be' b'(' b'"' b'Always' b'Bird' b'"' b')' b'that' b'could' b'be' b'seen' b'as' b'the' b'country' b'for' b'their' b'sight' b'as' b'it' b'ruler'
b',' b'as' b'it' b'hit' b'that' b'it' b'is' b'probably' b'more' b'time' b'.' b'<eos>' b'Family' b'therapy' b',' b'about' b'3' b'@.@' b'5' b'million'
b'years' b',' b'suggests' b'of' b'1' b'@,@' b'000' b'to' b'eight' b'kilometres' b'(' b'19' b'@.@' b'4' b'\xe2\x80\x93' b'5' b'a.m.' b')' b'long' b','
b'than' b'which' b'may' b'one' b'reopened' b'of' b'the' b'works' b'.' b'It' b'may' b'exist' b'with' b'agriculture' b'such' b'as' b'local' b'areas' b'as' b'such'
b'as' b'a' b'type' b'that' b'may' b'occur' b'back' b'into' b'the' b'night' b',' b'but' b'further' b'does' b'not' b'include' b'military' b'forests' b'.' b'<eos>'
b'Mycena' b'Evans' b'Wi\xc5\x9bniowiecki' b'suggests' b'that' b'"' b'when' b'early' b'practice' b'carried' b'a' b'subspecies' b'strips' b',' b'adding' b'below' b'too' b'distant' b'or' b'to'
b'be' b'the' b'subject' b'of' b'it' b'during' b'Baby' b'terms' b'.' b'"' b'<eos>' b'The' b'Australian' b'starling' b'"' b'The' b'One' b'best' b'name' b'"'
b'have' b'already' b'sold' b'.' b'There' b'is' b'few' b'people' b'in' b'common' b'areas' b'that' b'may' b'be' b'obtained' b'it' b',' b'but' b'sort' b'of'
b'more' b'late' b'recorded' b',' b'hard' b'Ozawa' b',' b'nucleolar' b'bound' b',' b'and' b'Xemnas' b';' b'and' b'is' b'foraging' b'in' b'2000' b'.' b'<eos>'
b'Northern' b'Ireland' b'is' b'very' b'invisible' b'for' b'their' b'state' b',' b'and' b'in' b'<unk>' b',' b'they' b'once' b'have' b'been' b'became' b'inconclusive' b'.'
b'The' b'Maasai' b'which' b'develop' b'near' b'the' b'breeding' b'Trade' b'Island' b'below' b'of' b'theologian' b"'s" b'husband' b'to' b'increase' b',' b'their' b'mouth' b'Colfer'
b'they' b'are' b'.' b'<eos>' b'Scotland' b'blocks' b'by' b'the' b'species' b'and' b'domains' b'preventing' b'tends' b'to' b'work' b'about' b'into' b'the' b'population' b'.'
b'<unk>' b'of' b'volunteers' b'are' b'referring' b'to' b'other' b'ribosomal' b'motifs' b'where' b'other' b'birds' b'have' b'fallen' b'.' b'For' b'this' b'statistics' b'are' b'short'
b'near' b'horns' b',' b'but' b'R\xc3\xa9union' b'has' b'praised' b'it' b'with' b'his' b'main' b'body' b',' b'whereas' b'admire' b'little' b'eye' b'sequences' b'of' b'Bay'
b'177' b',' b'both' b'of' b'which' b'are' b'more' b'small' b'scoring' b'.' b'<eos>' b'Other' b'groups' b'may' b'have' b'completely' b'allowed' b'lobbying' b'to' b'within'
b'the' b'excuse' b'of' b'cameras' b'.' b'Unlike' b'also' b'droplets' b'or' b'<unk>' b',' b'they' b'are' b'loose' b'simultaneously' b'.' b'They' b'have' b'parallel' b'to'
b'pandemic' b'and' b'often' b'beat' b'contact' b'over' b'about' b'60' b'thousand' b'months' b'old' b'.' b'This' b'bird' b'is' b'three' b'more' b'active' b'.' b'Other'
b'other' b'species' b'were' b'<unk>' b'restricted' b'to' b'the' b'standard' b',' b'leaving' b'<unk>' b',' b'particularly' b'slightly' b'Abdi' b'devil' b',' b'resulting' b'on' b'fifty'
b'<unk>' b',' b'known' b'as' b'an' b'bonnet' b'/' b'possibly' b'scale' b',' b'with' b'simplistic' b'and' b'<unk>' b'.' b'Mycena' b'Josip' b'Roth' b',' b'infected'
b'a' b'distinctive' b'item' b'for' b'moving' b'in' b'County' b'City' b'"' b'Mr' b'<unk>' b'"' b'and' b'"' b'patriarch' b'"' b'as' b'"' b'apprehend' b'"'
b',' b'frame' b'expanding' b'capability' b'between' b'behind' b'history' b',' b'red' b',' b'isolated' b',' b'urine' b'(' b'back' b')' b'which' b'are' b'known' b'with'
b'ASCAP' b'.' b'In' b'fact' b',' b'for' b'26' b'%' b'of' b'a' b'year' b'point' b'around' b'65' b'million' b'50' b'(' b'blue' b'long' b')'
b'.' b'These' b'legs' b'John' b'Europos' b'(' b'A' b'<unk>' b')' b'is' b'a' b'recent' b'.' b'In' b'DD' b'eggs' b',' b'it' b'was' b'described'
b'by' b'Hawks' b'as' b'<unk>' b',' b'an' b'pair' b'of' b'charm' b'.' b'It' b'was' b'also' b'hunted' b'that' b'they' b'lived' b'with' b'interior' b'pagan'

它不是GPT-2,但看起來模型已經開始學習語言結構了!

演示動態量化,只需要再定義幾個輔助函數:

# 設置BPTT(Backpropagation Through Time)的長度為25,即每次處理25個時間步的數據
bptt = 25# 定義損失函數為交叉熵損失函數,用于計算模型輸出與真實標簽之間的誤差
criterion = nn.CrossEntropyLoss()# 測試時使用的batch size為1
eval_batch_size = 1# 創建測試數據集
def batchify(data, bsz):"""將原始數據分割成多個批次,每個批次大小為bsz。參數:data (Tensor): 原始數據bsz (int): 每個批次的大小返回:Tensor: 分批后的數據"""# 計算可以完整分成多少個批次nbatch = data.size(0) // bsz# 去掉不能整除的部分數據data = data.narrow(0, 0, nbatch * bsz)# 將數據均勻分配到每個批次中,并調整形狀為(bsz, -1),然后進行轉置和連續化return data.view(bsz, -1).t().contiguous()# 對測試數據進行分批處理
test_data = batchify(corpus.test, eval_batch_size)# 定義獲取單個批次數據的函數
def get_batch(source, i):"""從source中提取一個批次的數據和對應的標簽。參數:source (Tensor): 輸入數據源i (int): 當前批次的起始位置返回:data (Tensor): 輸入數據target (Tensor): 對應的標簽數據"""# 確定當前批次的時間步長度,不超過bptt且不超過剩余數據長度seq_len = min(bptt, len(source) - 1 - i)# 提取輸入數據data = source[i:i+seq_len]# 提取對應的標簽數據,并將其展平為一維張量target = source[i+1:i+1+seq_len].reshape(-1)return data, target# 重新封裝隱藏狀態,使其脫離歷史梯度
def repackage_hidden(h):"""包裝隱藏狀態以斷開其歷史記錄,防止梯度在反向傳播時回傳到前面的批次。參數:h (Tensor or tuple): 隱藏狀態返回:Tensor or tuple: 脫離歷史后的隱藏狀態"""if isinstance(h, torch.Tensor):return h.detach()else:return tuple(repackage_hidden(v) for v in h)# 定義評估函數
def evaluate(model_, data_source):"""對模型在給定數據源上的表現進行評估。參數:model_ (nn.Module): 訓練好的模型data_source (Tensor): 數據源返回:float: 平均損失值"""# 將模型設置為評估模式,禁用dropout等訓練專用操作model_.eval()total_loss = 0.# 初始化隱藏狀態hidden = model_.init_hidden(eval_batch_size)# 在不計算梯度的情況下進行評估with torch.no_grad():for i in range(0, data_source.size(0) - 1, bptt):# 獲取當前批次的數據和標簽data, targets = get_batch(data_source, i)# 模型前向傳播,得到輸出和新的隱藏狀態output, hidden = model_(data, hidden)# 重新封裝隱藏狀態,避免占用過多內存hidden = repackage_hidden(hidden)# 展平輸出,以便與標簽進行損失計算output_flat = output.view(-1, ntokens)# 累加當前批次的損失total_loss += len(data) * criterion(output_flat, targets).item()# 計算平均損失return total_loss / (len(data_source) - 1)

這段代碼的主要功能是:

  1. 數據預處理:通過?batchify?函數將原始數據劃分為固定大小的批次,適用于模型輸入。
  2. 批量讀取get_batch?函數從數據源中提取指定位置的一個批次數據及其標簽。
  3. 隱藏狀態管理repackage_hidden?函數用于切斷隱藏狀態的歷史記錄,防止梯度回傳到前面的批次。
  4. 模型評估evaluate?函數對模型在測試數據上的性能進行評估,計算并返回平均損失。

④測試動態量化

最后,可以調用torch.quantization.quantize_dynamic。具體地說,

nn.LSTM和?nn.Linear模塊將被量化;

▲指定要將權重轉換為int8值。

import torch.quantizationquantized_model = torch.quantization.quantize_dynamic(model, {nn.LSTM, nn.Linear}, dtype=torch.qint8
)
print(quantized_model)

輸出:

LSTMModel((drop): Dropout(p=0.5, inplace=False)(encoder): Embedding(33278, 512)(rnn): DynamicQuantizedLSTM(512, 256, num_layers=5, dropout=0.5)(decoder): DynamicQuantizedLinear(in_features=256, out_features=33278, dtype=torch.qint8, qscheme=torch.per_tensor_affine)
)

模型看起來是一樣的,這如何受益?首先,可以看到顯著減小了模型尺寸。

def print_size_of_model(model):torch.save(model.state_dict(), "temp.p")print('Size (MB):', os.path.getsize("temp.p")/1e6)os.remove('temp.p')print_size_of_model(model)
print_size_of_model(quantized_model)

輸出:

Size (MB): 113.944455
Size (MB): 79.738939

其次,可以看到更快的推理時間,評估損失沒有差異。

注意:將線程數設置為單個線程比較的線程數,因為量化模型運行單線程。

# 設置 PyTorch 使用單個線程,以便更準確地測量模型推理時間
torch.set_num_threads(1)def time_model_evaluation(model, test_data):"""評估模型在測試數據上的性能,并統計推理時間。參數:model (nn.Module): 要評估的模型test_data (Tensor): 測試數據返回:打印模型損失和所用時間"""s = time.time()  # 記錄開始時間loss = evaluate(model, test_data)  # 調用評估函數計算損失elapsed = time.time() - s  # 計算耗時# 打印損失值和耗時(秒)print('''loss: {0:.3f}\nelapsed time (seconds): {1:.1f}'''.format(loss, elapsed))# 分別對原始模型和量化模型進行評估并計時
time_model_evaluation(model, test_data)
time_model_evaluation(quantized_model, test_data)

這段代碼的主要目的是:

  1. 限制線程數:通過?torch.set_num_threads(1)?確保模型推理只使用一個線程,避免多線程影響時間測量準確性。
  2. 定義評估計時函數?time_model_evaluation
    • 對輸入模型在測試數據上做評估;
    • 輸出交叉熵損失和推理耗時。
  3. 對比評估兩個模型
    • 原始浮點模型?model
    • 量化后的模型?quantized_model

這通常用于比較量化前后模型的推理速度精度損失,是模型壓縮與優化中的常見做法。

輸出

loss: 5.167
elapsed time (seconds): 198.3
loss: 5.168
elapsed time (seconds): 111.4

在 MacBook Pro上本地運行此功能,無需量化,推理大約需要 200 秒, 量化只需要大約100秒。

■結論

動態量化可以是一種減小模型尺寸的簡單方法,而只對準確性帶來有限的影響。

至此,本文分享的內容就結束了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912096.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【有啥問啥】大模型效率部署之Prefill-Decode分離

大模型效率部署之Prefill-Decode分離 Prefill 與 Decode 階段定義與流程 LLM 推理分為兩個階段&#xff1a;預填充&#xff08;Prefill&#xff09;和解碼&#xff08;Decode&#xff09;。在 Prefill 階段&#xff0c;模型將完整地處理用戶輸入的所有提示詞&#xff08;prom…

QT Creator構建失敗:-1: error: Unknown module(s) in QT: serialport

Qt Creator和Qt SDK版本&#xff1a; Product: Qt Creator 17.0.0 Based on: Qt 6.9.1 (MSVC 2022, x86_64) Built on: Jun 17 2025 16:32:24 From revision: 4983f08c47 問題&#xff1a; 在使用串口的時候&#xff0c;在pro 文件中添加了 QT serialport&#xff…

基于PostgreSQL的百度或高德等POI多層級分類的數據庫設計

目錄 前言 一、百度 VS 高德 POI分類 1、高德POI分類 2、百度POI分類 3、分類對比與區別 二、POI分類表設計 1、物理表結構 2、數據存儲 3、數據查詢 三、總結 前言 在當今數字化快速發展的時代&#xff0c;地理信息數據的重要性日益凸顯&#xff0c;而POI&#xff08…

AutoVLA:端到端自動駕駛中具有自適應推理和強化微調功能的視覺-語言-動作模型

26年6月來自UCLA的論文“AutoVLA: A Vision-Language-Action Model for End-to-End Autonomous Driving with Adaptive Reasoning and Reinforcement Fine-Tuning”。 視覺-語言-動作 (VLA) 模型的最新進展通過利用世界知識和推理能力為端到端自動駕駛帶來了希望。然而&#x…

知攻善防靶機 Windows 近源OS

知攻善防靶機 [hvv訓練]應急響應靶機訓練-近源滲透OS-1 前景需要&#xff1a;小王從某安全大廠被優化掉后&#xff0c;來到了某私立小學當起了計算機老師。某一天上課的時候&#xff0c;發現鼠標在自己動彈&#xff0c;又發現除了某臺電腦&#xff0c;其他電腦連不上網絡。感覺…

「Java基本語法」求三位整數的各位數字之和

引言 現在來玩一個數字拆解游戲。想象一下手里拿著一個三位數的積木,現在需要把它拆成個位、十位和百位三塊,然后把它們加起來。這個操作在實際編程中很常見,例如做密碼校驗、游戲分數計算等都可能會用到。 案例:求三位數各位之和 編寫程序,從鍵盤輸入一個三位的正整數…

SciChart 助力蛋白質結構研究:實時可視化推動生物科學新突破

SciChart是高性能數據可視化領域的優秀圖表產品&#xff0c;深受數據密度和精度至關重要行業的信賴&#xff0c;包括航空航天、石油和天然氣、科學研究和賽車運動等。作為F1中使用的解決方案&#xff0c;SciChart被NASA所依賴&#xff0c;并受到90%的頂級醫療技術公司青睞&…

基于Docker與cpolar的Leantime部署方案實現低成本跨地域團隊協作

文章目錄 前言1.關于Leantime2.本地部署Leantime3.Leantime簡單實用4.安裝內網穿透5.配置Leantime公網地址6. 配置固定公網地址 前言 各位小伙伴們&#xff0c;讓我們暫時把目光從云端的分布式系統轉向本地環境。在您的Linux主機上&#xff0c;我們將搭建一個高性價比的協作平…

阿里云Redhat系Linux修改ssh默認端口

阿里云Redhat系Linux修改ssh默認端口 在阿里云買了個服務器&#xff0c;想著ssh的默認端口是22&#xff0c;這不安全。 我就將修改ssh默認端口的過程記錄下來了&#xff0c;方便日后回看。 本命令適用于 Redhat系Linux&#xff0c;例如 Redhat、Centos、Alibaba Cloud Linux、…

lib61850 代碼結構與系統架構深度分析

一、整體代碼結構概述 lib61850 采用模塊化設計&#xff0c;核心代碼位于src目錄下&#xff0c;主要包含以下子目錄&#xff1a; src/ ├── hal/ # 硬件抽象層 ├── mms/ # MMS協議實現 ├── goose/ # GOOSE協議實現 ├──…

linux程序保活

需要解決的一個情況&#xff0c;在一些比較老的linux系統里&#xff0c;沒有systemctl來進行程序的啟動和重啟。現在需要設計一個讓程序高可用的方案。盡量提高程序可用性。 方案分成幾步&#xff0c;屬于補充和遞進的關系。最簡單的是用systemctl 托管&#xff0c;或者service…

文件加密、隱藏軟件 GiliSoft File Lock Pro v15.0 打造自己的私密空間

“在這個連聊天記錄都可能被截圖的時代&#xff0c;你的電腦硬盤里藏著多少不敢示人的秘密&#xff1f;”上周同事借我電腦改PPT時&#xff0c;我突然想起D盤里存著的年度述職報告草稿——那里面密密麻麻標注著部門每個人的績效短板&#xff0c;要是被誤看到簡直社死現場。好在…

深入淺出Java NIO:原理、實戰與性能優化

深入淺出Java NIO&#xff1a;原理、實戰與性能優化 一、技術背景與應用場景 隨著高并發、低延遲場景愈發常見&#xff0c;傳統的基于阻塞 I/O&#xff08;BIO&#xff09;模型難以滿足海量連接的需求。Java NIO&#xff08;Non-blocking I/O&#xff09;通過 Selector、Chan…

道可云人工智能每日資訊|中國航空工業集團召開人工智能大會

道可云人工智能&元宇宙每日簡報&#xff08;2025年6月25日&#xff09;訊&#xff0c;今日人工智能&元宇宙新鮮事有&#xff1a; 第22屆中國—東盟商務與投資峰會聚焦人工智能熱點 第22屆中國—東盟商務與投資峰會(以下簡稱峰會)聯絡官會議24日在廣西南寧召開。中國貿…

Python實例題:文件內容搜索工具

目錄 Python實例題 題目 要求&#xff1a; 解題思路&#xff1a; 代碼實現&#xff1a; Python實例題 題目 文件內容搜索工具 要求&#xff1a; 實現一個命令行工具&#xff0c;用于在指定目錄下搜索包含特定文本的文件。支持以下功能&#xff1a; 遞歸搜索子目錄區分…

【Pandas】pandas DataFrame resample

Pandas2.2 DataFrame Time Series-related 方法描述DataFrame.asfreq(freq[, method, how, …])用于**將時間序列數據轉換為指定頻率&#xff08;resample to frequency&#xff09;**的方法DataFrame.asof(where[, subset])用于查找時間序列中最接近指定時間點的非 NaN 值的…

自動駕駛nuPlan數據集-入門使用和可視化操作

文章目錄 前言一、nuPlan 數據集下載及環境安裝根據個人安裝的路徑將以下內容寫入./bashrc 中二、跑通場景可視化總結 前言 自動駕駛行業知識點太多&#xff0c;不進則退&#xff0c;上班就得學習&#xff0c;天上掉金磚砸我腳好了 參考文檔 參考&#xff11; 一、nuPlan 數據…

ApplovinMax接入Unity(包括我自己踩的一些坑)

前言 ApplovinMax是一個廣告聚合平臺&#xff0c;他會自帶自己的Applovin平臺廣告&#xff0c;在這個插件上面你可以下載其他的聚合渠道&#xff0c;與谷歌的Admob比較相似。都是廣告聚合平臺。 一. ApplovinMax SDK插件的導入 1.下載插件集成 | SDK 集成指南 | MAX | Suppo…

linux系統執行過程中的5種特殊情況

正在執行的用戶態X切換用戶態進程Y的過程為系統中常用的情況&#xff0c;但并非不能完全準確地反應系統的全部執行場景&#xff0c;還有一些場景比較特殊&#xff0c;主要包括以下5種情況 一.內核線程之間通過中斷處理過程中的調度時機發生進程切換&#xff0c;與一般的情況非常…

9. 元素拖拽

元素拖拽 API 介紹 1. 拖放過程 整個拖放過程中&#xff0c;存在兩個關鍵元素&#xff1a;拖拽元素、放置元素 拖拽元素&#xff1a;被拖拽的元素 drag&#xff1a;元素被拖拽時觸發&#xff0c;從開始拖拽到拖拽結束前整個過程會一直持續的觸發dragstart&#xff1a;元素被…