• 使用singularity本地部署wandb


    1. 背景:

    wandb self-host(本地部署)官网只支持docker,而不支持singularity,但是现在部分高校或者企业在集群上完全使用singularity替代docker (原因:docker可以挂载任意目录,而容器内是root权限,导致容器外对文件设置的权限,在容器内完全是无用的,因为root用户可以访问修改任意文件,从而很容易hack宿主机)

    2. 解决办法

    本教程要求用户必须有singularity的fakeroot权限或者已经在sudo组!!!
    如果所属企业或者高校连fakeroot权限都不给,那确实无解
    
    • 1
    • 2

    废话不多说,直接上代码

    2.1 根据singularity官网命令,将docker镜像转换为sig镜像

    singularity build --sandbox  wandb_sig/  docker://wandb/local:latest
    
    # 备选方案:如果提示无法访问hub.docker.io, 则需要间接处理
    # 1. 找一台有docker的电脑
    # 2. 拉去wandb/local镜像
    docker pull wandb/local
    # 3. 将镜像保存为tar包
    docker save -o wandb_latest.tar wandb/local
    # 4. 将tar包复制到安装singularity的机器上
    # 5. build 镜像
    singularity build --sandbox  wandb_sig/ docker-archive://wandb_latest.tar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.2 接着创建挂载目录(用于将容器内产生的文件备份到宿主机)

    # 假设挂载路径为/path/to/vol
    mkdir /path/to/vol # 挂载路径
    chmod 777 vol # 权限必须转换为777
    
    # 如果已经存在挂载目录,并且该目录为启动docker容器时使用的目录,需要将目录权限修改为777
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 启动容器

    # 启动容器, -f 为fakeroot权限, -w 为 修改镜像的权限, --net***为端口映射,容器名为wandb
    singularity instance start -f -w  --net --network-args "portmap=port:8080/tcp" --env HOST=http://ip_or_domain_name:port --bind /path/to/vol:/vol wandb_sig wandb
    
    • 1
    • 2

    2.4 修改相关目录的权限

    # 进入容器
    singularity shell --writable-tmpfs instance://wandb
    
    # 挂载路径内的owner和grouper修改,owner要改成wandb,grouper要改为root
    # chown -R wandb:root /vol/*
    find /vol/* -type f -print0| xargs -0 -P40 chown wandb:root
    # 部分目录也需要修改,直接copy就行 (uid:999 就是wandb, gid:0 就是root)
    chown -R wandb:root  /etc/logrotate.d /etc/my_init.d /etc/nginx /etc/service /etc/container* /var/app
    chown -R root:mail /var/mail
    chown -R root:staff /var/local
    chown -R wandb:root /tmp/GORILLA_STARTED_UNIX_TIME /tmp/load_env_output
    
    # 下面这两行是为了让root用户可以无密码登录,docker容器默认就可以实现这一点
    echo "[mysqld]" >> /etc/mysql/my.cnf
    echo "skip-grant-tables" >> /etc/mysql/my.cnf
    
    # 修改完成后退出即可
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.5 启动wandb服务 – 转换成singularity后不会自动启动容器内的服务(比如网页,mysql,minio存储等)

    # 进入容器
    singularity shell --writable-tmpfs instance://wandb
    # 切换到wandb用户,启动服务
    su wandb
    /sbin/my_init
    
    # 我目前还不知道singularity如何在不结束当前运行进程的情况下,退出terminal
    # 我选取的方法是直接关掉终端,这样可以保证容器内的进程不被kill
    # 启动新的终端,在宿主机内测试是否可以访问到网页:
    curl http://localhost:port  # 或者 wget http://localhost:port
    # 如果可以正常访问,则已经成功95%啦
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.6 最后一步,端口映射

    singularity 暴露的端口只能在宿主机上访问,无法在外网访问,如果需要外网访问,需要使用ssh做一次代理 (在部署wandb的宿主机上执行)
    
    • 1
    ssh -CfNg -L external_port:127.0.0.1:port username@locahost -i ~/.ssh/id_rsa
    
    • 1
    external_port是外网访问时的端口, port为 singularity容器启动时映射的端口,这两个值不能一样,端口值大于1024即可, 比如 port 为 9998,external_port为 9999
    
    该命令的作用时,当访问本机的external_port时,将数据转发到本机的port端口
    
    目前该命令需要使用密钥登录账户,如果只能使用密码登录,需要百度一下。
    
    外网访问 http://xxx:external_port 就可以成功访问啦。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如有任何问题,欢迎留言讨论!!!

  • 相关阅读:
    uniapp 返回上一步携带参数
    Akshare获取分红数据
    特别关注什么是CPC认证,美国CPSC测试有哪些常见问题解析
    一文看懂推荐系统:Gate网络(一):新浪微博GateNet,GateNet就是想用attention的方法去搞,和SENet一样,都是张俊林的杰作
    十四届蓝桥青少组模拟赛Python-20221108
    Linux中shell的使用(零基础学习笔记)
    实验一:查看CPU和内存,用机器指令和汇编指令编程
    云原生尝试——docker容器域名绑定
    2023研究生数学建模竞赛A题B题C题D题E题F题思路+模型+代码
    linux后台运行命令总结
  • 原文地址:https://blog.csdn.net/qq_24681499/article/details/132982230