Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
40ce7f4a
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
40ce7f4a
编写于
10月 26, 2022
作者:
M
Manan Goel
提交者:
GitHub
10月 26, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Wandb callback (#46918)
上级
436115cf
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
299 addition
and
6 deletion
+299
-6
python/paddle/callbacks.py
python/paddle/callbacks.py
+2
-0
python/paddle/hapi/callbacks.py
python/paddle/hapi/callbacks.py
+173
-0
python/paddle/tests/CMakeLists.txt
python/paddle/tests/CMakeLists.txt
+1
-0
python/paddle/tests/test_callback_wandb.py
python/paddle/tests/test_callback_wandb.py
+70
-0
python/paddle/tests/test_utils_lazyimport.py
python/paddle/tests/test_utils_lazyimport.py
+45
-0
python/paddle/utils/lazy_import.py
python/paddle/utils/lazy_import.py
+7
-6
python/unittest_py/requirements.txt
python/unittest_py/requirements.txt
+1
-0
未找到文件。
python/paddle/callbacks.py
浏览文件 @
40ce7f4a
...
...
@@ -19,6 +19,7 @@ from .hapi.callbacks import VisualDL # noqa: F401
from
.hapi.callbacks
import
LRScheduler
# noqa: F401
from
.hapi.callbacks
import
EarlyStopping
# noqa: F401
from
.hapi.callbacks
import
ReduceLROnPlateau
# noqa: F401
from
.hapi.callbacks
import
WandbCallback
# noqa: F401
__all__
=
[
# noqa
'Callback'
,
...
...
@@ -28,4 +29,5 @@ __all__ = [ # noqa
'LRScheduler'
,
'EarlyStopping'
,
'ReduceLROnPlateau'
,
'WandbCallback'
,
]
python/paddle/hapi/callbacks.py
浏览文件 @
40ce7f4a
...
...
@@ -993,6 +993,179 @@ class VisualDL(Callback):
delattr
(
self
,
'writer'
)
class
WandbCallback
(
Callback
):
"""Track your training and system metrics using `Weights and Biases <https://docs.wandb.ai>`_.
**Installation and set-up**
Install with pip and log in to your W&B account:
.. code-block:: bash
pip install wandb
wandb login
Args:
project(str, optional): Name of the project. Default: uncategorized
entity(str, optional): Name of the team/user creating the run. Default: Logged in user
name(str, optional): Name of the run. Default: randomly generated by wandb
dir(str, optional): Directory in which all the metadata is stored. Default: `wandb`
mode(str, optional): Can be "online", "offline" or "disabled". Default: "online".
job_type(str, optional): the type of run, for grouping runs together. Default: None
Examples:
.. code-block:: python
import paddle
import paddle.vision.transforms as T
from paddle.static import InputSpec
inputs = [InputSpec([-1, 1, 28, 28], 'float32', 'image')]
labels = [InputSpec([None, 1], 'int64', 'label')]
transform = T.Compose([
T.Transpose(),
T.Normalize([127.5], [127.5])
])
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
eval_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
net = paddle.vision.models.LeNet()
model = paddle.Model(net, inputs, labels)
optim = paddle.optimizer.Adam(0.001, parameters=net.parameters())
model.prepare(optimizer=optim,
loss=paddle.nn.CrossEntropyLoss(),
metrics=paddle.metric.Accuracy())
## uncomment following lines to fit model with wandb callback function
# callback = paddle.callbacks.WandbCallback(project='paddle_mnist')
# model.fit(train_dataset, eval_dataset, batch_size=64, callbacks=callback)
"""
def
__init__
(
self
,
project
=
None
,
entity
=
None
,
name
=
None
,
dir
=
None
,
mode
=
None
,
job_type
=
None
,
**
kwargs
):
self
.
wandb
=
try_import
(
"wandb"
,
"You want to use `wandb` which is not installed yet install it with `pip install wandb`"
,
)
self
.
wandb_args
=
dict
(
project
=
project
,
name
=
name
,
entity
=
entity
,
dir
=
dir
,
mode
=
mode
,
job_type
=
job_type
,
)
self
.
_run
=
None
self
.
wandb_args
.
update
(
**
kwargs
)
_
=
self
.
run
def
_is_write
(
self
):
return
ParallelEnv
().
local_rank
==
0
@
property
def
run
(
self
):
if
self
.
_is_write
():
if
self
.
_run
is
None
:
if
self
.
wandb
.
run
is
not
None
:
warnings
.
warn
(
"There is a wandb run already in progress and newly created instances"
" of `WandbCallback` will reuse this run. If this is not desired"
" , call `wandb.finish()` before instantiating `WandbCallback`."
)
self
.
_run
=
self
.
wandb
.
run
else
:
self
.
_run
=
self
.
wandb
.
init
(
**
self
.
wandb_args
)
return
self
.
_run
def
on_train_begin
(
self
,
logs
=
None
):
self
.
epochs
=
self
.
params
[
'epochs'
]
assert
self
.
epochs
self
.
train_metrics
=
self
.
params
[
'metrics'
]
assert
self
.
train_metrics
self
.
_is_fit
=
True
self
.
train_step
=
0
if
self
.
_is_write
():
self
.
run
.
define_metric
(
"train/step"
)
self
.
run
.
define_metric
(
"train/*"
,
step_metric
=
"train/step"
)
self
.
run
.
define_metric
(
"epoch"
)
self
.
run
.
define_metric
(
"eval/*"
,
step_metric
=
"epoch"
)
def
on_epoch_begin
(
self
,
epoch
,
logs
=
None
):
self
.
steps
=
self
.
params
[
'steps'
]
self
.
epoch
=
epoch
def
_updates
(
self
,
logs
,
mode
):
if
not
self
.
_is_write
():
return
metrics
=
getattr
(
self
,
'%s_metrics'
%
(
mode
))
current_step
=
getattr
(
self
,
'%s_step'
%
(
mode
))
_metrics
=
dict
()
if
mode
==
'train'
:
total_step
=
current_step
_metrics
.
update
({
'train/step'
:
total_step
})
else
:
total_step
=
self
.
epoch
_metrics
.
update
({
'epoch'
:
total_step
})
for
k
in
metrics
:
if
k
in
logs
:
temp_tag
=
mode
+
'/'
+
k
if
isinstance
(
logs
[
k
],
(
list
,
tuple
)):
_metrics
.
update
({
temp_tag
:
logs
[
k
][
0
]})
elif
isinstance
(
logs
[
k
],
numbers
.
Number
):
_metrics
.
update
({
temp_tag
:
logs
[
k
]})
else
:
continue
self
.
run
.
log
(
_metrics
)
def
on_train_batch_end
(
self
,
step
,
logs
=
None
):
logs
=
logs
or
{}
self
.
train_step
+=
1
if
self
.
_is_write
():
self
.
_updates
(
logs
,
'train'
)
def
on_eval_begin
(
self
,
logs
=
None
):
self
.
eval_steps
=
logs
.
get
(
'steps'
,
None
)
self
.
eval_metrics
=
logs
.
get
(
'metrics'
,
[])
self
.
eval_step
=
0
self
.
evaled_samples
=
0
def
on_train_end
(
self
,
logs
=
None
):
if
self
.
_is_write
():
self
.
run
.
finish
()
def
on_eval_end
(
self
,
logs
=
None
):
if
self
.
_is_write
():
self
.
_updates
(
logs
,
'eval'
)
if
(
not
hasattr
(
self
,
'_is_fit'
))
and
hasattr
(
self
,
'run'
):
self
.
run
.
finish
()
delattr
(
self
,
'run'
)
class
ReduceLROnPlateau
(
Callback
):
"""Reduce learning rate when a metric of evaluation has stopped improving.
Models often benefit from reducing the learning rate by a factor
...
...
python/paddle/tests/CMakeLists.txt
浏览文件 @
40ce7f4a
...
...
@@ -66,6 +66,7 @@ set_tests_properties(test_vision_models PROPERTIES TIMEOUT 120)
set_tests_properties
(
test_dataset_uci_housing PROPERTIES TIMEOUT 120
)
set_tests_properties
(
test_dataset_imdb PROPERTIES TIMEOUT 300
)
set_tests_properties
(
test_pretrained_model PROPERTIES TIMEOUT 600
)
set_tests_properties
(
test_callback_wandb PROPERTIES TIMEOUT 60
)
if
(
WITH_COVERAGE
)
set_tests_properties
(
test_hapi_hub PROPERTIES TIMEOUT 300
)
endif
()
...
...
python/paddle/tests/test_callback_wandb.py
0 → 100644
浏览文件 @
40ce7f4a
# Copyright (c) 2022 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.
import
tempfile
import
unittest
import
paddle.vision.transforms
as
T
from
paddle.static
import
InputSpec
from
paddle.vision.datasets
import
MNIST
import
paddle
from
paddle.fluid.framework
import
_test_eager_guard
class
MnistDataset
(
MNIST
):
def
__len__
(
self
):
return
512
class
TestWandbCallbacks
(
unittest
.
TestCase
):
def
setUp
(
self
):
self
.
save_dir
=
tempfile
.
mkdtemp
()
def
func_wandb_callback
(
self
):
inputs
=
[
InputSpec
([
-
1
,
1
,
28
,
28
],
'float32'
,
'image'
)]
labels
=
[
InputSpec
([
None
,
1
],
'int64'
,
'label'
)]
transform
=
T
.
Compose
([
T
.
Transpose
(),
T
.
Normalize
([
127.5
],
[
127.5
])])
train_dataset
=
MnistDataset
(
mode
=
'train'
,
transform
=
transform
)
eval_dataset
=
MnistDataset
(
mode
=
'test'
,
transform
=
transform
)
net
=
paddle
.
vision
.
models
.
LeNet
()
model
=
paddle
.
Model
(
net
,
inputs
,
labels
)
optim
=
paddle
.
optimizer
.
Adam
(
0.001
,
parameters
=
net
.
parameters
())
model
.
prepare
(
optimizer
=
optim
,
loss
=
paddle
.
nn
.
CrossEntropyLoss
(),
metrics
=
paddle
.
metric
.
Accuracy
(),
)
callback
=
paddle
.
callbacks
.
WandbCallback
(
project
=
'random'
,
dir
=
self
.
save_dir
,
anonymous
=
'must'
,
mode
=
'offline'
,
)
model
.
fit
(
train_dataset
,
eval_dataset
,
batch_size
=
64
,
callbacks
=
callback
)
def
test_wandb_callback
(
self
):
with
_test_eager_guard
():
self
.
func_wandb_callback
()
self
.
func_wandb_callback
()
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/tests/test_utils_lazyimport.py
0 → 100644
浏览文件 @
40ce7f4a
# Copyright (c) 2022 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.
import
unittest
from
paddle.utils.lazy_import
import
try_import
class
TestUtilsLazyImport
(
unittest
.
TestCase
):
def
setup
(
self
):
pass
def
func_test_lazy_import
(
self
):
paddle
=
try_import
(
'paddle'
)
self
.
assertTrue
(
paddle
.
__version__
is
not
None
)
with
self
.
assertRaises
(
ImportError
)
as
context
:
paddle2
=
try_import
(
'paddle2'
)
self
.
assertTrue
(
'require additional dependencies that have to be'
in
str
(
context
.
exception
)
)
with
self
.
assertRaises
(
ImportError
)
as
context
:
paddle2
=
try_import
(
'paddle2'
,
'paddle2 is not installed'
)
self
.
assertTrue
(
'paddle2 is not installed'
in
str
(
context
.
exception
))
def
test_lazy_import
(
self
):
self
.
func_test_lazy_import
()
if
__name__
==
"__main__"
:
unittest
.
main
()
python/paddle/utils/lazy_import.py
浏览文件 @
40ce7f4a
...
...
@@ -18,7 +18,7 @@ import importlib
__all__
=
[]
def
try_import
(
module_name
):
def
try_import
(
module_name
,
err_msg
=
None
):
"""Try importing a module, with an informative error message on failure."""
install_name
=
module_name
...
...
@@ -32,9 +32,10 @@ def try_import(module_name):
mod
=
importlib
.
import_module
(
module_name
)
return
mod
except
ImportError
:
err_msg
=
(
"Failed importing {}. This likely means that some paddle modules "
"require additional dependencies that have to be "
"manually installed (usually with `pip install {}`). "
).
format
(
module_name
,
install_name
)
if
err_msg
is
None
:
err_msg
=
(
"Failed importing {}. This likely means that some paddle modules "
"require additional dependencies that have to be "
"manually installed (usually with `pip install {}`). "
).
format
(
module_name
,
install_name
)
raise
ImportError
(
err_msg
)
python/unittest_py/requirements.txt
浏览文件 @
40ce7f4a
...
...
@@ -17,3 +17,4 @@ numpy>=1.20,<1.22; python_version >= "3.7"
autograd==1.4
librosa==0.8.1
parameterized
wandb>=0.13
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录