conda_build.py 9.6 KB
Newer Older
1
#!/bin/python
2 3

# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
4
#
5 6 7
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
8
#
9
#     http://www.apache.org/licenses/LICENSE-2.0
10
#
11 12 13 14 15 16
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

17 18 19 20 21 22 23 24
#
import platform
import argparse
import os


def parse_args():
    parser = argparse.ArgumentParser("conda build for paddlepaddle version")
25 26 27 28 29 30
    parser.add_argument(
        "--paddle_version",
        type=str,
        required=True,
        help="paddle version for conda build.",
    )
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
    args = parser.parse_args()

    return args


class ConstantVar:
    def __init__(self):
        self.build = r"""
build:
  number: '0'
  string: """

        self.requirement_build = r"""
requirements:
  build:
46
    - numpy>=1.13
47 48 49 50 51 52
    - cython
    - setuptools
"""

        self.requirement_run = r"""
  run:
53 54 55 56 57
    - requests>=2.20.0
    - numpy>=1.13
    - protobuf>=3.1.0
    - gast==0.3.3
    - Pillow
58
    - decorator
59
    - astor
60 61 62 63
"""

        self.requirement_run_windows = r"""
  run:
64 65 66 67 68
    - requests>=2.20.0
    - numpy>=1.13
    - protobuf>=3.1.0
    - gast==0.3.3
    - Pillow
69
    - decorator
70
    - astor
71
"""
72
        self.test = r"""
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
test:
  import:
    paddle
"""

        self.about = r"""
about:
  home: http://www.paddlepaddle.org/
  license: APACHE 2.0
  license_family: APACHE
  summary: an easy-to-use, efficient, flexible and scalable deep learning platform
"""

        self.build_const = r"""
"""

89
        self.blt_const = r"""
90 91 92 93
"""

        self.python36 = r"    - python>=3.6, <3.7"
        self.python37 = r"    - python>=3.7, <3.8"
94
        self.python38 = r"    - python>=3.8, <3.9"
95
        self.python39 = r"    - python>=3.9, <3.10"
96 97

        self.python_version = [
98 99 100 101
            self.python36,
            self.python37,
            self.python38,
            self.python39,
102 103
        ]

104 105 106 107 108 109 110 111
        self.cuda101 = r"""
    - cudatoolkit>=10.1, <10.2
    - cudnn>=7.6, <7.7
    """
        self.cuda102 = r"""
    - cudatoolkit>=10.2, <10.3
    - cudnn>=7.6, <7.7
    """
112 113 114 115 116
        self.cuda112 = r"""
    - cudatoolkit>=11.2, <11.3
    - cudnn>=8.1, <8.2
    """

117 118 119 120 121
        self.cuda_info = [
            (self.cuda101, "cuda10.1", ".post101"),
            (self.cuda102, "cuda10.2", ""),
            (self.cuda112, "cuda11.2", ".post112"),
        ]
122
        self.py_str = ["py36", "py37", "py38", "py39"]
123 124
        self.pip_end = ".whl --no-deps"
        self.pip_prefix_linux = "pip install /package/paddlepaddle"
125
        self.pip_prefix_windows = r"pip install C:\package\paddlepaddle"
126 127 128
        self.pip_gpu = "_gpu-"
        self.pip_cpu = "-"
        self.mac_pip = [
129 130 131 132
            "-cp36-cp36m-macosx_10_6_intel",
            "-cp37-cp37m-macosx_10_6_intel",
            "-cp38-cp38-macosx_10_14_x86_64",
            "-cp39-cp39-macosx_10_14_x86_64",
133 134
        ]
        self.linux_pip = [
135 136 137 138
            "-cp36-cp36m-linux_x86_64",
            "-cp37-cp37m-linux_x86_64",
            "-cp38-cp38-linux_x86_64",
            "-cp39-cp39-linux_x86_64",
139 140
        ]
        self.windows_pip = [
141 142 143 144
            "-cp36-cp36m-win_amd64",
            "-cp37-cp37m-win_amd64",
            "-cp38-cp38-win_amd64",
            "-cp39-cp39-win_amd64",
145 146 147 148
        ]


def meta_build_mac(var, python_str, paddle_version, build_var, build_name_str):
149 150
    package_str = (
        """
151 152
package:
  name: paddlepaddle
153 154 155 156 157 158
  version: """
        + paddle_version
    )
    requirement = (
        var.requirement_build + python_str + var.requirement_run + python_str
    )
159 160 161 162 163 164 165 166 167 168 169 170
    meta_build = var.build + build_name_str
    meta_str = package_str + meta_build + requirement + var.test + var.about
    build_str = var.build_const + build_var

    meta_filename = "meta.yaml"
    build_filename = "build.sh"
    with open(meta_filename, 'w') as f:
        f.write(meta_str)
    with open(build_filename, 'w') as f:
        f.write(build_str)


171 172 173
def meta_build_linux(
    var, python_str, paddle_version, build_var, build_name_str, cuda_str=None
):
174
    if cuda_str is None:
175 176
        package_str = (
            """
177 178
package:
  name: paddlepaddle
179 180 181
  version: """
            + paddle_version
        )
182
    else:
183 184
        package_str = (
            """
185 186
package:
  name: paddlepaddle-gpu
187 188 189 190 191 192
  version: """
            + paddle_version
        )
    requirement = (
        var.requirement_build + python_str + var.requirement_run + python_str
    )
193 194
    meta_build = var.build + build_name_str
    meta_str = package_str + meta_build + requirement
195
    if not (cuda_str is None):
196 197 198 199 200 201 202 203 204 205 206 207 208
        meta_str = meta_str + cuda_str
    meta_str = meta_str + var.test + var.about

    build_str = var.build_const + build_var

    meta_filename = "meta.yaml"
    build_filename = "build.sh"
    with open(meta_filename, 'w') as f:
        f.write(meta_str)
    with open(build_filename, 'w') as f:
        f.write(build_str)


209 210 211
def meta_build_windows(
    var, python_str, paddle_version, blt_var, build_name_str, cuda_str=None
):
212
    if cuda_str is None:
213 214
        package_str = (
            """
215 216
package:
  name: paddlepaddle
217 218 219
  version: """
            + paddle_version
        )
220
    else:
221 222
        package_str = (
            """
223 224
package:
  name: paddlepaddle-gpu
225 226 227 228 229 230 231 232 233 234
  version: """
            + paddle_version
        )

    requirement = (
        var.requirement_build
        + python_str
        + var.requirement_run_windows
        + python_str
    )
235 236
    meta_build = var.build + build_name_str
    meta_str = package_str + meta_build + requirement
237

238
    if not (cuda_str is None):
239
        meta_str = meta_str + cuda_str
240

241
    blt_str = var.blt_const + blt_var
242

243
    meta_str = meta_str + var.test + var.about
244 245 246 247 248 249 250 251 252 253
    meta_filename = "meta.yaml"
    build_filename = "bld.bat"
    with open(meta_filename, 'w') as f:
        f.write(meta_str)
    with open(build_filename, 'w') as f:
        f.write(blt_str)


def conda_build(paddle_version, var):
    sysstr = platform.system()
254
    if sysstr == "Windows":
255 256 257
        os.system("mkdir paddle")
        os.chdir(r"./paddle")
        for i in range(len(var.python_version)):
258 259 260 261 262 263 264
            blt_var = (
                var.pip_prefix_windows
                + var.pip_cpu
                + paddle_version
                + var.windows_pip[i]
                + var.pip_end
            )
265 266 267 268 269 270 271 272
            name = var.py_str[i] + "_cpu_windows"
            python_str = var.python_version[i]
            meta_build_windows(var, python_str, paddle_version, blt_var, name)
            os.system("conda build .")

        for i in range(len(var.python_version)):
            for cuda_str in var.cuda_info:
                post = cuda_str[2]
273 274 275 276 277 278 279 280
                blt_var = (
                    var.pip_prefix_windows
                    + var.pip_gpu
                    + paddle_version
                    + post
                    + var.windows_pip[i]
                    + var.pip_end
                )
281 282 283
                name = var.py_str[i] + "_gpu_" + cuda_str[1] + "_windows"
                cuda_cudnn_str = cuda_str[0]
                python_str = var.python_version[i]
284 285 286 287 288 289 290 291
                meta_build_windows(
                    var,
                    python_str,
                    paddle_version,
                    blt_var,
                    name,
                    cuda_cudnn_str,
                )
292 293
                os.system("conda build .")

294
    elif sysstr == "Linux":
295 296 297
        os.system("mkdir paddle")
        os.chdir(r"./paddle")
        for i in range(len(var.python_version)):
298 299 300 301 302 303 304
            build_var = (
                var.pip_prefix_linux
                + var.pip_cpu
                + paddle_version
                + var.linux_pip[i]
                + var.pip_end
            )
305 306 307 308 309 310 311 312
            name = var.py_str[i] + "_cpu_many_linux"
            python_str = var.python_version[i]
            meta_build_linux(var, python_str, paddle_version, build_var, name)
            os.system("conda build .")

        for i in range(len(var.python_version)):
            for cuda_str in var.cuda_info:
                post = cuda_str[2]
313 314 315 316 317 318 319 320
                build_var = (
                    var.pip_prefix_linux
                    + var.pip_gpu
                    + paddle_version
                    + post
                    + var.linux_pip[i]
                    + var.pip_end
                )
321 322 323
                name = var.py_str[i] + "_gpu_" + cuda_str[1] + "_many_linux"
                cuda_cudnn_str = cuda_str[0]
                python_str = var.python_version[i]
324 325 326 327 328 329 330 331
                meta_build_linux(
                    var,
                    python_str,
                    paddle_version,
                    build_var,
                    name,
                    cuda_cudnn_str,
                )
332 333 334 335
                os.system("conda build .")

        os.system("cd ..")

336
    elif sysstr == "Darwin":
337 338 339
        os.system("mkdir paddle")
        os.chdir(r"./paddle")
        for i in range(len(var.python_version)):
340 341 342 343 344 345 346
            build_var = (
                var.pip_prefix_linux
                + var.pip_cpu
                + paddle_version
                + var.mac_pip[i]
                + var.pip_end
            )
347 348 349 350 351 352 353 354 355 356 357 358 359
            name = var.py_str[i] + "_mac"
            python_str = var.python_version[i]
            meta_build_mac(var, python_str, paddle_version, build_var, name)
            os.system("conda build .")

        os.system("cd ..")


if __name__ == "__main__":
    args = parse_args()
    paddle_version = args.paddle_version
    var = ConstantVar()
    conda_build(paddle_version, var)