首页 > 其他分享 >gigapath部署以及微调全过程

gigapath部署以及微调全过程

时间:2024-11-09 23:08:27浏览次数:1  
标签:embeds 微调 gigapath encoder slide 全过程 Gigapath tile

0.0

什么是gigapath

gigapath是一个由微软开发的数字病理学全玻片基础模型,用于从高分辨率图像(如病理切片图像)中提取和处理信息的深度学习模型架构。

图中分为abc三个部分

a

首先输入一张高清的病理图像,我们将它拆分成256*256的图像切片,从而可以逐块处理。

每个图像块会被输入到一个基于Vision Transformer(ViT)的编码器中,提取图像块级别的特征,得到图像块的嵌入表示。

图像块级别的CLS token(分类标记)用于表征整个图像块的全局信息

Slide-Level Encoder (LongNet):随后将这些图像块的嵌入表示传递到一个基于 LongNet(长序列处理网络)的 Slide-Level Encoder 中,该编码器采用 Dilated Attention(膨胀注意力机制)来捕捉不同图像块之间的长距离依赖关系,生成整个病理切片图像的嵌入表示。

b

Vision Transformer (Teacher Model):在教师模型中,图像块被分为多个“全局切片”(Global crops),用于生成准确的嵌入表示。

Vision Transformer (Student Model):学生模型接收局部切片(Local crops)和带掩码的全局切片。学生模型和教师模型通过对比学习(Contrastive Loss)进行对齐,确保学生模型在带掩码的输入下也能生成类似的特征。

c

LongNet-based Decoder:该部分显示了输入嵌入和目标嵌入的匹配过程,通过重构损失来指导解码器学习生成目标嵌入。

Reconstruction Loss(重构损失):通过计算生成嵌入与目标嵌入之间的重构损失,优化模型的生成效果。

最后得到嵌入表示的向量,成功将高维、复杂的数据(例如图像、文本、音频等)转换为低维向量,可以作为其他任务(如分类、聚类、检索等)的输入特征。这种特征是由模型学到的,因此具有通用性,能够适应多种任务需求。

0.1

模型部署

首先从/home/data/hf/Gigapath,将这里面的文件cp到本地

打开终端

命令

cp -a /home/data/hf/Gigapath .

然后根据Prov-GigaPath/Prov-GigaPath ·拥抱脸里面的教程

利用里面的environment.yaml创建我们的gigapath虚拟环境

 cd Gigapath/prov-gigapath_github

conda env create -f environment.yaml
conda activate gigapath
pip install -e .

接着我们把cuda设置进环境变量里面

export CUDA_HOME=/usr/local/cuda/ export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH   我们新建一个python文件,命名为test_gigapath.py, 放在Gigapath/prov-gigapath_github目录下 test_gigapath.py代码如下  
import os
import torch
import timm
import numpy as np
import gigapath.slide_encoder as slide_encoder
from gigapath.pipeline import run_inference_with_tile_encoder, run_inference_with_slide_encoder

print("................")

# 解压后输入图片所在目录
slide_dir = "/public/liujx/Gigapath/PANDA/PANDA_sample_tiles/054b6888604d963455bfff551518ece5"
image_paths = [os.path.join(slide_dir, img) for img in os.listdir(slide_dir) if img.endswith('.png')]
print(f"Found {len(image_paths)} image tiles")

# 加载 tile_encoder 模型
model_arch = "vit_giant_patch14_dinov2"
model_path = "/home/data/hf/Gigapath/prov-gigapath_hf/pytorch_model.bin"
tile_encoder = timm.create_model(model_arch,
                                 pretrained=True,
                                 img_size=224,
                                 in_chans=3,
                                 pretrained_cfg_overlay=dict(file=model_path))
  
# 打印参数数量
print("tile_encoder param #", sum(p.numel() for p in tile_encoder.parameters()))

# 加载 slide_encoder 模型
slide_encoder_model = slide_encoder.create_model(
    pretrained="/public/liujx/Gigapath/prov-gigapath_hf/slide_encoder.pth",
    model_arch="gigapath_slide_enc12l768d",
    in_chans=1536,
)
print("slide_encoder param #", sum(p.numel() for p in slide_encoder_model.parameters()))

# 运行 tile_encoder 推理
tile_encoder_outputs = run_inference_with_tile_encoder(image_paths, tile_encoder)

# 打印 tile_encoder 输出形状
for k in tile_encoder_outputs.keys():
    print(f"tile_encoder_outs[{k}].shape: {tile_encoder_outputs[k].shape}")

# 运行 slide_encoder 推理
slide_embeds = run_inference_with_slide_encoder(
    slide_encoder_model=slide_encoder_model,
    **tile_encoder_outputs
)
print(slide_embeds.keys())

# 保存 slide_embeds 输出到 PyTorch .pt 文件
save_dir = "/public/liujx/Gigapath/prov-gigapath_github"
os.makedirs(save_dir, exist_ok=True)

# 保存 slide_embeds 为 .pt 文件格式
slide_embeds_path = os.path.join(save_dir, "slide_embeds.pt")
torch.save(slide_embeds, slide_embeds_path)
print(f"slide_embeds saved to {slide_embeds_path}")

 

然后我们打开存放sample_tiles.zip的文件夹,在GIgapath/PANDA目录下,将这个zip包解压 命令如下 unzip sample_tiles.zip 复制这个路径,修改为以上代码中解压后输入图片所在目录 然后将29行的pretrained改成 /public/(你的用户名)/Gigapath/prov-gigapath_hf/slide_encoder.pth 50行save_dir改成 /public/(你的用户名)/Gigapath/prov-gigapath_github 然后新建一个文件,命名为run_gigapath.pbs 代码如下
#!/bin/bash
#PBS -N test
#PBS -o test_$PBS_JOBID.log
#PBS -e test_$PBS_JOBID.err
#PBS -l nodes=1:ppn=12
#PBS -q gpu
cd $PBS_O_WORKDIR


module add gcc/11.2.0
source /home/data/software/python/3.12.7/gigapath/bin/activate

echo "test"
python3 test_gigapath.py

接着由于原有的项目代码有bug,我们需要进行修改

vim /public/liujx/Gigapath/prov-gigapath_github/gigapath/torchscale/model/../../torchscale/architecture/config.py

输入i修改,在这个文件的第一行加入

import numpy as np

然后按Esc,再输入   :wq   保存

保存后回到刚刚你项目的地址,cd到你项目下

输入

qsub run_gigapath.pbs 就会输出一个作业号,然后等待大约3分钟训练,就会输出一个名为 slide_embeds.pt 的文件以及对应的err 和 log文件 如果err文件输出如下
/home/data/software/python/3.12.7/gigapath/lib/python3.12/site-packages/timm/models/registry.py:4: FutureWarning: Importing from timm.models.registry is deprecated, please import via timm.models
  warnings.warn(f"Importing from {__name__} is deprecated, please import via timm.models", FutureWarning)
/home/data/software/python/3.12.7/gigapath/lib/python3.12/site-packages/timm/models/layers/__init__.py:48: FutureWarning: Importing from timm.models.layers is deprecated, please import via timm.layers
  warnings.warn(f"Importing from {__name__} is deprecated, please import via timm.layers", FutureWarning)
/public/liujx/Gigapath/prov-gigapath_github/gigapath/slide_encoder.py:236: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  state_dict = torch.load(local_path, map_location="cpu")["model"]
/public/liujx/Gigapath/prov-gigapath_github/gigapath/pipeline.py:102: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.
  with torch.cuda.amp.autocast(dtype=torch.float16):

Running inference with tile encoder:   0%|          | 0/7 [00:00<?, ?it/s]
Running inference with tile encoder:  14%|█▍        | 1/7 [00:17<01:47, 17.90s/it]
Running inference with tile encoder:  29%|██▊       | 2/7 [00:35<01:29, 17.83s/it]
Running inference with tile encoder:  43%|████▎     | 3/7 [00:56<01:16, 19.09s/it]
Running inference with tile encoder:  57%|█████▋    | 4/7 [01:16<00:58, 19.58s/it]
Running inference with tile encoder:  71%|███████▏  | 5/7 [01:33<00:37, 18.56s/it]
Running inference with tile encoder:  86%|████████▌ | 6/7 [01:47<00:17, 17.14s/it]
Running inference with tile encoder: 100%|██████████| 7/7 [01:54<00:00, 13.70s/it]
Running inference with tile encoder: 100%|██████████| 7/7 [01:54<00:00, 16.34s/it]
/public/liujx/Gigapath/prov-gigapath_github/gigapath/pipeline.py:130: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.
  with torch.cuda.amp.autocast(dtype=torch.float16):

并且log文件如下

test
................
Found 810 image tiles
tile_encoder param # 1134769664
dilated_ratio:  [1, 2, 4, 8, 16]
segment_length:  [np.int64(1024), np.int64(5792), np.int64(32768), np.int64(185363), np.int64(1048576)]
Number of trainable LongNet parameters:  85148160
Global Pooling: False
 Successfully Loaded Pretrained GigaPath model from /public/liujx/Gigapath/prov-gigapath_hf/slide_encoder.pth 
slide_encoder param # 86330880
tile_encoder_outs[tile_embeds].shape: torch.Size([810, 1536])
tile_encoder_outs[coords].shape: torch.Size([810, 2])
dict_keys(['layer_0_embed', 'layer_1_embed', 'layer_2_embed', 'layer_3_embed', 'layer_4_embed', 'layer_5_embed', 'layer_6_embed', 'layer_7_embed', 'layer_8_embed', 'layer_9_embed', 'layer_10_embed', 'layer_11_embed', 'layer_12_embed', 'last_layer_embed'])
slide_embeds saved to /public/liujx/Gigapath/prov-gigapath_github/slide_embeds.pt

说明你已经成功加载号预训练的模型,并且成功运行起来了

这时你的文件目录下会多出一个slide_embeds.pt的文件,这是一个pytorch模式下的张量文件,我们可以通过一下代码打开并查看这个文件

 

import torch
import pandas as pd

# 加载 .pt 文件
slide_embeds_path = "/public/liujx/Gigapath/prov-gigapath_github/slide_embeds.pt"
slide_embeds = torch.load(slide_embeds_path)

# 创建一个空的 DataFrame 来存储结果
data_dict = {}

# 将每个层的嵌入转换为展平的一维数组,并添加到字典中
for key, tensor in slide_embeds.items():
    # 如果是二维张量,展平为一维
    flattened_tensor = tensor.cpu().numpy().flatten()
    data_dict[key] = flattened_tensor

# 将字典转换为 DataFrame
df = pd.DataFrame(data_dict)

# 保存 DataFrame 为 CSV 文件
csv_file_path = "/public/liujx/Gigapath/prov-gigapath_github/slide_embeds.csv"
df.to_csv(csv_file_path, index=False)

# 打印 CSV 文件路径
print(f"CSV file saved at {csv_file_path}")

将这段代码保存在.pt文件所在的目录下,运行,可以将这个.pt文件转换为更为直观,可以通过本地excel直接打开的csv文件。

接着我们进行微调,

标签:embeds,微调,gigapath,encoder,slide,全过程,Gigapath,tile
From: https://www.cnblogs.com/liujunxi/p/18537446

相关文章

  • 函数的栈帧空间创建与销毁全过程(详解~)
    目录一.什么是函数栈帧?二.理解函数栈帧的创建能解决哪些问题?三.创建函数栈帧空间的之前认知3.1什么是栈3.2认识相关寄存器3.3汇编指令四.创建和销毁全过程4.1预备知识4.1.1调用堆栈4.2打开反汇编4.3函数栈帧创建​编辑4.4函数栈帧销毁一.什么是函数栈......
  • 书生大模型实战营第四期 L1G5000 XTuner 微调实践微调
    XTuner微调实践微调文章目录XTuner微调实践微调前言一、环境配置与数据准备修改提供的数据训练启动模型WebUI对话前言针对业务场景(如特殊自我认知的机器人)的微调能力一个属于自己的语言聊天机器人一、环境配置与数据准备本节中,我们将演示如何安装XTuner。......
  • BERT 微调实战
    带着问题来学习BERT的预训练过程是如何完成的,在预训练过程中,采用了哪两种任务?本次实战是用SQuAD数据集微调BERT,来完成我们的问答任务,你能否用IMDB影评数据集来微调BERT,改进BERT的结果准确率?文章最后会公布问题的参考答案~一、BERT简介BERT全称Bidirecti......
  • 【NLP】使用 SpaCy 通过 LLM 合成数据微调 NER 模型
    在我们之前的文章“使用SpaCy、ollama创建用于命名实体识别的合成数据集”中,我们探讨了如何使用Qwen生成合成数据,以自动化命名实体识别(NER)的注释过程。通过利用合成数据,我们能够高效地准备来自SmoothNLP金融新闻数据集  的高质量数据集。现在,在这篇文章中,我们将更进......
  • Pytorch用BERT对CoLA、新闻组文本数据集自然语言处理NLP:主题分类建模微调可视化分析-C
     原文链接:https://tecdat.cn/?p=38181原文出处:拓端数据部落公众号自然语言处理(NLP)领域在近年来发展迅猛,尤其是预训练模型的出现带来了重大变革。其中,BERT模型凭借其卓越性能备受瞩目。然而,对于许多研究者而言,如何高效运用BERT进行特定任务的微调及应用仍存在诸多困惑。本文......
  • 微调LLM时,full、freeze、lora区别
    LLama-Factory支持full、freeze、lora三种微调,区别:1.Full微调:Full微调是指在微调过程中更新整个模型的所有参数。这意味着所有的层和参数都会被更新,并且在微调期间都会参与训练。Full微调通常用于对模型进行全面的调整,以适应新的任务或领域。2.Freeze微调:Freeze微调是指在微调......
  • 初识AI大模型,ollama使用,llama factory大模型微调,lama.cpp模型转换guff
    最近了解了下生成式AI对话,下面是自己的一些尝试记录。ollama安装及使用1、安装我是在windows环境下安装的,很简单,访问:https://ollama.com/,下载windows安装包,打开安装就行了。cmd输入ollama-v检验是否安装成功。    2、配置在环境变量的......
  • AI-Prompt、RAG、微调还是重新训练?选择正确的生成式AI的使用方法
    生成式人工智能正在快速发展,许多人正在尝试使用这项技术来解决他们的业务问题。一般情况下有4种常见的使用方法:PromptEngineeringRetrievalAugmentedGeneration(RAG检索增强生成)微调从头开始训练基础模型(FM)本文将试图根据一些常见的可量化指标,为选择正确的生......
  • 机器学习实战——基于随机森林与决策树模型的贷款违约预测全过程(附完整代码和可视化分
    机器学习实战——基于随机森林与决策树模型的贷款违约预测全过程(附完整代码和可视化分析)关于作者作者:小白熊作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。联系邮......
  • 大模型的微调新思路:XGBLoRA的崛起
    ......