• 隐语容器部署指南


    一、单机版本部署

    docker 最新的版本请查看 secretflow tags

    https://hub.docker.com/r/secretflow/secretflow-anolis8/tags

    启动容器

    docker run -itd secretflow/secretflow-anolis8:${version}
    
    • 1

    测试

    1. 进入容器
    docker exec -it docker_hash bash
    
    • 1
    1. 生成csv数据
    import csv
    
    
    def write_id_to_csv(count):
        with open("id_{}.csv".format(str(count)), "w") as f:
            writer = csv.writer(f)
            writer.writerow(["id"])
            for v in range(count):
                writer.writerow([str(v)])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 初始化spu并测试 单机容器下没有启动ray集群服务,只是ray本地调用
    # 单机版,sf.utils.testing.cluster_def 建立SPU。请注意它只能在单机模式下使用,因为它使用了 127.0.0.1 作为默认ip。
    import secretflow as sf
    
    sf.shutdown()
    sf.init(['alice', 'bob', 'carol'], num_cpus=8, log_to_driver=False)
    
    # 虚拟化三个逻辑设备
    alice, bob = sf.PYU('alice'), sf.PYU('bob')
    spu = sf.SPU(sf.utils.testing.cluster_def(['alice', 'bob']))
    
    # 求交
    input_path = {alice: 'id_count.csv', bob: 'id_count.csv'}
    output_path = {alice: '.data/alice_psi.csv', bob: '.data/bob_psi.csv'}
    spu.psi_csv('id', input_path, output_path, 'alice', protocol="ECDH_PSI_2PC")
    #spu.psi_csv('id', input_path, output_path, 'alice', protocol="KKRT_PSI_2PC")
    #spu.psi_csv('id', input_path, output_path, 'alice', protocol="BC22_PSI_2PC")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    二、单机下多容器部署

    使用容器隔离环境,启动多个ray 分布式计算节点,但都共用同一个宿主机的网络节点

    以host模式启动容器,容器会和宿主机共用一个network namespace

    # 启动两个容器
    docker run  --net=host -itd secretflow/secretflow-anolis8:0.7.7b1
    docker run  --net=host -itd secretflow/secretflow-anolis8:0.7.7b1
    
    • 1
    • 2
    • 3

    主节点启动ray 服务

    
    RAY_DISABLE_REMOTE_CODE=true \
    RAY_SECURITY_CONFIG_PATH=config.yml \
    RAY_USE_TLS=0 \
    ray start --head --node-ip-address="宿主机ip" --port="GCS server listening port" --resources='{"alice": 8}' --include-dashboard=False --disable-usage-stats
     
    # RAY_USE_TLS 0 关闭tls验证
    # {“alice”: 8} 意味着alice最多可以同时运行8个worker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    子节点启动ray服务

    RAY_DISABLE_REMOTE_CODE=true \
    RAY_SECURITY_CONFIG_PATH=config.yml \
    RAY_USE_TLS=0 \
    ray start --address="主节点ip:主节点GCS_port" --resources='{"bob": 8}' --disable-usage-stats
    
    • 1
    • 2
    • 3
    • 4

    查看节点启动状态,ray status ,两边同步的节点hash是否一致,服务是否正常

    ray status
    
    • 1

    测试

    import spu
    import secretflow as sf
    
    sf.init(address="主节点ip:GCS_port")
    alice, bob = sf.PYU('alice'), sf.PYU('bob')
    
    # 因为在同一服务器下面,以host模式启动,所以此处端口不要冲突
    cluster_def = {
        'nodes': [
            {
                'party': 'alice',
                'id': '0',
                # Use the address and port of alice instead.
                # Please choose a unused port.
                'address': 'ip:9327',
            },
            {
                'party': 'bob',
                'id': '1',
                # Use the ip and port of bob instead.
                # Please choose a unused port.
                'address': 'ip:9328',
            },
        ],
        'runtime_config': {
            'protocol': spu.spu_pb2.SEMI2K,
            'field': spu.spu_pb2.FM128,
            'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
        }
    }
    spu = sf.SPU(cluster_def=cluster_def)
    input_path = {alice: 'id_1000000.csv', bob: 'id_1000000.csv'}
    output_path = {alice: './alice_psi.csv', bob: './bob_psi.csv'}
    spu.psi_csv('id', input_path, output_path, 'alice')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    三、集群模式,跨服务器容器部署

    首先保证两台服务器网络是可以互相访问的

    yum install telnet -y
    
    telnet ip port 
    
    • 1
    • 2
    • 3

    两边分别以host模式启动容器

    docker run  --net=host -itd secretflow/secretflow-anolis8:0.7.7b1
    
    • 1

    测试A服务器容器内的端口是否能被B服务器的容器访问

    1. 先在A服务器容器内启动主节点ray 集群服务, 再从B服务器容器内启动子节点ray 集群
    2. 如果能正常连接主节点,则网络正常,如果连接失败,检查端口时候正常,通信是否正常

    在隐语框架中,SPU基于Brpc,这意味着SPU拥有一个独立于Ray网络之外的服务网格。换言之,你必须单独处理SPU的端口

    在测试前先测试一下Brpc端口是否正常,在其中一方启动Brpc服务

    
    import spu.binding._lib.link as spu_link
    
    rank = 0
    node = {
        'party': 'alice',
        'id': 'local:0',
        'address': '127.0.0.1:9001',
        # The listen address of this node
    }
    desc = spu_link.Desc()
    desc.add_party(node['id'], node['address'])
    link = spu_link.create_brpc(desc, rank)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    另外一方容器内访问对方的端口状况, 如果正常则跳过

    telnet ip port
    
    • 1
    测试
    
    sf.init(address="主节点ip:GCS_port")
    alice, bob = sf.PYU('alice'), sf.PYU('bob')
     
    cluster_def={
        'nodes': [
            {
                'party': 'alice',
                'id': '0',
                # Use the address and port of alice instead.
                # Please choose a unused port.
                'address': 'ip:9327',
            },
            {
                'party': 'bob',
                'id': '1',
                # Use the ip and port of bob instead.
                # Please choose a unused port.
                'address': 'ip:9327',
            },
        ],
        'runtime_config': {
            'protocol': spu.spu_pb2.SEMI2K,
            'field': spu.spu_pb2.FM128,
            'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
        }
    }
    spu = sf.SPU(cluster_def=cluster_def)
    input_path = {alice: 'id_1000000.csv', bob: 'id_1000000.csv'}
    output_path = {alice: './alice_psi.csv', bob: './bob_psi.csv'}
    spu.psi_csv('id', input_path, output_path, 'alice')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    CSS 之 vertical-align的垂直方向居中对齐误解
    C- 可变参数的简单版实现
    零基础学网络安全要怎么学?五分钟看懂
    YOLOv7学习笔记(一)——概述+环境+训练
    debugserver+lldb连接不上的解决办法
    【Apache Kafka3.2】KafkaProducer发送消息源码分析
    数字藏品交易系统有哪些特点?
    全面解读CMS系统:核心技术、架构设计与应用实践
    xilinx zynqmp DisplayPort时钟检测错误
    接口自动化测试框架postman tests常用方法
  • 原文地址:https://blog.csdn.net/qq_45503700/article/details/127593185