# Copied from https://github.com/Shenyi-Z/TaylorSeer/blob/main/TaylorSeers-xDiT/taylorseer_flux/taylorseer_utils/__init__.py from typing import Dict import torch import math def derivative_approximation(cache_dic: Dict, current: Dict, feature: torch.Tensor): """ Compute derivative approximation. :param cache_dic: Cache dictionary :param current: Information of the current step """ difference_distance = current['activated_steps'][-1] - current['activated_steps'][-2] updated_taylor_factors = {} updated_taylor_factors[0] = feature for i in range(cache_dic['max_order']): if (cache_dic['cache'][-1][current['stream']][current['layer']][current['module']].get(i, None) is not None) and (current['step'] > cache_dic['first_enhance'] - 2): updated_taylor_factors[i + 1] = (updated_taylor_factors[i] - cache_dic['cache'][-1][current['stream']][current['layer']][current['module']][i]) / difference_distance else: break cache_dic['cache'][-1][current['stream']][current['layer']][current['module']] = updated_taylor_factors def taylor_formula(cache_dic: Dict, current: Dict) -> torch.Tensor: """ Compute Taylor expansion error. :param cache_dic: Cache dictionary :param current: Information of the current step """ x = current['step'] - current['activated_steps'][-1] #x = current['t'] - current['activated_times'][-1] output = 0 for i in range(len(cache_dic['cache'][-1][current['stream']][current['layer']][current['module']])): output += (1 / math.factorial(i)) * cache_dic['cache'][-1][current['stream']][current['layer']][current['module']][i] * (x ** i) return output def taylor_cache_init(cache_dic: Dict, current: Dict): """ Initialize Taylor cache and allocate storage for different-order derivatives in the Taylor cache. :param cache_dic: Cache dictionary :param current: Information of the current step """ if (current['step'] == 0) and (cache_dic['taylor_cache']): cache_dic['cache'][-1][current['stream']][current['layer']][current['module']] = {}