在这篇文章当中，介绍了如何在机器上查看可以使用的cuda版本，同时有暂时更换cuda的方法以及永久更换cuda的方法。但是无论是哪种，都需要手动输入命令。于是我让ai写了一个脚本，能够通过运行脚本快速地更换cuda版本：首先还是需要查看机器能够使用的cuda有哪些：nvcc -V然后脚本内容如下：# Accept version as parameter, default to 111 if not provided CUDA_VERSION=${1:-111} # Format the version with a dot before the last digit (e.g., 113 -> 11.3) FORMATTED_VERSION=$(echo $CUDA_VERSION | sed 's/\(.*\)\(.\)$/\1.\2/') # Set environment variables export CUDA_HOME=/usr/local/cuda-$FORMATTED_VERSION export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH echo "CUDA environment set to version $FORMATTED_VERSION"复制内容并粘贴在sh文件中，运行时假如想使用11.7cuda，那么采用如下的命令：source set_cuda.sh 118注意source非常重要，因为如果不source则会开一个新的终端完成脚本文件中内容，而非在当前的终端
做3D生成经常需要torch_cluster进行fps操作，但是直接通过pip install torch_cluster或者是conda install torch_cluster通常非常慢而且还不一定能装上（好像是编译问题），这个时候就需要去对应的网站上进行下载。网址在这。进入页面之后应该是这样的：首先通过Ctrl+F搜索torch版本进行筛选，然后点击进入网页。cp代表python版本，根据python版本选择对应的，然后右键点击并复制链接然后通过wget + [链接]下载到本地，然后运行pip install x.whl进行安装。
为了安装pytorch，通常都会直接从官网的命令下载，然而官网的命令通过anaconda的解析，很有可能会安装错版本，这个时候需要我们自己通过pip安装对应的版本。注意，在安装时最好置于外网环境下。查询cuda版本通过命令[scode type="share"]nvcc -V[/scode]查询当前的cuda版本为11.8。确认当前环境下python版本python --version这里举例为python 3.9在网址中找到对应pytorch/torchvision/torchaudio版本访问网址为：https://download.pytorch.org/whl/{你的CUDA版本}例如说cuda为11.8，那么就访问：https://download.pytorch.org/whl/cu118会进入如下的链接：其中点击不同的路径可以进入不同的包选择版本，以pytorch为例：里面有很多内容，可以使用Ctrl+F进入搜索特定版本，例如说torch-1.9.1。因为我是python 3.9，因此找到cp39，然后linux_x86_64，然后找到文件。通过命令行安装也可以通过命令行安装：pip install torch==1.9.0+cu118 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu118程序会自动寻找最合适的版本，pytorch的版本最好设定一下。
网上已经有很多了，记录在这里主要是方便查询和一键搜索假设对于如下环境来说：那么首先用python命令进入python命令行格式，然后用行如下指令：import torch print(torch.cuda.is_available())然后得到返回为True即代表支持cuda。
实验室经常需要大家共用一个服务器，因此不同实验者有不同的cuda需求，况且同一个人在不同项目下也有不同的cuda需求，因此需要更换cuda。查询当前版本首先通过下面命令查询当前的cuda版本：nvcc -V得到如下结果代表当前的版本是11.8查询可更换版本因为安装cuda是需要root的，如果自身没有root，则需要查看有哪些cuda可用。一般实验机器都有安装多个版本。通过这个命令来查询可更换版本。ls -l /usr/local | grep cuda得到结果如下：这就说明有一系列的11和12cuda可用更换相应的cuda版本有两种更换模式，例子更换11.7暂时更换export CUDA_HOME=/usr/local/cuda-11.7 export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH输入后再nvcc -V会得到：更换成功永久更换（谨慎）通过写入bashrc文件可以永久更换，也就是说每次终端开始的时候都会更换，需要确认是否有这个需求：echo "export CUDA_HOME=/usr/local/cuda-11.7" >> ~/.bashrc echo "export PATH=$CUDA_HOME/bin:$PATH" >> ~/.bashrc echo "export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc然后运行：source ~/.bashrc # 使修改生效
在人工智能的训练中，可能存在很多参数，其中一些是默认参数（如数据的路径，保存checkpoint的训练轮数，batchsize等等），也有一些是针对某个训练使用的参数（如读取数据的分辨率，读取的类别条件）。在过去的代码中，一个普遍的解决方法是：使用BaseOption, TrainOption, 和TestOption。其中TrainOption和TestOption继承BaseOption。而Openai的代码提供了一个新的思路。很难直接说谁的更好，记录一下。1. 前置条件首先要知道在python中，字典可以在被**后作为函数的参数传入，函数会自行在被传入的众多参数里面找到自己要的。例如说：Big_parameter_sets = dict{a=1, b=2, c=3} def Small_function(a, b): return a+b output = Small_function(**Big_parameter_sets) 可以发现Small_function这个函数并没有完全用到abc三个参数，总之，字典的键要和参数名同名，且是该函数的母集。2. 具体过程在主函数里，代码这样得到参数的：args = create_argparser().parse_args()可以看到create_argparser这个函数返回了一个parser，然后这个parser的类再调用parse_args函数，然后得到传递的参数。于是我们找到create_argparser这个函数。def create_argparser(): defaults = dict( data_dir="", schedule_sampler="uniform", lr=1e-4, weight_decay=0.0, lr_anneal_steps=0, batch_size=1, microbatch=-1, ema_rate="0.9999", log_interval=10, save_interval=10000, resume_checkpoint="", use_fp16=False, fp16_scale_growth=1e-3, ) defaults.update(sr_model_and_diffusion_defaults()) parser = argparse.ArgumentParser() add_dict_to_argparser(parser, defaults) return parser其中的defaults这个字典，有一个神经网络最基础的一些参数：数据路径，学习率，权重缩减……接下来，使用字典类的一个方法：update。这个方法有点像合并两个字典，字典来自于一个叫做sr_model_and_diffusion_defaults的函数，于是再找到这个函数。def sr_model_and_diffusion_defaults(): res = model_and_diffusion_defaults() res["large_size"] = 256 res["small_size"] = 64 arg_names = inspect.getfullargspec(sr_create_model_and_diffusion)[0] for k in res.copy().keys(): if k not in arg_names: del res[k] return res这里一个函数model_and_diffusion_defaults的输出被赋给了res这个变量，因为嵌套了太多函数，这个函数就不再写在这里，这个函数的本质也是直接返回了一个字典。之后又把256赋给了”large_size”这个键，把64赋给了”small_size“这个键。接下来一句话比较少见：arg_names = inspect.getfullargspec(sr_create_model_and_diffusion)[0]这句话的目的就是 获得sr_create_model_and_diffusion这个函数的所有参数（使用[0]的原因）。这个函数配合接下来的for循环的目的是删除res 中所有不是sr_create_model_and_diffusion的参数的键还有它的值。总的来说，这里的目的是：因为我们最终需要跑的是sr_create_model_and_diffusion这个函数，而model_and_diffusion_defaults这个函数提供的参数和我们跑的函数间是交集的关系，因此删除这些键值对可以减少内存的占用，但是我个人认为如果字典只有几十或者十几个键值对，这种操作其实没有很大的必要性。于是我们返回res，并把它和defaults合并在一起。parser = argparse.ArgumentParser()parser = add_dict_to_argparser(parser, defaults)这句话创造了一个parser，第二句话对这个parser进行了一些改动，因为字典终究是字典，还要想办法把字典的值一一赋值给parser才行，进入到这个函数：def add_dict_to_argparser(parser, default_dict): for k, v in default_dict.items(): v_type = type(v) if v is None: v_type = str elif isinstance(v, bool): v_type = str2bool parser.add_argument(f"--{k}", default=v, type=v_type)其中应该只有一个问题比较难看懂，就是str2bool，这个主要是为了防止当参数是bool类型的时候，只要你输入了，输入会变成字符串，然后不管是输入了什么，都会表示为True。因此需要用这个将输入的True or False转换成参数的。最后，只需要在使用的时候，再将args转换成字典就好了：model, diffusion = sr_create_model_and_diffusion( **args_to_dict(args, sr_model_and_diffusion_defaults().keys()) ) def args_to_dict(args, keys): return {k: getattr(args, k) for k in keys}最后这个args_to_dict函数其实是一个字典的推导式。它的意思是，对于传入的keys（也就是sr_model_and_diffusion_defaults的所有参数，是个列表）k，从parser的args中找到对应的参数值，建立从k到这个参数值的新映射，其实就是把parser的形态再转换回来。
1. 查看所有环境conda env list会得到下面的结果：2. 创造环境（设定python版本）有的时候不想安装最新的python，所以可以设定：conda create --name myenv python=3.10 其中myenv为创建的环境名称3. 彻底删除某个环境conda remove -n myenv --all
pytorch ligntning是一个便利训练分布式模型的模块化库。只需要写好training_step就可以训练。然而，其经常使用shm，也就是shared memory存储多进程数据。当程序意外结束的时候，会占用/dev/shm空间。经过df -h后可以看到：如果这里Available的非常少，就意外退出的程序占用了，这个时候我们需要删除之前占用的。首先通过下面命令删除/dev/shm中属于我自己的文件。find /dev/shm -user shizhen -exec rm -rf {} \;然后同时还要kill掉 deleted的进程，否则无法释放：lsof | grep deleted | awk '{print $2}' | xargs kill -9然后就能看到内存占用在一点一点地降低。