From 71d76163a041666e2bc5b49c38be5456db75db1f Mon Sep 17 00:00:00 2001 From: wangwl Date: Tue, 16 Dec 2025 03:06:46 +0000 Subject: [PATCH 1/3] add XCiT --- .../build-in/Classification/XCiT/coverage.txt | 3 + PyTorch/build-in/Classification/XCiT/loss.jpg | Bin 0 -> 35974 bytes PyTorch/build-in/Classification/XCiT/loss.py | 95 +++ PyTorch/build-in/Classification/XCiT/run | 1 + .../Classification/XCiT/weloTrainStep.py | 692 ++++++++++++++++++ PyTorch/build-in/Classification/XCiT/xcit.py | 641 ++++++++++++++++ .../Classification/XCiT/xcit_loss.jpg | Bin 0 -> 32499 bytes .../Classification/XCiT/xcit_loss.txt | 29 + 8 files changed, 1461 insertions(+) create mode 100644 PyTorch/build-in/Classification/XCiT/coverage.txt create mode 100644 PyTorch/build-in/Classification/XCiT/loss.jpg create mode 100644 PyTorch/build-in/Classification/XCiT/loss.py create mode 100644 PyTorch/build-in/Classification/XCiT/run create mode 100644 PyTorch/build-in/Classification/XCiT/weloTrainStep.py create mode 100644 PyTorch/build-in/Classification/XCiT/xcit.py create mode 100644 PyTorch/build-in/Classification/XCiT/xcit_loss.jpg create mode 100644 PyTorch/build-in/Classification/XCiT/xcit_loss.txt diff --git a/PyTorch/build-in/Classification/XCiT/coverage.txt b/PyTorch/build-in/Classification/XCiT/coverage.txt new file mode 100644 index 000000000..5201a2558 --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/coverage.txt @@ -0,0 +1,3 @@ +all api: ['_amp_foreach_non_finite_check_and_unscale_', '_amp_update_scale_', '_copy_from', '_has_compatible_shallow_copy_type', '_local_scalar_dense', '_log_softmax', '_log_softmax_backward_data', '_pin_memory', '_reshape_alias', '_softmax', '_softmax_backward_data', 'add', 'add_', 'addmm', 'arange_out', 'as_strided', 'bitwise_not', 'bmm', 'bmm_backward', 'bmm_forward', 'cat', 'clamp_min_out', 'contiguous', 'convolution', 'convolution_backward', 'copy_stride', 'cos', 'div', 'dropout', 'eq', 'fill_', 'floor_divide', 'fused_sgd', 'ge', 'gelu', 'gelu_backward', 'is_pinned', 'linalg_vector_norm_out', 'linear', 'masked_fill_', 'matmul', 'mm', 'mul', 'mul_', 'native_batch_norm', 'native_batch_norm_backward', 'native_layer_norm', 'native_layer_norm_backward', 'neg', 'nll_loss_backward', 'nll_loss_forward', 'pow', 'reciprocal', 'set_', 'sin', 'slice_backward', 'sum', 'topk_out', 'view', 'where', 'zero_'], total: 61 +fallback op: ['_softmax'], total: 1 +coverage rate: 98.36% diff --git a/PyTorch/build-in/Classification/XCiT/loss.jpg b/PyTorch/build-in/Classification/XCiT/loss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76b462aa0071a238f1138303ea9aef21294140d7 GIT binary patch literal 35974 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: break + print(loss_arr) + return loss_arr + + +def plot_loss(sdaa_loss,a100_loss): + fig, ax = plt.subplots(figsize=(12, 6)) + + smoothed_losses = savgol_filter(sdaa_loss, 20, 1) + x = list(range(len(sdaa_loss))) + ax.plot(x, smoothed_losses, label="sdaa_loss") + + smoothed_losses = savgol_filter(a100_loss, 20, 1) + x = list(range(len(a100_loss))) + ax.plot(x, smoothed_losses, "--", label="cuda_loss") + + ax.set_xlabel("Iteration") + ax.set_ylabel("Loss") + ax.set_title("Model Training Loss Curves (Smoothed)") + ax.legend() + plt.savefig("loss.jpg") + +if __name__=="__main__": + from argparse import ArgumentParser,ArgumentTypeError + parser = ArgumentParser(description='modelzoo') + parser.add_argument('--sdaa-log', type=str,default="sdaa_nohup.out_1core_100step") + parser.add_argument('--cuda-log', type=str,default="cuda_nohup.out_1card") + args=parser.parse_args() + + sdaa_log = args.sdaa_log + with open(sdaa_log, 'r') as f: + s = f.read() + sdaa_res = parse_string(s) + + a100_log = args.cuda_log + with open(a100_log, 'r') as f: + s = f.read() + a100_res = parse_string(s) + length=min(len(a100_res),len(sdaa_res)) + sdaa_loss = parse_loss(sdaa_res[:length]) + a100_loss = parse_loss(a100_res[:length]) + compare_loss(a100_loss, sdaa_loss) # 比较loss + plot_loss(sdaa_loss,a100_loss) # 对比loss曲线图 \ No newline at end of file diff --git a/PyTorch/build-in/Classification/XCiT/run b/PyTorch/build-in/Classification/XCiT/run new file mode 100644 index 000000000..2e83eab02 --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/run @@ -0,0 +1 @@ +bash ../sdaaTest.sh diff --git a/PyTorch/build-in/Classification/XCiT/weloTrainStep.py b/PyTorch/build-in/Classification/XCiT/weloTrainStep.py new file mode 100644 index 000000000..13297c11b --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/weloTrainStep.py @@ -0,0 +1,692 @@ +#!/usr/bin/env python3 +# coding: utf-8 + +import os +import random +import sys +import time +import json +import argparse +from collections import OrderedDict +from pathlib import Path +import numpy as np +import pandas as pd +from tqdm import tqdm +import importlib + +os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" # 强烈推荐在 shell/最顶端设置 +os.environ["PYTHONHASHSEED"] = "12345" +os.environ["OMP_NUM_THREADS"] = "1" +os.environ["MKL_NUM_THREADS"] = "1" + +def ensure_cublas_workspace(config=":4096:8"): + """ + 尝试为 cuBLAS 设置可复现 workspace。强烈建议在主脚本入口处(import torch 之前) + 通过 export 设置该 env。此函数会在运行时设置,但如果 torch 已经被 import, + 则可能为时已晚——函数会打印提醒。 + """ + already = os.environ.get("CUBLAS_WORKSPACE_CONFIG") + if already: + print(f"[seed_utils] CUBLAS_WORKSPACE_CONFIG 已存在:{already}") + else: + os.environ["CUBLAS_WORKSPACE_CONFIG"] = config + print(f"[seed_utils] 已设置 CUBLAS_WORKSPACE_CONFIG={config} (注意:请在 import torch 前设置以保证生效)") + +def set_global_seed(seed: int = 42, set_threads: bool = True): + """ + 统一随机性设置。注意:若希望完全发挥效果,请在主脚本入口(import torch 之前) + 先调用 ensure_cublas_workspace(...) 或在 shell 中 export CUBLAS_WORKSPACE_CONFIG。 + """ + ensure_cublas_workspace() # 会设置 env 并提醒 + os.environ["PYTHONHASHSEED"] = str(seed) + + if set_threads: + os.environ["OMP_NUM_THREADS"] = "1" + os.environ["MKL_NUM_THREADS"] = "1" + + random.seed(seed) + np.random.seed(seed) + + # 现在导入 torch(晚导入以便前面 env 生效) + import torch + torch.manual_seed(seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + # 强制确定性(如果存在不确定性算子,PyTorch 会报错并提示) + try: + torch.use_deterministic_algorithms(True) + except Exception as e: + print("[seed_utils] 设置 deterministic 模式时出错:", e) + print("[seed_utils] 请确认 CUBLAS_WORKSPACE_CONFIG 已在 import torch 之前设置。") + + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + if set_threads: + torch.set_num_threads(1) + torch.set_num_interop_threads(1) + + print(f"[seed_utils] 全局 seed 已设置为 {seed}") + +set_global_seed(2025) + +""" +通用训练模版(优先从本地导入 Model -> 支持 DDP / 单卡,AMP,resume,日志,checkpoint) +保存为 train_template_localmodel.py +""" +import torch +import torch.nn as nn +import torch.optim as optim +import torch.backends.cudnn as cudnn +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as tv_models + +import torch.distributed as dist +from torch.nn.parallel import DistributedDataParallel as DDP +from torch.utils.data import DataLoader +from torch.utils.data.distributed import DistributedSampler + +from torch.sdaa import amp +# from torch.cuda import amp + + +# ---------------------------- +# Helper utilities (self-contained) +# ---------------------------- +class AverageMeter(object): + def __init__(self, name='Meter', fmt=':.4f'): + self.name = name + self.fmt = fmt + self.reset() + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / max(1, self.count) + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} (avg {avg' + self.fmt + '})' + return fmtstr.format(name=self.name, val=self.val, avg=self.avg) + +def accuracy(output, target, topk=(1,)): + """Computes the precision@k for the specified values of k + 返回一个 list,每个元素是 tensor(百分比形式) + """ + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + # output: (N, C) -> pred: (maxk, N) + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() # (maxk, N) + correct = pred.eq(target.view(1, -1).expand_as(pred)) # (maxk, N) bool + + res = [] + for k in topk: + # 把前 k 行展平后求和(返回 0-dim tensor),随后换算为百分比 + correct_k = correct[:k].reshape(-1).float().sum() # 注意:不传 keepdim + # 乘以 100.0 / batch_size,保持返回 tensor(和之前代码兼容) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + +def save_checkpoint(state, is_best, save_dir, filename='checkpoint.pth'): + save_path = os.path.join(save_dir, filename) + torch.save(state, save_path) + if is_best: + best_path = os.path.join(save_dir, 'model_best.pth') + torch.save(state, best_path) + +def set_seed(seed, deterministic=False): + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + cudnn.deterministic = True + cudnn.benchmark = False + else: + cudnn.deterministic = False + cudnn.benchmark = True + +# ---------------------------- +# Argument parser +# ---------------------------- +def parse_args(): + parser = argparse.ArgumentParser(description='Generic PyTorch training template (DDP/AMP) with LocalModel priority') + parser.add_argument('--name', default='run', type=str, help='experiment name (log/checkpoints dir)') + parser.add_argument('--seed', default=42, type=int, help='random seed') + parser.add_argument('--arch', default='None', type=str, help='model name') + parser.add_argument('--deterministic', action='store_true', help='set cudnn deterministic (may be slower)') + parser.add_argument('--dataset', default='cifar10', choices=['cifar10','cifar100','imagenet','custom'], help='which dataset') + parser.add_argument('--datapath', default='./data', type=str, help='dataset root / imagenet root / custom root') + parser.add_argument('--imagenet_dir', default='./imagenet', type=str, help='if dataset=imagenet, path to imagenet root') + parser.add_argument('--custom_eval_dir', default=None, help='if dataset=custom, provide val dir') + parser.add_argument('--num_workers', default=4, type=int, help='dataloader workers per process') + parser.add_argument('--epochs', default=200, type=int) + parser.add_argument('--steps', default=0, type=int, help='max steps to run (if >0, training will stop when global_step reaches this).') + parser.add_argument('--batch_size', default=128, type=int) + parser.add_argument('--model_name', default='resnet18', help='torchvision model name or python path e.g. mypkg.mymodule.Model (used if no local Model)') + parser.add_argument('--num_classes', default=None, type=int, help='override num classes (auto-detect for common sets)') + parser.add_argument('--pretrained', action='store_true', help='use torchvision pretrained weights when available') + parser.add_argument('--optimizer', default='sgd', choices=['sgd','adam','adamw'], help='optimizer') + parser.add_argument('--lr', '--learning_rate', default=0.1, type=float) + parser.add_argument('--momentum', default=0.9, type=float) + parser.add_argument('--weight_decay', default=5e-4, type=float) + parser.add_argument('--nesterov', action='store_true') + parser.add_argument('--scheduler', default='multistep', choices=['multistep','step','cosine','none'], help='lr scheduler') + parser.add_argument('--milestones', default='100,150', type=str, help='milestones for multistep (comma sep)') + parser.add_argument('--step_size', default=30, type=int, help='step size for StepLR or cosine max epochs') + parser.add_argument('--gamma', default=0.1, type=float) + parser.add_argument('--scheduler_step_per_batch', action='store_true', help='call scheduler.step() per batch (for some schedulers)') + parser.add_argument('--resume', default='', type=str, help='path to checkpoint to resume from') + parser.add_argument('--start_epoch', default=0, type=int) + parser.add_argument('--print_freq', default=100, type=int) + parser.add_argument('--save_freq', default=10, type=int, help='save checkpoint every N epochs (rank0 only)') + parser.add_argument('--amp', action='store_true', default = True,help='use automatic mixed precision (AMP)') + parser.add_argument('--grad_accum_steps', default=1, type=int, help='gradient accumulation steps') + parser.add_argument('--local_rank', default=None, type=int, help='local rank passed by torchrun (if any). Use -1 or None for non-distributed') + parser.add_argument('--cutmix_prob', default=0.0, type=float) + parser.add_argument('--beta', default=1.0, type=float) + parser.add_argument('--seed_sampler', default=False, action='store_true', help='set sampler epoch seeds to make deterministic distributed shuffling') + args = parser.parse_args() + args.milestones = [int(x) for x in args.milestones.split(',')] if args.milestones else [] + return args + +# ---------------------------- +# build model (优先 LocalModel) +# ---------------------------- +def build_model_with_local_priority(args, device=None): + """ + 用参数 args.arch 作为模块名导入 Model() + 如果模块不存在或没有 Model 类,则报错停止。 + """ + try: + # 动态导入模块,比如 args.arch = "rexnet" + mod = importlib.import_module(args.arch) + Model = getattr(mod, "Model") # 从模块中获取 Model 类 + except Exception as e: + raise RuntimeError( + f"无法导入模型模块 '{args.arch}' 或未找到类 Model。" + f"\n错误信息:{e}" + ) + + # 解析数据集类别数 + if args.dataset == 'cifar10': + num_classes = 10 + elif args.dataset == 'cifar100': + num_classes = 100 + else: + print(f"[ERROR] 不支持的数据集类型:{args.dataset},无法确定类别数。程序终止。") + sys.exit(1) + + + # 实例化 + try: + model = Model(num_classes) + except Exception as e: + raise RuntimeError( + f"Model() 实例化失败,请检查模型构造函数。\n错误信息:{e}" + ) + + return model + +# ---------------------------- +# Data loader factory +# ---------------------------- +def build_dataloaders(args, rank, world_size): + if args.dataset == 'cifar10' or args.dataset == 'cifar100': + mean = (0.4914, 0.4822, 0.4465) + std = (0.2470, 0.2435, 0.2616) if args.dataset == 'cifar10' else (0.2023, 0.1994, 0.2010) + # train_transform = transforms.Compose([ + # transforms.RandomCrop(32, padding=4), + # transforms.RandomHorizontalFlip(), + # transforms.ToTensor(), + # transforms.Normalize(mean, std), + # ]) + # test_transform = transforms.Compose([ + # transforms.ToTensor(), + # transforms.Normalize(mean, std), + # ]) + + train_transform = transforms.Compose([ # 2025/12/3 从visformer模型开始 + transforms.Resize(256), # 先放大到 256 + transforms.RandomCrop(224), # 再随机裁剪为 224(更符合 ImageNet 风格增强) + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(mean, std), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean, std), + ]) + root = args.datapath + if args.dataset == 'cifar10': + train_set = datasets.CIFAR10(root=root, train=True, download=False, transform=train_transform) + val_set = datasets.CIFAR10(root=root, train=False, download=False, transform=test_transform) + num_classes = 10 + else: + train_set = datasets.CIFAR100(root=root, train=True, download=False, transform=train_transform) + val_set = datasets.CIFAR100(root=root, train=False, download=False, transform=test_transform) + num_classes = 100 + + elif args.dataset == 'imagenet': + train_dir = os.path.join(args.imagenet_dir, 'train') + val_dir = os.path.join(args.imagenet_dir, 'val') + train_transform = transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize((0.485,0.456,0.406), (0.229,0.224,0.225)), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize((0.485,0.456,0.406), (0.229,0.224,0.225)), + ]) + train_set = datasets.ImageFolder(train_dir, train_transform) + val_set = datasets.ImageFolder(val_dir, test_transform) + num_classes = args.num_classes or 1000 + + elif args.dataset == 'custom': + train_dir = os.path.join(args.datapath, 'train') + val_dir = args.custom_eval_dir or os.path.join(args.datapath, 'val') + train_transform = transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + ]) + test_transform = transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + ]) + train_set = datasets.ImageFolder(train_dir, train_transform) + val_set = datasets.ImageFolder(val_dir, test_transform) + num_classes = len(train_set.classes) + else: + raise ValueError("Unknown dataset") + + if dist.is_initialized() and world_size > 1: + train_sampler = DistributedSampler(train_set, num_replicas=world_size, rank=rank, shuffle=True) + else: + train_sampler = None + + train_loader = DataLoader(train_set, + batch_size=args.batch_size, + shuffle=(train_sampler is None), + num_workers=args.num_workers, + pin_memory=True, + sampler=train_sampler, + drop_last=False) + val_loader = DataLoader(val_set, + batch_size=args.batch_size, + shuffle=False, + num_workers=args.num_workers, + pin_memory=True) + + return train_loader, val_loader, num_classes, train_sampler + +# ---------------------------- +# Train & validate +# ---------------------------- +def train_one_epoch(args, epoch, model, criterion, optimizer, train_loader, device, scaler, scheduler=None, train_sampler=None, global_step_start=0, max_global_steps=None): + """ + 现在支持:若 max_global_steps 非 None,则当 global_step 达到该值时提前退出 + 返回: epoch_summary_dict, step_logs_list, global_step_end + step_logs_list: list of dicts with per-step info (for logging to CSV if需要) + """ + batch_time = AverageMeter('Time') + data_time = AverageMeter('Data') + losses = AverageMeter('Loss') + top1 = AverageMeter('Acc@1') + top5 = AverageMeter('Acc@5') + + model.train() + end = time.time() + optimizer.zero_grad() + + iters = len(train_loader) + step_logs = [] + global_step = global_step_start + + for i, (images, targets) in enumerate(train_loader): + # check global steps limit + if (max_global_steps is not None) and (global_step >= max_global_steps): + break + + data_time.update(time.time() - end) + images = images.to(device, non_blocking=True) + targets = targets.to(device, non_blocking=True) + + if args.amp: + with amp.autocast(): + outputs = model(images) + loss = criterion(outputs, targets) / args.grad_accum_steps + else: + outputs = model(images) + loss = criterion(outputs, targets) / args.grad_accum_steps + + if args.amp: + scaler.scale(loss).backward() + else: + loss.backward() + + # 每当累积步满足 grad_accum_steps 就 step + if (i + 1) % args.grad_accum_steps == 0: + if args.amp: + scaler.step(optimizer) + scaler.update() + else: + optimizer.step() + optimizer.zero_grad() + if scheduler is not None and args.scheduler_step_per_batch: + scheduler.step() + + with torch.no_grad(): + acc1, acc5 = accuracy(outputs, targets, topk=(1,5)) + losses.update(loss.item() * args.grad_accum_steps, images.size(0)) + top1.update(acc1.item(), images.size(0)) + top5.update(acc5.item(), images.size(0)) + + batch_time.update(time.time() - end) + end = time.time() + + # increment global step AFTER processing this batch + global_step += 1 + + # per-step print (controlled by print_freq) + if ((global_step % args.print_freq == 0) or (i == iters - 1)) and ((dist.get_rank() if dist.is_initialized() else 0) == 0): + lr = optimizer.param_groups[0]['lr'] + print(f"Epoch[{epoch}]:step[{i+1}/{iters}] step_train_loss {losses.val:.4f} acc1 {top1.val:.2f} acc5 {top5.val:.2f}") + + # collect per-step log + step_logs.append({ + 'epoch': epoch, + 'batch_idx': i, + 'global_step': global_step, + 'lr': optimizer.param_groups[0]['lr'], + 'loss': losses.val, + 'loss_avg': losses.avg, + 'acc1': top1.val, + 'acc1_avg': top1.avg, + 'acc5': top5.val, + 'acc5_avg': top5.avg, + 'time': batch_time.val + }) + + # if reached max_global_steps inside epoch, break (handled at loop start next iter) + if (max_global_steps is not None) and (global_step >= max_global_steps): + if (dist.get_rank() if dist.is_initialized() else 0) == 0: + print(f"[Info] 达到 max_global_steps={max_global_steps},将在 epoch 内提前停止。") + break + + # --- flush remaining grads if needed (handle gradient accumulation leftovers) --- + processed_batches = global_step - global_step_start # 实际处理的 batch 数 + if args.grad_accum_steps > 1 and (processed_batches % args.grad_accum_steps) != 0: + # only step if there are gradients + grads_present = any((p.grad is not None and p.requires_grad) for p in model.parameters()) + if grads_present: + if args.amp: + try: + scaler.step(optimizer) + scaler.update() + except Exception as e: + # 防御性:若 scaler.step 因某些原因失败,尝试普通 step(只在极端情况下) + print("[Warning] scaler.step 失败,尝试普通 optimizer.step():", e) + optimizer.step() + else: + optimizer.step() + optimizer.zero_grad() + if scheduler is not None and args.scheduler_step_per_batch: + scheduler.step() + if (dist.get_rank() if dist.is_initialized() else 0) == 0: + print(f"[Info] flushed remaining gradients after early stop (processed_batches={processed_batches}, grad_accum={args.grad_accum_steps}).") + + if scheduler is not None and not args.scheduler_step_per_batch: + scheduler.step() + + return OrderedDict([('loss', losses.avg), ('acc1', top1.avg), ('acc5', top5.avg)]), step_logs, global_step + +def validate(args, model, val_loader, criterion, device, max_batches=None): + """ + Validate on the val_loader. + If max_batches is not None, only process up to that many batches (useful for quick checks). + Returns an OrderedDict with loss/acc1/acc5 (averaged over processed samples). + """ + losses = AverageMeter('Loss') + top1 = AverageMeter('Acc@1') + top5 = AverageMeter('Acc@5') + + model.eval() + processed_batches = 0 + processed_samples = 0 + with torch.no_grad(): + for i, (images, targets) in enumerate(tqdm(val_loader)): + images = images.to(device, non_blocking=True) + targets = targets.to(device, non_blocking=True) + outputs = model(images) + loss = criterion(outputs, targets) + acc1, acc5 = accuracy(outputs, targets, topk=(1,5)) + batch_n = images.size(0) + losses.update(loss.item(), batch_n) + top1.update(acc1.item(), batch_n) + top5.update(acc5.item(), batch_n) + + processed_batches += 1 + processed_samples += batch_n + + if (max_batches is not None) and (processed_batches >= max_batches): + break + + # 如果没处理任何样本,避免除0(不太可能,但防御性) + if processed_samples == 0: + return OrderedDict([('loss', 0.0), ('acc1', 0.0), ('acc5', 0.0)]) + return OrderedDict([('loss', losses.avg), ('acc1', top1.avg), ('acc5', top5.avg)]) + +# ---------------------------- +# Main +# ---------------------------- +def main(): + args = parse_args() + + # handle local_rank from env if not provided + local_rank_env = os.environ.get('LOCAL_RANK', None) + if args.local_rank is None and local_rank_env is not None: + args.local_rank = int(local_rank_env) + + distributed = (args.local_rank is not None and args.local_rank != -1) + if distributed: + dist.init_process_group(backend='nccl', init_method='env://') + rank = dist.get_rank() + world_size = dist.get_world_size() + else: + rank = 0 + world_size = 1 + + if distributed: + torch.cuda.set_device(args.local_rank) + device = torch.device('cuda', args.local_rank) + else: + device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + + set_seed(args.seed + (rank if distributed else 0), deterministic=args.deterministic) + + save_dir = os.path.join('models', args.name) + if rank == 0: + os.makedirs(save_dir, exist_ok=True) + with open(os.path.join(save_dir, 'args.json'), 'w') as f: + json.dump(vars(args), f, indent=2) + if distributed: + dist.barrier() + + train_loader, val_loader, auto_num_classes, train_sampler = build_dataloaders(args, rank, world_size) + if args.num_classes is None: + args.num_classes = auto_num_classes + + # 使用本地 Model 优先(LocalModel 已在文件顶部尝试导入) + model = build_model_with_local_priority(args, device) + model.to(device) + + if distributed: + model = DDP(model, device_ids=[args.local_rank], output_device=args.local_rank, find_unused_parameters=True) + + criterion = nn.CrossEntropyLoss().to(device) + params = [p for p in model.parameters() if p.requires_grad] + if args.optimizer == 'sgd': + optimizer = optim.SGD(params, lr=args.lr, momentum=args.momentum, + weight_decay=args.weight_decay, nesterov=args.nesterov) + elif args.optimizer == 'adam': + optimizer = optim.Adam(params, lr=args.lr, weight_decay=args.weight_decay) + elif args.optimizer == 'adamw': + optimizer = optim.AdamW(params, lr=args.lr, weight_decay=args.weight_decay) + else: + raise ValueError('Unknown optimizer') + + scheduler = None + if args.scheduler == 'multistep': + scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=args.milestones, gamma=args.gamma) + elif args.scheduler == 'step': + scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=args.step_size, gamma=args.gamma) + elif args.scheduler == 'cosine': + scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=args.epochs) + elif args.scheduler == 'none': + scheduler = None + + scaler = amp.GradScaler() if args.amp else None + + start_epoch = args.start_epoch + best_acc = 0.0 + if args.resume: + if os.path.isfile(args.resume): + ckpt = torch.load(args.resume, map_location='cpu') + model_state = ckpt.get('state_dict', ckpt) + if isinstance(model, DDP): + model.module.load_state_dict(model_state) + else: + model.load_state_dict(model_state) + if 'optimizer' in ckpt: + optimizer.load_state_dict(ckpt['optimizer']) + start_epoch = ckpt.get('epoch', start_epoch) + best_acc = ckpt.get('best_acc', best_acc) + print(f"=> resumed from {args.resume}, start_epoch={start_epoch}") + else: + print(f"=> resume path {args.resume} not found") + + log_columns = ['epoch', 'lr', 'loss', 'acc1', 'acc5', 'val_loss', 'val_acc1', 'val_acc5'] + log_df = pd.DataFrame(columns=log_columns) + # step-level log + step_log_columns = ['epoch', 'batch_idx', 'global_step', 'lr', 'loss', 'loss_avg', 'acc1', 'acc1_avg', 'acc5', 'acc5_avg', 'time'] + step_log_df = pd.DataFrame(columns=step_log_columns) + + total_epochs = args.epochs + # global_step计数器(训练过程中跨epoch持续) + global_step = 0 + + epoch = start_epoch + # loop until either epoch criteria or step criteria met + while True: + if train_sampler is not None: + if args.seed_sampler: + train_sampler.set_epoch(epoch + args.seed) + else: + train_sampler.set_epoch(epoch) + + if rank == 0: + print(f"==== Epoch {epoch}/{total_epochs - 1} ====") + + # 如果传入了 args.steps (>0),则把剩余允许的 step 数传给 train_one_epoch, + # 否则 max_global_steps=None(按整 epoch 执行完) + if args.steps and args.steps > 0: + max_global_steps = args.steps + else: + max_global_steps = None + + train_log, step_logs, global_step = train_one_epoch( + args, epoch, model, criterion, optimizer, train_loader, device, scaler, + scheduler, train_sampler, global_step_start=global_step, max_global_steps=max_global_steps + ) + + # 如果启用了按 steps 的模式且已经达到上限,标记需要在做一次验证后退出 + if max_global_steps is not None and global_step >= max_global_steps: + if rank == 0: + print(f"[Main] 达到 max_global_steps={max_global_steps}(global_step={global_step}),将在完成验证后退出训练。") + # 我们不 return 立刻退出;后面的 validate / 保存逻辑会执行一次,然后 main 返回/结束 + end_due_to_steps = True + else: + end_due_to_steps = False + + # 验证并记录 epoch 级别日志(如果在 step 模式下很可能在中间某个 epoch 提前结束,但我们仍做一次 validate) + val_log = validate(args, model, val_loader, criterion, device, args.batch_size) + current_lr = optimizer.param_groups[0]['lr'] + + if rank == 0: + # epoch summary print, 格式与示例对齐 + print(f"Epoch[{epoch}]: epoch_train_loss {train_log['loss']:.4f} acc1 {train_log['acc1']:.2f} acc5 {train_log['acc5']:.2f} | " + f"val_loss {val_log['loss']:.4f} acc1 {val_log['acc1']:.2f} acc5 {val_log['acc5']:.2f} lr {current_lr:.6f}") + row = { + 'epoch': epoch, + 'lr': current_lr, + 'loss': train_log['loss'], + 'acc1': train_log['acc1'], + 'acc5': train_log['acc5'], + 'val_loss': val_log['loss'], + 'val_acc1': val_log['acc1'], + 'val_acc5': val_log['acc5'], + } + new_row_df = pd.DataFrame([row]) + log_df = pd.concat([log_df, new_row_df], ignore_index=True) + log_df.to_csv(os.path.join(save_dir, 'log.csv'), index=False) + + is_best = val_log['acc1'] > best_acc + if is_best: + best_acc = val_log['acc1'] + if (epoch % args.save_freq == 0) or is_best or ( (max_global_steps is None) and (epoch == total_epochs - 1) ) : + state = { + 'epoch': epoch, + 'state_dict': model.module.state_dict() if isinstance(model, DDP) else model.state_dict(), + 'best_acc': best_acc, + 'optimizer': optimizer.state_dict(), + 'args': vars(args) + } + save_checkpoint(state, is_best, save_dir, filename=f'checkpoint_epoch_{epoch}.pth') + + # 如果是因为 steps 模式达到上限,则在完成 validation / 保存后退出训练 + if end_due_to_steps: + if rank == 0: + print(f"[Main] 已在 steps 模式下完成最后一次验证并保存,训练结束(global_step={global_step})。") + break + + # increment epoch + epoch += 1 + + # stopping conditions: + # 1) if steps mode enabled and reached steps -> stop + if args.steps and args.steps > 0: + if global_step >= args.steps: + if rank == 0: + print(f"[Main] 已达到指定 steps={args.steps}(global_step={global_step}),训练结束。") + break + + # 2) if steps not used, stop when epoch >= epochs + else: + if epoch >= total_epochs: + if rank == 0: + print(f"[Main] 已达到指定 epochs={total_epochs}(epoch={epoch}),训练结束。") + break + + if dist.is_initialized(): + dist.barrier() + if rank == 0: + print("Training finished. Best val acc1: {:.2f}".format(best_acc)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/PyTorch/build-in/Classification/XCiT/xcit.py b/PyTorch/build-in/Classification/XCiT/xcit.py new file mode 100644 index 000000000..8098b5e99 --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/xcit.py @@ -0,0 +1,641 @@ +# Copyright (c) 2015-present, Facebook, Inc. +# All rights reserved. +""" +Implementation of Cross-Covariance Image Transformer (XCiT) +Based on timm and DeiT code bases +https://github.com/rwightman/pytorch-image-models/tree/master/timm +https://github.com/facebookresearch/deit/ +""" +import math + +import torch +import torch.nn as nn +from functools import partial + +# 屏蔽 warning +import warnings +warnings.filterwarnings("ignore", category=FutureWarning) + +# 注册模型 +from timm.models.registry import register_model +from timm.models.vision_transformer import _cfg, Mlp +from timm.models.layers import DropPath, trunc_normal_, to_2tuple + + +class PositionalEncodingFourier(nn.Module): + """ + Positional encoding relying on a fourier kernel matching the one used in the + "Attention is all of Need" paper. The implementation builds on DeTR code + https://github.com/facebookresearch/detr/blob/master/models/position_encoding.py + """ + + def __init__(self, hidden_dim=32, dim=768, temperature=10000): + super().__init__() + self.token_projection = nn.Conv2d(hidden_dim * 2, dim, kernel_size=1) + self.scale = 2 * math.pi + self.temperature = temperature + self.hidden_dim = hidden_dim + self.dim = dim + + def forward(self, B, H, W): + mask = torch.zeros(B, H, W).bool().to(self.token_projection.weight.device) + not_mask = ~mask + # y_embed = not_mask.cumsum(1, dtype=torch.float32) + # x_embed = not_mask.cumsum(2, dtype=torch.float32) + + device = not_mask.device # 保存原始设备 + + # 在 CPU 上计算累积和,保证 deterministic + y_embed = not_mask.to('cpu').cumsum(1, dtype=torch.float32).to(device) + x_embed = not_mask.to('cpu').cumsum(2, dtype=torch.float32).to(device) + + eps = 1e-6 + y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale + x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale + + dim_t = torch.arange(self.hidden_dim, dtype=torch.float32, device=mask.device) + dim_t = self.temperature ** (2 * (dim_t // 2) / self.hidden_dim) + + pos_x = x_embed[:, :, :, None] / dim_t + pos_y = y_embed[:, :, :, None] / dim_t + pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), + pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) + pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), + pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) + pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) + pos = self.token_projection(pos) + return pos + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return torch.nn.Sequential( + nn.Conv2d( + in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False + ), + # nn.SyncBatchNorm(out_planes) + nn.BatchNorm2d(out_planes) # ← 改成这个! + ) + + +class ConvPatchEmbed(nn.Module): + """ Image to Patch Embedding using multiple convolutional layers + """ + + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) + self.img_size = img_size + self.patch_size = patch_size + self.num_patches = num_patches + + if patch_size[0] == 16: + self.proj = torch.nn.Sequential( + conv3x3(3, embed_dim // 8, 2), + nn.GELU(), + conv3x3(embed_dim // 8, embed_dim // 4, 2), + nn.GELU(), + conv3x3(embed_dim // 4, embed_dim // 2, 2), + nn.GELU(), + conv3x3(embed_dim // 2, embed_dim, 2), + ) + elif patch_size[0] == 8: + self.proj = torch.nn.Sequential( + conv3x3(3, embed_dim // 4, 2), + nn.GELU(), + conv3x3(embed_dim // 4, embed_dim // 2, 2), + nn.GELU(), + conv3x3(embed_dim // 2, embed_dim, 2), + ) + elif patch_size[0] == 4: + # For CIFAR-32: produce 8x8 patches from 32x32 input using two stride-2 stages: + # 32 -> 16 -> 8 spatially. Use a compact two-stage conv stack. + self.proj = torch.nn.Sequential( + conv3x3(3, embed_dim // 4, 2), # 32 -> 16 + nn.GELU(), + conv3x3(embed_dim // 4, embed_dim, 2), # 16 -> 8, output embed_dim channels + ) + else: + raise("For convolutional projection, patch size has to be in [8, 16]") + + def forward(self, x, padding_size=None): + B, C, H, W = x.shape + x = self.proj(x) + Hp, Wp = x.shape[2], x.shape[3] + x = x.flatten(2).transpose(1, 2) + + return x, (Hp, Wp) + + +class LPI(nn.Module): + """ + Local Patch Interaction module that allows explicit communication between tokens in 3x3 windows + to augment the implicit communcation performed by the block diagonal scatter attention. + Implemented using 2 layers of separable 3x3 convolutions with GeLU and BatchNorm2d + """ + + def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, + drop=0., kernel_size=3): + super().__init__() + out_features = out_features or in_features + + padding = kernel_size // 2 + + self.conv1 = torch.nn.Conv2d(in_features, out_features, kernel_size=kernel_size, + padding=padding, groups=out_features) + self.act = act_layer() + # self.bn = nn.SyncBatchNorm(in_features) + self.bn = nn.BatchNorm2d(in_features) + self.conv2 = torch.nn.Conv2d(in_features, out_features, kernel_size=kernel_size, + padding=padding, groups=out_features) + + def forward(self, x, H, W): + B, N, C = x.shape + x = x.permute(0, 2, 1).contiguous().reshape(B, C, H, W) + x = self.conv1(x) + x = self.act(x) + x = self.bn(x) + x = self.conv2(x) + x = x.reshape(B, C, N).contiguous().permute(0, 2, 1) + + return x + + +class ClassAttention(nn.Module): + """Class Attention Layer as in CaiT https://arxiv.org/abs/2103.17239 + """ + + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim ** -0.5 + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads) + qkv = qkv.permute(2, 0, 3, 1, 4) + q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple) + + qc = q[:, :, 0:1] # CLS token + attn_cls = (qc * k).sum(dim=-1) * self.scale + attn_cls = attn_cls.softmax(dim=-1) + attn_cls = self.attn_drop(attn_cls) + + cls_tkn = (attn_cls.unsqueeze(2) @ v).transpose(1, 2).reshape(B, 1, C) + cls_tkn = self.proj(cls_tkn) + x = torch.cat([self.proj_drop(cls_tkn), x[:, 1:]], dim=1) + return x + + +class ClassAttentionBlock(nn.Module): + """Class Attention Layer as in CaiT https://arxiv.org/abs/2103.17239 + """ + + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., + attn_drop=0., drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, eta=None, + tokens_norm=False): + super().__init__() + self.norm1 = norm_layer(dim) + + self.attn = ClassAttention( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, + proj_drop=drop + ) + + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, + drop=drop) + + if eta is not None: # LayerScale Initialization (no layerscale when None) + self.gamma1 = nn.Parameter(eta * torch.ones(dim), requires_grad=True) + self.gamma2 = nn.Parameter(eta * torch.ones(dim), requires_grad=True) + else: + self.gamma1, self.gamma2 = 1.0, 1.0 + + # FIXME: A hack for models pre-trained with layernorm over all the tokens not just the CLS + self.tokens_norm = tokens_norm + + def forward(self, x, H, W, mask=None): + x = x + self.drop_path(self.gamma1 * self.attn(self.norm1(x))) + if self.tokens_norm: + x = self.norm2(x) + else: + # x[:, 0:1] = self.norm2(x[:, 0:1]) #welo + cls_norm = self.norm2(x[:, 0:1]) + x = torch.cat([cls_norm, x[:, 1:]], dim=1).contiguous() + + x_res = x + cls_token = x[:, 0:1] + cls_token = self.gamma2 * self.mlp(cls_token) + x = torch.cat([cls_token, x[:, 1:]], dim=1) + x = x_res + self.drop_path(x) + return x + + +class XCA(nn.Module): + """ Cross-Covariance Attention (XCA) operation where the channels are updated using a weighted + sum. The weights are obtained from the (softmax normalized) Cross-covariance + matrix (Q^T K \\in d_h \\times d_h) + """ + + def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.): + super().__init__() + self.num_heads = num_heads + self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1)) + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + self.proj_drop = nn.Dropout(proj_drop) + + def forward(self, x): + B, N, C = x.shape + qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads) + qkv = qkv.permute(2, 0, 3, 1, 4) + q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple) + + q = q.transpose(-2, -1) + k = k.transpose(-2, -1) + v = v.transpose(-2, -1) + + q = torch.nn.functional.normalize(q, dim=-1) + k = torch.nn.functional.normalize(k, dim=-1) + + attn = (q @ k.transpose(-2, -1)) * self.temperature + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).permute(0, 3, 1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + @torch.jit.ignore + def no_weight_decay(self): + return {'temperature'} + + +class XCABlock(nn.Module): + def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., + attn_drop=0., drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, + num_tokens=196, eta=None): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = XCA( + dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, + proj_drop=drop + ) + self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, + drop=drop) + + self.norm3 = norm_layer(dim) + self.local_mp = LPI(in_features=dim, act_layer=act_layer) + + self.gamma1 = nn.Parameter(eta * torch.ones(dim), requires_grad=True) + self.gamma2 = nn.Parameter(eta * torch.ones(dim), requires_grad=True) + self.gamma3 = nn.Parameter(eta * torch.ones(dim), requires_grad=True) + + def forward(self, x, H, W): + x = x + self.drop_path(self.gamma1 * self.attn(self.norm1(x))) + x = x + self.drop_path(self.gamma3 * self.local_mp(self.norm3(x), H, W)) + x = x + self.drop_path(self.gamma2 * self.mlp(self.norm2(x))) + return x + + +class XCiT(nn.Module): + """ + Based on timm and DeiT code bases + https://github.com/rwightman/pytorch-image-models/tree/master/timm + https://github.com/facebookresearch/deit/ + """ + + def __init__(self, img_size=224, patch_size=16, in_chans=3, num_classes=1000, embed_dim=768, + depth=12, num_heads=12, mlp_ratio=4., qkv_bias=True, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0., norm_layer=None, + cls_attn_layers=2, use_pos=True, patch_proj='linear', eta=None, tokens_norm=False): + """ + Args: + img_size (int, tuple): input image size + patch_size (int, tuple): patch size + in_chans (int): number of input channels + num_classes (int): number of classes for classification head + embed_dim (int): embedding dimension + depth (int): depth of transformer + num_heads (int): number of attention heads + mlp_ratio (int): ratio of mlp hidden dim to embedding dim + qkv_bias (bool): enable bias for qkv if True + qk_scale (float): override default qk scale of head_dim ** -0.5 if set + drop_rate (float): dropout rate + attn_drop_rate (float): attention dropout rate + drop_path_rate (float): stochastic depth rate + norm_layer: (nn.Module): normalization layer + cls_attn_layers: (int) Depth of Class attention layers + use_pos: (bool) whether to use positional encoding + eta: (float) layerscale initialization value + tokens_norm: (bool) Whether to normalize all tokens or just the cls_token in the CA + """ + super().__init__() + self.num_classes = num_classes + self.num_features = self.embed_dim = embed_dim + norm_layer = norm_layer or partial(nn.LayerNorm, eps=1e-6) + + self.patch_embed = ConvPatchEmbed(img_size=img_size, embed_dim=embed_dim, + patch_size=patch_size) + + num_patches = self.patch_embed.num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) + self.pos_drop = nn.Dropout(p=drop_rate) + + dpr = [drop_path_rate for i in range(depth)] + self.blocks = nn.ModuleList([ + XCABlock( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, + qk_scale=qk_scale, drop=drop_rate, attn_drop=attn_drop_rate, drop_path=dpr[i], + norm_layer=norm_layer, num_tokens=num_patches, eta=eta) + for i in range(depth)]) + + self.cls_attn_blocks = nn.ModuleList([ + ClassAttentionBlock( + dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, + qk_scale=qk_scale, drop=drop_rate, attn_drop=attn_drop_rate, norm_layer=norm_layer, + eta=eta, tokens_norm=tokens_norm) + for i in range(cls_attn_layers)]) + self.norm = norm_layer(embed_dim) + self.head = nn.Linear(self.num_features, num_classes) if num_classes > 0 else nn.Identity() + + self.pos_embeder = PositionalEncodingFourier(dim=embed_dim) + self.use_pos = use_pos + + # Classifier head + trunc_normal_(self.cls_token, std=.02) + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + @torch.jit.ignore + def no_weight_decay(self): + return {'pos_embed', 'cls_token', 'dist_token'} + + def forward_features(self, x): + B, C, H, W = x.shape + + x, (Hp, Wp) = self.patch_embed(x) + + if self.use_pos: + pos_encoding = self.pos_embeder(B, Hp, Wp).reshape(B, -1, x.shape[1]).permute(0, 2, 1) + x = x + pos_encoding + + x = self.pos_drop(x) + + for blk in self.blocks: + x = blk(x, Hp, Wp) + + cls_tokens = self.cls_token.expand(B, -1, -1) + x = torch.cat((cls_tokens, x), dim=1) + + for blk in self.cls_attn_blocks: + x = blk(x, Hp, Wp) + + x = self.norm(x)[:, 0] + return x + + def forward(self, x): + x = self.forward_features(x) + x = self.head(x) + + if self.training: + return x + else: + return x + + +# Patch size 16x16 models +@register_model +def xcit_nano_12_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=128, depth=12, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=False, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_tiny_12_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=192, depth=12, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_small_12_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=384, depth=12, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_tiny_24_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=192, depth=24, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_small_24_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=384, depth=24, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_medium_24_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=512, depth=24, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_large_24_p16(pretrained=False, **kwargs): + model = XCiT( + patch_size=16, embed_dim=768, depth=24, num_heads=16, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +# Patch size 8x8 models +@register_model +def xcit_nano_12_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=128, depth=12, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=False, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_tiny_12_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=192, depth=12, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_small_12_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=384, depth=12, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1.0, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_tiny_24_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=192, depth=24, num_heads=4, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_small_24_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=384, depth=24, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_medium_24_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=512, depth=24, num_heads=8, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +@register_model +def xcit_large_24_p8(pretrained=False, **kwargs): + model = XCiT( + patch_size=8, embed_dim=768, depth=24, num_heads=16, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(nn.LayerNorm, eps=1e-6), eta=1e-5, tokens_norm=True, **kwargs) + model.default_cfg = _cfg() + return model + + +# welo add +# --- helper to ensure divisible dims (add this near the top of xcit.py, after imports) --- +def ensure_divisible(value, divisor): + """Return the smallest integer >= value that is divisible by divisor.""" + if divisor <= 0: + raise ValueError("divisor must be > 0") + return int((int(value) + divisor - 1) // divisor) * divisor + +# --- 注册用于 CIFAR-32 的 XCiT 变体 --- +@register_model +def xcit_cifar32_patch4(pretrained=False, num_classes=10, *, # 默认 CIFAR-10 的 num_classes=10,可传 100 用于 CIFAR-100 + img_size=32, patch_size=4, + embed_dim=128, depth=6, num_heads=4, + mlp_ratio=2., qkv_bias=True, qk_scale=None, + drop_rate=0., attn_drop_rate=0., drop_path_rate=0.0, + cls_attn_layers=1, use_pos=True, eta=1e-5, tokens_norm=False, + **kwargs): + """ + XCiT variant for CIFAR-32. + - Default: patch_size=4 -> (32/4)^2 = 8x8 = 64 patches + - Lightweight: smaller embed_dim and depth suitable for CIFAR datasets. + - If you want CIFAR-100, call with num_classes=100. + """ + # basic sanity checks and adjustments + if img_size % patch_size != 0: + raise ValueError(f"img_size ({img_size}) must be divisible by patch_size ({patch_size}).") + if patch_size not in (4, 8, 16): + raise ValueError("xcit_cifar32_patch4 supports patch_size 4, 8 or 16 (for CIFAR/ImageNet use).") + + # ensure embed_dim divisible by num_heads + embed_dim = ensure_divisible(embed_dim, num_heads) + + # Create model with lightweight defaults + model = XCiT( + img_size=img_size, + patch_size=patch_size, + in_chans=3, + num_classes=num_classes, + embed_dim=embed_dim, + depth=depth, + num_heads=num_heads, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=drop_path_rate, + norm_layer=partial(nn.LayerNorm, eps=1e-6), + cls_attn_layers=cls_attn_layers, + use_pos=use_pos, + eta=eta, + tokens_norm=tokens_norm, + patch_proj='conv', # informational + **kwargs + ) + + # Use the (updated) ConvPatchEmbed implementation (supports patch_size 4/8/16) + model.patch_embed = ConvPatchEmbed(img_size=img_size, patch_size=patch_size, in_chans=3, embed_dim=embed_dim) + + # default cfg suitable for CIFAR datasets + model.default_cfg = _cfg( + url='', + input_size=(3, img_size, img_size), + num_classes=num_classes, + mean=(0.4914, 0.4822, 0.4465), + std=(0.2470, 0.2435, 0.2616), + crop_pct=1.0, + interpolation='bicubic' + ) + + if pretrained: + raise NotImplementedError("Pretrained weights not available for CIFAR XCiT variant") + + return model + + +# convenience factory expected by your external code: Model(100) -> CIFAR-100 XCiT +def Model(num_classes): + r"""Return XCiT model customized for CIFAR. Usage: Model(100) for CIFAR-100.""" + return xcit_cifar32_patch4(pretrained=False, num_classes=num_classes) \ No newline at end of file diff --git a/PyTorch/build-in/Classification/XCiT/xcit_loss.jpg b/PyTorch/build-in/Classification/XCiT/xcit_loss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9d49db953771152e5773dd3b71aef249422b06c GIT binary patch literal 32499 zcmeHw2UrwY)^?FZKtQ5o6p)-GXHX=GZmM(M^PcxsUyWVO0yiH?%Si)BNJxMg;vaA| z0Z0PZuU$jGhISnt9UTMXI_3>R>>F5EH%Rdba0w~NsHrH)C@5~zu`}GJVWp*@VB}|F z<-Etk!$Zv=C@R1u!p_aZ^{o&j3=E7LST{(pu}Qe@P~74Ar~j^+0le$T+Nd8;kZ1s8 zJR}r6q^mZ78UT>c5VieQ;XnT&A)}z8T|>W)fr*9qLd8u083_di85IQ$4HXsfZEwWq z04g3D{+)aGuMwyiqtiGLa=na7zfSw0w1r4@V3&^D#L*7}llT@1DcN0m21X`k9$r3v z0YM?jhf>lqvT~2q)HO7QI) z#Ei_W?3~=Z{DQJ_NJV8;bxrNZ*0%PJ&aUoHgV3SjkJQO@Y z95^{+%<#qhWBa2I{+I**XXb!F>gz_1VG-JEvFr&}_D;udCiUqG+D_%jWzRWfdMXsT zQ?u{yp?AjnkV6l@ItvurW!KTTS^0CZRjSB`Wl_Y%af;;>!3KHa+kG&@rEWyzJub>J zyJ?%%1!mCO&B;x7CooFVj24uthCm^M#nEi|YdUg=rZxAkfal8Sxf?0${q=$(%GU88 znU*AJ+M+~CKDe0VVPI{$=d;(VrGH($w-IBljLoOqsJ|}%hTj?UnmobkHJg}J?GL;0 zZ4HiBKpXyL+=NPbC9#$xEg_BQ-24rsR-@WIMXIz*)!~|y4`ih~MVwV_0;AWdiC~@WE3IwiQ!q10v}V;1k$^1a zPl{aJ0aNhq!vbBwK^Hwybh*a8oC5aZoJy9=hEO>=0%BNLL7vR#T{k zIqd7@=ab|Us#;7v2sPIr*unj@QIT9ePZ{1H741-1PqXfB$L4S7I-jvv9Y>xPqO}(l zGc}W<#YqUQR6UCS2-+8b&A>n21g-I??*tp|KNgX^0t{_0+JXDGLZ0^9!#~e&nLZ*= zuw!SN{ZN{05bp{dPIc&}W?ac%Ws$xDIvdHLl=uhA?jaAOQxC1Qr9-)}BC{CKVWm1W zjEk`DT;a5*5v|c&_+o1Z{boL>5gnx$^7F!#dsJ1~hA_Vs*>FOs(hn7-a%N4Mq4<(Q ze4C{#0Uh^x0N0bVP|$=JwYEz@AWP@l?An%Pto}Ps0r6d=u+yDTw*r1@ym|&32Oa|J z^$650d;V=R8V1cVx8!P-YP{-MisuRr)8tRRa9;(yVfg&sX_bu*IT!jQ1Wq*C=ClMh z8{+l5@Sf*KO6^iccVpWYF|vBfYmgyNY7Xx^7ke=&gv`-bECbP7+kHMX=WU{TwFcLltO&%MTAwZOFScxWl#}l!e=4L|$?uth`gA_J^Ni zt1B#=b%V0g-DYEkmL|gl&wWR8vWg9!PGAi S2s64lh({Mg1 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 Date: Wed, 7 Jan 2026 06:31:57 +0000 Subject: [PATCH 2/3] fix: cleanup code and update --- .../build-in/Classification/XCiT/coverage.txt | 3 - PyTorch/build-in/Classification/XCiT/loss.jpg | Bin 35974 -> 0 bytes PyTorch/build-in/Classification/XCiT/loss.py | 95 ------------------ PyTorch/build-in/Classification/XCiT/readme | 65 ++++++++++++ .../XCiT/requirements_exact.txt | 89 ++++++++++++++++ PyTorch/build-in/Classification/XCiT/run | 1 - .../Classification/XCiT/xcit_loss.jpg | Bin 32499 -> 0 bytes .../Classification/XCiT/xcit_loss.txt | 29 ------ 8 files changed, 154 insertions(+), 128 deletions(-) delete mode 100644 PyTorch/build-in/Classification/XCiT/coverage.txt delete mode 100644 PyTorch/build-in/Classification/XCiT/loss.jpg delete mode 100644 PyTorch/build-in/Classification/XCiT/loss.py create mode 100644 PyTorch/build-in/Classification/XCiT/readme create mode 100644 PyTorch/build-in/Classification/XCiT/requirements_exact.txt delete mode 100644 PyTorch/build-in/Classification/XCiT/run delete mode 100644 PyTorch/build-in/Classification/XCiT/xcit_loss.jpg delete mode 100644 PyTorch/build-in/Classification/XCiT/xcit_loss.txt diff --git a/PyTorch/build-in/Classification/XCiT/coverage.txt b/PyTorch/build-in/Classification/XCiT/coverage.txt deleted file mode 100644 index 5201a2558..000000000 --- a/PyTorch/build-in/Classification/XCiT/coverage.txt +++ /dev/null @@ -1,3 +0,0 @@ -all api: ['_amp_foreach_non_finite_check_and_unscale_', '_amp_update_scale_', '_copy_from', '_has_compatible_shallow_copy_type', '_local_scalar_dense', '_log_softmax', '_log_softmax_backward_data', '_pin_memory', '_reshape_alias', '_softmax', '_softmax_backward_data', 'add', 'add_', 'addmm', 'arange_out', 'as_strided', 'bitwise_not', 'bmm', 'bmm_backward', 'bmm_forward', 'cat', 'clamp_min_out', 'contiguous', 'convolution', 'convolution_backward', 'copy_stride', 'cos', 'div', 'dropout', 'eq', 'fill_', 'floor_divide', 'fused_sgd', 'ge', 'gelu', 'gelu_backward', 'is_pinned', 'linalg_vector_norm_out', 'linear', 'masked_fill_', 'matmul', 'mm', 'mul', 'mul_', 'native_batch_norm', 'native_batch_norm_backward', 'native_layer_norm', 'native_layer_norm_backward', 'neg', 'nll_loss_backward', 'nll_loss_forward', 'pow', 'reciprocal', 'set_', 'sin', 'slice_backward', 'sum', 'topk_out', 'view', 'where', 'zero_'], total: 61 -fallback op: ['_softmax'], total: 1 -coverage rate: 98.36% diff --git a/PyTorch/build-in/Classification/XCiT/loss.jpg b/PyTorch/build-in/Classification/XCiT/loss.jpg deleted file mode 100644 index 76b462aa0071a238f1138303ea9aef21294140d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35974 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: break - print(loss_arr) - return loss_arr - - -def plot_loss(sdaa_loss,a100_loss): - fig, ax = plt.subplots(figsize=(12, 6)) - - smoothed_losses = savgol_filter(sdaa_loss, 20, 1) - x = list(range(len(sdaa_loss))) - ax.plot(x, smoothed_losses, label="sdaa_loss") - - smoothed_losses = savgol_filter(a100_loss, 20, 1) - x = list(range(len(a100_loss))) - ax.plot(x, smoothed_losses, "--", label="cuda_loss") - - ax.set_xlabel("Iteration") - ax.set_ylabel("Loss") - ax.set_title("Model Training Loss Curves (Smoothed)") - ax.legend() - plt.savefig("loss.jpg") - -if __name__=="__main__": - from argparse import ArgumentParser,ArgumentTypeError - parser = ArgumentParser(description='modelzoo') - parser.add_argument('--sdaa-log', type=str,default="sdaa_nohup.out_1core_100step") - parser.add_argument('--cuda-log', type=str,default="cuda_nohup.out_1card") - args=parser.parse_args() - - sdaa_log = args.sdaa_log - with open(sdaa_log, 'r') as f: - s = f.read() - sdaa_res = parse_string(s) - - a100_log = args.cuda_log - with open(a100_log, 'r') as f: - s = f.read() - a100_res = parse_string(s) - length=min(len(a100_res),len(sdaa_res)) - sdaa_loss = parse_loss(sdaa_res[:length]) - a100_loss = parse_loss(a100_res[:length]) - compare_loss(a100_loss, sdaa_loss) # 比较loss - plot_loss(sdaa_loss,a100_loss) # 对比loss曲线图 \ No newline at end of file diff --git a/PyTorch/build-in/Classification/XCiT/readme b/PyTorch/build-in/Classification/XCiT/readme new file mode 100644 index 000000000..e193b9aad --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/readme @@ -0,0 +1,65 @@ +```markdown +## 1. 模型链接 +- 原始仓库链接: +https://github.com/huggingface/pytorch-image-models?tab=readme-ov-file#models + +## 2. 快速开始 + +使用本模型执行训练的主要流程如下: + +1. **基础环境安装**:介绍训练前需要完成的基础环境检查和安装。 +2. **获取数据集**:介绍如何获取训练所需的数据集。 +3. **构建环境**:介绍如何构建模型运行所需要的环境。 +4. **启动训练**:介绍如何运行训练。 + +### 2.1 基础环境安装 + +请参考主仓库的基础环境安装章节,完成训练前的基础环境检查和安装(如驱动、固件等)。 + +### 2.2 准备数据集 + +#### 2.2.1 获取数据集 + +训练使用 **CIFAR-100** 数据集。该数据集为开源数据集,包含 100 个类别的 60000 张彩色图像。 + +#### 2.2.2 处理数据集 + +请确保数据集已下载并解压。根据训练脚本的默认配置,建议将数据集存放在模型目录的上级 `data` 目录中(即 `../data`),或者根据实际路径修改训练命令中的 `--datapath` 参数。 + +### 2.3 构建环境 + +所使用的环境下需包含 PyTorch 框架虚拟环境。 + +1. 执行以下命令,启动虚拟环境(根据实际环境名称修改): + + ```bash + conda activate torch_env_py310 + +``` + +2. 安装 Python 依赖。确保已安装项目所需的依赖包: +```bash +pip install -r requirements_exact.txt + +``` + + + +### 2.4 启动训练 + +1. 在构建好的环境中,进入模型训练脚本所在目录。 + +2. 运行训练。该模型支持单机单卡训练。 +执行以下命令启动训练(使用 CIFAR-100 数据集,Batch Size 为 128): +```bash +python weloTrainStep.py \ + --name train \ + --arch xcit \ + --print_freq 1 \ + --steps 100 \ + --dataset cifar100 \ + --datapath ../data \ + --batch_size 32 \ + --epochs 100 + +``` diff --git a/PyTorch/build-in/Classification/XCiT/requirements_exact.txt b/PyTorch/build-in/Classification/XCiT/requirements_exact.txt new file mode 100644 index 000000000..7394b3319 --- /dev/null +++ b/PyTorch/build-in/Classification/XCiT/requirements_exact.txt @@ -0,0 +1,89 @@ +addict==2.4.0 +aliyun-python-sdk-core==2.16.0 +aliyun-python-sdk-kms==2.16.5 +anyio==4.11.0 +astunparse==1.6.3 +certifi==2024.12.14 +cffi==2.0.0 +charset-normalizer==3.4.1 +click==8.3.1 +colorama==0.4.6 +contourpy==1.3.2 +crcmod==1.7 +cryptography==46.0.3 +cycler==0.12.1 +einops==0.8.1 +exceptiongroup==1.3.1 +filelock==3.14.0 +fonttools==4.60.1 +fsspec==2024.12.0 +future @ file:///croot/future_1730902796226/work +git-filter-repo==2.47.0 +h11==0.16.0 +hf-xet==1.2.0 +httpcore==1.0.9 +httpx==0.28.1 +huggingface_hub==1.1.5 +idna==3.10 +inplace-abn @ git+https://github.com/mapillary/inplace_abn.git@b50bfe9c7cd7116a3ab091a352b48d6ba5ee701c +Jinja2==3.1.5 +jmespath==0.10.0 +joblib==1.5.2 +kiwisolver==1.4.9 +Markdown==3.10 +markdown-it-py==4.0.0 +MarkupSafe==3.0.2 +matplotlib==3.10.7 +mdurl==0.1.2 +mmdet==3.3.0 +mmengine==0.10.7 +model-index==0.1.11 +mpmath==1.3.0 +networkx==3.4.2 +numpy==1.23.5 +opencv-python==4.12.0.88 +opendatalab==0.0.10 +openmim==0.3.9 +openxlab==0.1.3 +ordered-set==4.1.0 +oss2==2.17.0 +packaging @ file:///croot/packaging_1734472117206/work +pandas==2.3.3 +pillow==11.1.0 +platformdirs==4.5.1 +pycocotools==2.0.11 +pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work +pycryptodome==3.23.0 +Pygments==2.19.2 +pyparsing==3.2.5 +python-dateutil==2.9.0.post0 +pytz==2023.4 +PyYAML @ file:///croot/pyyaml_1728657952215/work +requests==2.28.2 +rich==13.4.2 +safetensors==0.7.0 +scikit-learn==1.7.2 +scipy==1.15.3 +shapely==2.1.2 +shellingham==1.5.4 +six @ file:///tmp/build/80754af9/six_1644875935023/work +sniffio==1.3.1 +sympy==1.13.3 +tabulate==0.9.0 +termcolor==3.2.0 +terminaltables==3.1.10 +threadpoolctl==3.6.0 +timm==1.0.22 +tomli==2.3.0 +torch @ file:///apps/torch-2.4.0a0%2Bgit4451b0e-cp310-cp310-linux_x86_64.whl#sha256=2e472c916044cac5a1a0e0d8b0e12bb943d8522b24ff826c8014dd444dccd378 +torch_sdaa @ file:///apps/torch_sdaa-2.0.0-cp310-cp310-linux_x86_64.whl#sha256=5aa57889b002e1231fbf806642e1353bfa016297bc25178396e89adc2b1f92e7 +torchaudio @ file:///apps/torchaudio-2.0.2%2Bda3eb8d-cp310-cp310-linux_x86_64.whl#sha256=46525c02fb7eaa8dafea860428de3d01e437ba8d6ff2cc228d7c71975ac4054b +torchdata @ file:///apps/torchdata-0.6.1%2Be1feeb2-py3-none-any.whl#sha256=aa2dc1a7732ea68adfad186978049bf68cc1afdbbdd1e17a8024227ab770e433 +torchtext @ file:///apps/torchtext-0.15.2a0%2B4571036-cp310-cp310-linux_x86_64.whl#sha256=7e42c684ba366f97b59ec37488bf95e416cce3892b6589200d2b3ad159ee5788 +torchvision @ file:///apps/torchvision-0.15.1a0%2B42759b1-cp310-cp310-linux_x86_64.whl#sha256=4b904db2d50102415536bc764bbc31c669b90b1b014f90964e9eccaadb2fd9eb +tqdm==4.65.2 +typer-slim==0.20.0 +typing_extensions==4.15.0 +tzdata==2025.2 +urllib3==1.26.20 +yapf==0.43.0 diff --git a/PyTorch/build-in/Classification/XCiT/run b/PyTorch/build-in/Classification/XCiT/run deleted file mode 100644 index 2e83eab02..000000000 --- a/PyTorch/build-in/Classification/XCiT/run +++ /dev/null @@ -1 +0,0 @@ -bash ../sdaaTest.sh diff --git a/PyTorch/build-in/Classification/XCiT/xcit_loss.jpg b/PyTorch/build-in/Classification/XCiT/xcit_loss.jpg deleted file mode 100644 index d9d49db953771152e5773dd3b71aef249422b06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32499 zcmeHw2UrwY)^?FZKtQ5o6p)-GXHX=GZmM(M^PcxsUyWVO0yiH?%Si)BNJxMg;vaA| z0Z0PZuU$jGhISnt9UTMXI_3>R>>F5EH%Rdba0w~NsHrH)C@5~zu`}GJVWp*@VB}|F z<-Etk!$Zv=C@R1u!p_aZ^{o&j3=E7LST{(pu}Qe@P~74Ar~j^+0le$T+Nd8;kZ1s8 zJR}r6q^mZ78UT>c5VieQ;XnT&A)}z8T|>W)fr*9qLd8u083_di85IQ$4HXsfZEwWq z04g3D{+)aGuMwyiqtiGLa=na7zfSw0w1r4@V3&^D#L*7}llT@1DcN0m21X`k9$r3v z0YM?jhf>lqvT~2q)HO7QI) z#Ei_W?3~=Z{DQJ_NJV8;bxrNZ*0%PJ&aUoHgV3SjkJQO@Y z95^{+%<#qhWBa2I{+I**XXb!F>gz_1VG-JEvFr&}_D;udCiUqG+D_%jWzRWfdMXsT zQ?u{yp?AjnkV6l@ItvurW!KTTS^0CZRjSB`Wl_Y%af;;>!3KHa+kG&@rEWyzJub>J zyJ?%%1!mCO&B;x7CooFVj24uthCm^M#nEi|YdUg=rZxAkfal8Sxf?0${q=$(%GU88 znU*AJ+M+~CKDe0VVPI{$=d;(VrGH($w-IBljLoOqsJ|}%hTj?UnmobkHJg}J?GL;0 zZ4HiBKpXyL+=NPbC9#$xEg_BQ-24rsR-@WIMXIz*)!~|y4`ih~MVwV_0;AWdiC~@WE3IwiQ!q10v}V;1k$^1a zPl{aJ0aNhq!vbBwK^Hwybh*a8oC5aZoJy9=hEO>=0%BNLL7vR#T{k zIqd7@=ab|Us#;7v2sPIr*unj@QIT9ePZ{1H741-1PqXfB$L4S7I-jvv9Y>xPqO}(l zGc}W<#YqUQR6UCS2-+8b&A>n21g-I??*tp|KNgX^0t{_0+JXDGLZ0^9!#~e&nLZ*= zuw!SN{ZN{05bp{dPIc&}W?ac%Ws$xDIvdHLl=uhA?jaAOQxC1Qr9-)}BC{CKVWm1W zjEk`DT;a5*5v|c&_+o1Z{boL>5gnx$^7F!#dsJ1~hA_Vs*>FOs(hn7-a%N4Mq4<(Q ze4C{#0Uh^x0N0bVP|$=JwYEz@AWP@l?An%Pto}Ps0r6d=u+yDTw*r1@ym|&32Oa|J z^$650d;V=R8V1cVx8!P-YP{-MisuRr)8tRRa9;(yVfg&sX_bu*IT!jQ1Wq*C=ClMh z8{+l5@Sf*KO6^iccVpWYF|vBfYmgyNY7Xx^7ke=&gv`-bECbP7+kHMX=WU{TwFcLltO&%MTAwZOFScxWl#}l!e=4L|$?uth`gA_J^Ni zt1B#=b%V0g-DYEkmL|gl&wWR8vWg9!PGAi S2s64lh({Mg1 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 Date: Thu, 8 Jan 2026 10:30:09 +0000 Subject: [PATCH 3/3] fix: rename files and update code --- PyTorch/build-in/Classification/XCiT/{readme => readme.md} | 0 .../XCiT/{requirements_exact.txt => requirements.txt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename PyTorch/build-in/Classification/XCiT/{readme => readme.md} (100%) rename PyTorch/build-in/Classification/XCiT/{requirements_exact.txt => requirements.txt} (100%) diff --git a/PyTorch/build-in/Classification/XCiT/readme b/PyTorch/build-in/Classification/XCiT/readme.md similarity index 100% rename from PyTorch/build-in/Classification/XCiT/readme rename to PyTorch/build-in/Classification/XCiT/readme.md diff --git a/PyTorch/build-in/Classification/XCiT/requirements_exact.txt b/PyTorch/build-in/Classification/XCiT/requirements.txt similarity index 100% rename from PyTorch/build-in/Classification/XCiT/requirements_exact.txt rename to PyTorch/build-in/Classification/XCiT/requirements.txt