__init__.py 4.8 KB
Newer Older
Q
qiaolongfei 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved
#
# 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
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# 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.
Y
yi.wu 已提交
14
import os
Q
qiaolongfei 已提交
15
import optimizer
Q
qiaolongfei 已提交
16
import layer
17
import activation
Y
Yu Yang 已提交
18 19
import parameters
import trainer
Y
Yu Yang 已提交
20
import event
21
import data_type
Q
qiaolongfei 已提交
22
import topology
Q
qiaolongfei 已提交
23
import networks
Y
Yu Yang 已提交
24
import evaluator
25 26
from . import dataset
from . import reader
Y
Yancey1989 已提交
27
from . import plot
L
Luo Tao 已提交
28
import attr
X
xuwei06 已提交
29
import op
L
Luo Tao 已提交
30
import pooling
31
import inference
Y
Yu Yang 已提交
32
import networks
33
import minibatch
Y
Yancey1989 已提交
34
import plot
35
import image
36
import paddle.trainer.config_parser as cp
37

Q
qiaolongfei 已提交
38
__all__ = [
39 40
    'default_startup_program',
    'default_main_program',
41 42 43 44 45 46 47 48 49 50
    'optimizer',
    'layer',
    'activation',
    'parameters',
    'init',
    'trainer',
    'event',
    'data_type',
    'attr',
    'pooling',
51 52
    'dataset',
    'reader',
53 54 55 56 57
    'topology',
    'networks',
    'infer',
    'plot',
    'evaluator',
58
    'image',
H
Helin Wang 已提交
59
    'master',
Q
qiaolongfei 已提交
60
]
Y
Yu Yang 已提交
61

62 63
cp.begin_parse()

Y
Yu Yang 已提交
64

L
Luo Tao 已提交
65
def set_env_vars(trainer_count):
T
tensor-tang 已提交
66
    '''Auto set CPU environment if have not set before.
L
Luo Tao 已提交
67 68 69 70 71
       For MKL:
         export KMP_AFFINITY, OMP_DYNAMIC according to the Hyper Threading status.
         export OMP_NUM_THREADS, MKL_NUM_THREADS according to trainer_count.
       For OpenBLAS:
         export OPENBLAS_NUM_THREADS, OPENBLAS_MAIN_FREE according to trainer_count. 
T
tensor-tang 已提交
72
    '''
L
Luo Tao 已提交
73
    import platform, paddle
T
tensor-tang 已提交
74 75
    if not platform.system() in ['Linux', 'Darwin']:
        return
Y
yi.wu 已提交
76

T
tensor-tang 已提交
77 78 79 80 81 82 83 84
    def set_env(key, value):
        '''If the key has not been set in the environment, set it with value.'''
        assert isinstance(key, str)
        assert isinstance(value, str)
        envset = os.environ.get(key)
        if envset is None:
            os.environ[key] = value

T
tensor-tang 已提交
85 86 87 88
    def num_physical_cores():
        '''Get the number of physical cores'''
        if platform.system() == "Linux":
            num_sockets = int(
L
Luo Tao 已提交
89
                os.popen("grep 'physical id' /proc/cpuinfo | sort -u | wc -l")
T
tensor-tang 已提交
90 91
                .read())
            num_cores_per_socket = int(
L
Luo Tao 已提交
92
                os.popen("grep 'core id' /proc/cpuinfo | sort -u | wc -l")
T
tensor-tang 已提交
93 94 95
                .read())
            return num_sockets * num_cores_per_socket
        else:
T
tensor-tang 已提交
96
            cmds = {"Darwin": "sysctl -n hw.physicalcpu"}
T
tensor-tang 已提交
97 98 99 100 101 102
            return int(os.popen(cmds.get(platform.system(), "expr 1")).read())

    def num_logical_processors():
        '''Get the number of logical processors'''
        cmds = {
            "Linux": "grep \"processor\" /proc/cpuinfo|sort -u|wc -l",
T
tensor-tang 已提交
103
            "Darwin": "sysctl -n hw.logicalcpu"
T
tensor-tang 已提交
104 105 106 107 108
        }
        return int(os.popen(cmds.get(platform.system(), "expr 1")).read())

    num_cores = num_physical_cores()
    num_processors = num_logical_processors()
L
Luo Tao 已提交
109 110 111 112 113 114 115
    if paddle.version.mkl() == 'ON':
        if num_processors > num_cores:  # Hyper Threading is enabled
            set_env("OMP_DYNAMIC", "true")
            set_env("KMP_AFFINITY", "granularity=fine,compact,1,0")
        else:
            set_env("OMP_DYNAMIC", "false")
            set_env("KMP_AFFINITY", "granularity=fine,compact,0,0")
T
tensor-tang 已提交
116
    threads = num_processors / trainer_count
T
tensor-tang 已提交
117
    threads = '1' if threads < 1 else str(threads)
L
Luo Tao 已提交
118 119 120 121 122 123 124
    if paddle.version.mkl() == 'ON':
        set_env("OMP_NUM_THREADS", threads)
        set_env("MKL_NUM_THREADS", threads)
    else:
        set_env("OPENBLAS_NUM_THREADS", threads)
        if threads > 1:
            set_env("OPENBLAS_MAIN_FREE", '1')
T
tensor-tang 已提交
125

T
tensor-tang 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

def init(**kwargs):
    import py_paddle.swig_paddle as api
    args = []
    args_dict = {}
    # NOTE: append arguments if they are in ENV
    for ek, ev in os.environ.iteritems():
        if ek.startswith("PADDLE_INIT_"):
            args_dict[ek.replace("PADDLE_INIT_", "").lower()] = str(ev)

    args_dict.update(kwargs)
    # NOTE: overwrite arguments from ENV if it is in kwargs
    for key in args_dict.keys():
        args.append('--%s=%s' % (key, str(args_dict[key])))

L
Luo Tao 已提交
141
    set_env_vars(kwargs.get('trainer_count', 1))
T
tensor-tang 已提交
142

143 144
    if 'use_gpu' in kwargs:
        cp.g_command_config_args['use_gpu'] = kwargs['use_gpu']
T
tensor-tang 已提交
145 146
    if 'use_mkldnn' in kwargs:
        cp.g_command_config_args['use_mkldnn'] = kwargs['use_mkldnn']
T
tensor-tang 已提交
147 148
    if 'use_mkl_packed' in kwargs:
        cp.g_command_config_args['use_mkl_packed'] = kwargs['use_mkl_packed']
149 150 151
    assert 'parallel_nn' not in kwargs, ("currently 'parallel_nn' is not "
                                         "supported in v2 APIs.")

Y
Yu Yang 已提交
152
    api.initPaddle(*args)
Y
Yu Yang 已提交
153

Y
Yu Yang 已提交
154

Y
Yu Yang 已提交
155
infer = inference.infer
156
batch = minibatch.batch