Best Python code snippet using lisa_python
dpdkutil.py
Source:dpdkutil.py
...77 nics_count = len(node.nics.get_upper_nics())78 numa_nodes = node.tools[Lscpu].get_numa_node_count()79 request_pages_2mb = (nics_count - 1) * 1024 * numa_nodes80 request_pages_1gb = (nics_count - 1) * numa_nodes81 memfree_2mb = meminfo.get_free_memory_mb()82 memfree_1mb = meminfo.get_free_memory_gb()83 # request 2iGB memory per nic, 1 of 2MiB pages and 1 GiB page84 # check there is enough memory on the device first.85 # default to enough for one nic if not enough is available86 # this should be fine for tests on smaller SKUs87 if memfree_2mb < request_pages_2mb:88 node.log.debug(89 "WARNING: Not enough 2MB pages available for DPDK! "90 f"Requesting {request_pages_2mb} found {memfree_2mb} free. "91 "Test may fail if it cannot allocate memory."92 )93 request_pages_2mb = 102494 if memfree_1mb < (request_pages_1gb * 2): # account for 2MB pages by doubling ask95 node.log.debug(...
utils.py
Source:utils.py
1import os2from typing import Tuple, List3import torch4import torch.nn as nn5from PIL import Image6import numpy as np7import multiprocessing8from diffusers import StableDiffusionPipeline9from diffusers.pipelines.stable_diffusion.safety_checker import (10 StableDiffusionSafetyChecker,11)12from transformers import CLIPFeatureExtractor13from transformers.feature_extraction_utils import BatchFeature14def image_grid(imgs, rows, cols):15 assert len(imgs) == rows * cols16 w, h = imgs[0].size17 grid = Image.new("RGB", size=(cols * w, rows * h))18 grid_w, grid_h = grid.size19 for i, img in enumerate(imgs):20 grid.paste(img, box=(i % cols * w, i // cols * h))21 return grid22def dummy_checker(images, *args, **kwargs):23 # removes nsfw filter24 return images, False25def dummy_extractor(images, return_tensors="pt"):26 # print(type(images), type(images[0]))27 if type(images) is list:28 images = [np.array(img) for img in images]29 data = {"pixel_values": images}30 return BatchFeature(data=data, tensor_type=return_tensors)31def remove_nsfw(32 model: StableDiffusionPipeline,33) -> Tuple[StableDiffusionSafetyChecker, CLIPFeatureExtractor]:34 nsfw_model: StableDiffusionSafetyChecker = model.safety_checker35 if isinstance(nsfw_model, StableDiffusionSafetyChecker):36 nsfw_model = nsfw_model.cpu()37 model.safety_checker = dummy_checker38 extr = model.feature_extractor39 model.feature_extractor = dummy_extractor40 return nsfw_model, extr41def get_gpu_setting(env_var: str) -> Tuple[bool, List[int]]:42 if not torch.cuda.is_available():43 print("GPU not detected! Make sure you have a GPU to reduce inference time!")44 return False, []45 # reads user input, returns multi_gpu flag and gpu id(s)46 n = torch.cuda.device_count()47 if env_var == "all":48 gpus = list(range(n))49 elif "," in env_var:50 gpus = [int(gnum) for gnum in env_var.split(",") if int(gnum) < n]51 else:52 gpus = [int(env_var)]53 assert len(54 gpus55 ), f"Make sure to provide valid device ids! You have {n} GPU(s), you can specify the following values: {list(range(n))}"56 return len(gpus) > 1, gpus57def get_free_memory_Mb(device: int):58 # returns (free, total) device memory, in bytes59 return torch.cuda.mem_get_info(device)[0] / 2**2060def model_size_Mb(model):61 # from the legend @ptrblck himself https://discuss.pytorch.org/t/finding-model-size/130275/262 param_size = 063 for param in model.parameters():64 param_size += param.nelement() * param.element_size()65 buffer_size = 066 for buffer in model.buffers():67 buffer_size += buffer.nelement() * buffer.element_size()68 return (param_size + buffer_size) / 1024**269class ToGPUWrapper(nn.Module, object):70 def __init__(self, layer: nn.Module, device: torch.device) -> None:71 # composition design, we wrap a nn.Module, change forward72 super().__init__()73 self.device = device74 # move wrapped model to correct device75 self.layer = layer.to(device)76 def forward(self, x: torch.Tensor, *args, **kwargs):77 # move input and output to given device78 # print(self.layer.__class__.__name__)79 args = [a.to(self.device) if type(a) is torch.Tensor else a for a in args]80 for k in kwargs:81 if type(kwargs[k]) is torch.Tensor:82 kwargs[k] = kwargs[k].to(self.device)83 y = self.layer(x.to(self.device), *args, **kwargs)84 # text model wraps output.. this could be made more generic85 if self.layer.__class__.__name__ == "CLIPTextModel":86 # getting does something like this self.to_tuple()[k]87 y.last_hidden_state = y.last_hidden_state.to(self.device)88 return y89 return y.to(self.device)90 # FIXME this is giving recursion problems91 # def __getattr__(self, name: str):92 # return getattr(self.layer, name)93 def __iter__(self):94 return iter(self.layer)95 def __next__(self):96 return next(self.layer)97 def decode(self, z):98 # for vae output99 return self.layer.decode(z.to(self.device))100class ModelParts2GPUsAssigner:101 def __init__(102 self,103 devices: List[int],104 ) -> None:105 """106 Finds a valid assignment of model parts (unet, vae..) to available GPUs107 using a stochastic brute-force approach. The problem is formulated108 as a Integer Linear Programming one:109 maximize w^t X with w=[a, b, c, d]110 subject to x_1 a + y_1 b + z_1 c + k_1 d \leq v_1111 \dots112 x_n a + y_n b + z_n c + k_n d \leq v_n113 with \sum x_i=\sum y_i=\sum z_i=\sum k_i114 x, y, z, k \geq 0115 x, y, z, k \in Z^n116 `self.W` represents the memory requirements of each component in which the model is split117 into.118 `self.G` is a vector of size N, containing the available memory of each device. Available119 memory is conservatively taken as 60% of the free memory.120 The assignment state I is a Nx4 matrix where I[i,j] represents the number of components j121 assigned to GPU i (initially 0). 122 """123 self.N = len(devices)124 # memory "budget" for each device: we consider 60% of the available GPU memory125 # so that the rest can be used for storing intermediate results126 # TODO unet uses way more than the other components, optmize to do inference on 512x512127 G = [int(get_free_memory_Mb(d) * 0.6) for d in devices]128 print("Free GPU memory (per device): ", G)129 # FIXME G is kind of a function of n_models itself, as the more models you have130 # the more memory you will be using for storing intermediate results...131 self.G = np.array(G, dtype=np.uint16)132 # model components memory usage, fixed order: unet_e, unet_d, text_encoder, vae133 # TODO make dynamic using `model_size_Mb(model.text_encoder)`,134 fp16 = bool(int(os.environ.get("FP16", 1)))135 if fp16:136 self.W = np.array([666, 975, 235, 160])137 else:138 # fp32 weights139 self.W = np.array([1331, 1949, 470, 320])140 single_model = bool(os.environ.get("SINGLE_MODEL_PARALLEL", False))141 # easy way to ensure single model multiple gpus, useful for debugging142 if single_model:143 self._max_models = 1144 else:145 # max number of models you can have considering pooled VRam as it if was a single GPU,146 # "upper bounded" by max number of processes147 self._max_models = min(148 multiprocessing.cpu_count(), np.floor(self.G.sum() / self.W.sum())149 )150 if np.floor(self.G.sum() / self.W.sum()) == 0:151 raise Exception(152 "You don't have enough combined VRam to host a single model! Try to run the container using the FP16 mode."153 )154 def state_evaluation(self, state: np.ndarray):155 """156 2 conditions:157 - each model component must appear in the same number (implicitly generated)158 - allocation on each GPUs must not be greater than its capacity159 """160 return (state @ self.W <= self.G).all()161 def add_model(self, state: np.ndarray, rnd=True, sample_size=2)->List[np.ndarray]:162 """163 This function takes an assignment state and tries to add a "model" to it:164 adding a model means assigning *each of the 4 components* to a device.165 It does so by brute-force searching for valid assignments that support166 the addition of another model. 167 If no such assignment exist, an empty list is returned.168 can be169 changed through `sample_size`170 Args:171 state (np.ndarray): The initial state from which the search starts from.172 rnd (bool, optional): Whether to generate new assignments in a random fashion, 173 rather than proceeding "linearly". Defaults to True.174 sample_size (int, optional): The number of valid assignments needed to175 interrupt the search before the whole space is visited. Defaults to 2.176 """177 def get_device_permutation():178 if rnd:179 return np.random.permutation(self.N)180 return np.arange(self.N)181 # beware, this will modify state in-place182 valid = []183 # N^4 possible combinations184 # plus one on cells (0, a), (1, b), (2, c), (3, d)185 for a in get_device_permutation():186 state[a, 0] += 1187 for b in get_device_permutation():188 state[b, 1] += 1189 for c in get_device_permutation():190 state[c, 2] += 1191 for d in get_device_permutation():192 state[d, 3] += 1193 # evaluate state, return first valid or keep a list of valid ones? Or one with max "score"?194 # greedy return one, can't guarantee to find (one of the) optimum(s)195 if self.state_evaluation(state):196 # could be compressed by only storing a,b,c,d..197 valid.append(state.copy())198 # here state wasn't backtracked!199 if sample_size > 0 and len(valid) >= sample_size:200 return valid201 # backtrack!202 state[d, 3] -= 1203 state[c, 2] -= 1204 state[b, 1] -= 1205 state[a, 0] -= 1206 return valid207 def find_best_assignment(208 self, state: np.ndarray, curr_n_models: int, **kwargs209 ) -> Tuple[int, List[np.ndarray]]:210 """ 211 Starting from the intial empty assignment, tries to add a model to the multi-gpu212 setup recursively, stopping whenever this is impossible. 213 """214 if curr_n_models >= self._max_models:215 return -1, []216 prev = state.copy()217 valid = self.add_model(state, **kwargs)218 # can't generate valid assignments with an extra model, return current one219 if not len(valid):220 return curr_n_models, [prev]221 # visit children222 children = []223 for next_state in valid:224 # insert only valid states225 depth, ss = self.find_best_assignment(226 next_state, curr_n_models + 1, **kwargs227 )228 if depth > 0 and len(ss):229 children.append((depth, ss))230 # can't add more models231 if not len(children):232 return curr_n_models + 1, valid233 # return best child, the one that assigns more models234 return max(children, key=lambda t: t[0])235 def __call__(self) -> np.ndarray:236 # initial empty assignment, #GPUs x #model_parts237 I = np.zeros((self.N, 4), dtype=np.uint16)238 # returns a valid assignment of split component to devices239 n_models, ass = self.find_best_assignment(I, 0)240 ass = ass[0]241 print(242 f"Search has found that {n_models} model(s) can be split over {self.N} device(s)!"243 )244 # format output into a [{model_component->device}], one per model to create245 model_ass = [{i: -1 for i in range(4)} for _ in range(n_models)]246 for comp in range(4):247 for dev in range(self.N):248 # this might say "component_0 to device_1 3 times"249 for _ in range(ass[dev, comp]):250 for m in model_ass:251 # assign to model that doesn't have an allocated component yet252 if m[comp] == -1:253 m[comp] = dev...
free.py
Source:free.py
...56 raise LisaException(f"Failed to get info for field {field_name}")57 def get_swap_size(self) -> int:58 # Return total swap size in Mebibytes59 return self._get_field_bytes_kib("Swap", "total") >> 1060 def get_free_memory_mb(self) -> int:61 return self._get_field_bytes_kib("Mem", "free") >> 1062 def get_free_memory_gb(self) -> int:63 return self._get_field_bytes_kib("Mem", "free") >> 2064 def get_total_memory(self) -> str:65 """66 Returns total memory in power of 1000 with unit67 Example: 20G68 """69 # Example70 # total used free shared buff/cache available71 # Mem: 9.0G 4.6G 751M 74M 3.7G 4.0G72 # Swap: 0B 0B 0B73 output = self.run("-h --si", shell=True).stdout74 group = find_group_in_lines(output, self._mem_pattern)...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!