Skip to content

Commit cd7350e

Browse files
committed
Merge branch 'release-v0.96'
============================== Release Notes: v0.96 ============================== Support for new layers: - Log softmax - Basic math functions - Weights layer, which outputs a weights tensor - L2 norm squared - Binary cross entropy loss and sigmoid binary cross entropy loss - Boolean accuracy, Boolean false negative rate, Boolean false positive rate - Bilinear resize - Variance and covariance - Dilated and grouped convolution (GPU only) Performance optimizations: - Optimized GPU model-parallel softmax layer Model portability & usability: - Option for weight initialization with user-provided list of values - Callback to save any layer output as an image Internal features: - Provide compile time option to selectively disable OpenMP for data fetching loop - Thrust calls no longer involve the default CUDA stream I/O & data readers: - Reworked jag_conduit data reader: - Support the updated JAG simulation data output format - Use direct HDF5 I/O for on-demand data loading with Conduit - Ingest a unique set of data files per instance - Allow exclusive data partitioning among multiple trainers - Multi-channel images - Normalization of JAG data - Interface to select images of specific views and time indices - Interface to describe how to slice JAG data - Avoid redundant fetching and incoherent random number pulls in the group of local data readers - Improved threading performance by preallocating scratch space for loading samples Build system: - Support cross-compilation configurations in superbuild and SetupProtobuf
2 parents ffecbef + 07d6f36 commit cd7350e

296 files changed

Lines changed: 20185 additions & 10130 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 76 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,45 @@ endif ()
3737
# Version setup
3838
#
3939

40+
set(LBANN_VERSION_MAJOR 0)
41+
set(LBANN_VERSION_MINOR 96)
42+
43+
set(LBANN_VERSION "${LBANN_VERSION_MAJOR}.${LBANN_VERSION_MINOR}")
44+
4045
# Check to see if we are in a git repo
41-
execute_process(
42-
COMMAND git rev-parse --is-inside-work-tree
43-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
44-
OUTPUT_VARIABLE GIT_REPO
45-
OUTPUT_STRIP_TRAILING_WHITESPACE)
46-
47-
if (GIT_REPO)
48-
# Get the git version so that we can embed it into the executable
46+
find_program(__GIT_EXECUTABLE git)
47+
mark_as_advanced(__GIT_EXECUTABLE)
48+
if (__GIT_EXECUTABLE)
49+
4950
execute_process(
50-
COMMAND git --git-dir .git describe --abbrev=7 --dirty --always --tags
51-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
52-
OUTPUT_VARIABLE GIT_VERSION
51+
COMMAND ${__GIT_EXECUTABLE} rev-parse --is-inside-work-tree
52+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
53+
OUTPUT_VARIABLE __BUILDING_FROM_GIT_SOURCES
5354
OUTPUT_STRIP_TRAILING_WHITESPACE)
54-
set(${UPPER_PROJECT_NAME}_VERSION ${GIT_VERSION}
55-
CACHE STRING "LBANN's version string")
56-
else ()
57-
set(${UPPER_PROJECT_NAME}_VERSION v0.95
58-
CACHE STRING "LBANN's version string")
59-
endif (GIT_REPO)
55+
56+
if (__BUILDING_FROM_GIT_SOURCES)
57+
# Get the git version so that we can embed it into the executable
58+
execute_process(
59+
COMMAND ${__GIT_EXECUTABLE} rev-parse --show-toplevel
60+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
61+
OUTPUT_VARIABLE __GIT_TOPLEVEL_DIR
62+
OUTPUT_STRIP_TRAILING_WHITESPACE)
63+
execute_process(
64+
COMMAND ${__GIT_EXECUTABLE} rev-parse --git-dir
65+
WORKING_DIRECTORY "${__GIT_TOPLEVEL_DIR}"
66+
OUTPUT_VARIABLE __GIT_GIT_DIR
67+
OUTPUT_STRIP_TRAILING_WHITESPACE)
68+
execute_process(
69+
COMMAND ${__GIT_EXECUTABLE} --git-dir "${__GIT_GIT_DIR}" describe
70+
--abbrev=7 --always --dirty --tags
71+
WORKING_DIRECTORY "${__GIT_TOPLEVEL_DIR}"
72+
OUTPUT_VARIABLE __GIT_DESCRIBE_VERSION
73+
OUTPUT_STRIP_TRAILING_WHITESPACE)
74+
75+
set(LBANN_GIT_VERSION "${__GIT_DESCRIBE_VERSION}"
76+
CACHE STRING "LBANN's version string as told by git.")
77+
endif (__BUILDING_FROM_GIT_SOURCES)
78+
endif (__GIT_EXECUTABLE)
6079

6180
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
6281
set(LBANN_GNU_LINUX TRUE)
@@ -214,7 +233,7 @@ endif (LBANN_HAS_CUDA)
214233
# guarantee. There's no harm including it multiple times.
215234
find_library(DL_LIBRARY dl DOC "The dynamic loader library.")
216235
if (DL_LIBRARY)
217-
message("Found dl: ${DL_LIBRARY}")
236+
message(STATUS "Found dl: ${DL_LIBRARY}")
218237
else ()
219238
message(FATAL_ERROR
220239
"dl library not found! This is a required library.\n"
@@ -401,32 +420,47 @@ get_directory_property( DirDefs COMPILE_DEFINITIONS )
401420
# Configuration summary
402421
################################################################
403422

404-
message("== Configuration Summary ==")
405-
message(" PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
406-
message(" PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
407-
message(" CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
408-
message(" CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
423+
# NOTE: message() outputs to stderr by default. We now use a string to
424+
# maintain this information and then have cmake echo it to stdout. The
425+
# only side effects are that if you use the CMake GUI, you won't see
426+
# this output anymore (they only report stderr) and that if you add
427+
# something to the list, you must remember your newline!
428+
set(_str "== Configuration Summary ==\n")
429+
string(APPEND _str " PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}\n"
430+
" PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}\n"
431+
" CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}\n"
432+
" CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n")
409433
if (CMAKE_BUILD_TYPE MATCHES None)
410-
message(" CXX FLAGS: ${CMAKE_CXX_FLAGS}")
434+
string(APPEND _str
435+
" CXX FLAGS: ${CMAKE_CXX_FLAGS}\n")
411436
elseif (CMAKE_BUILD_TYPE MATCHES Release)
412-
message(" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
437+
string(APPEND _str
438+
" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}\n")
413439
elseif (CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
414-
message(" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
440+
string(APPEND _str
441+
" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}\n")
415442
elseif (CMAKE_BUILD_TYPE MATCHES Debug)
416-
message(" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
443+
string(APPEND _str
444+
" CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}\n")
417445
endif ()
418-
message(" LBANN_GNU_LINUX: ${LBANN_GNU_LINUX}")
419-
message(" LBANN_HAS_HYDROGEN: ${LBANN_HAS_HYDROGEN}")
420-
message(" LBANN_HAS_OPENCV: ${LBANN_HAS_OPENCV}")
421-
message(" LBANN_HAS_CUDA: ${LBANN_HAS_CUDA}")
422-
message(" LBANN_HAS_CUDNN: ${LBANN_HAS_CUDNN}")
423-
message(" LBANN_HAS_NCCL2: ${LBANN_HAS_NCCL2}")
424-
message(" LBANN_HAS_PROTOBUF: ${LBANN_HAS_PROTOBUF}")
425-
message(" LBANN_HAS_CNPY: ${LBANN_HAS_CNPY}")
426-
message(" LBANN_HAS_TBINF: ${LBANN_HAS_TBINF}")
427-
message(" LBANN_HAS_VTUNE: ${LBANN_HAS_VTUNE}")
428-
message(" LBANN_NVPROF: ${LBANN_NVPROF}")
429-
message(" LBANN_HAS_DOXYGEN: ${LBANN_HAS_DOXYGEN}")
430-
message(" LBANN_HAS_LBANN_PROTO:${LBANN_HAS_LBANN_PROTO}")
431-
message(" LBANN_HAS_ALUMINUM: ${LBANN_HAS_ALUMINUM}")
432-
message(" LBANN_HAS_CONDUIT: ${LBANN_HAS_CONDUIT}")
446+
string(APPEND _str
447+
" LBANN_GNU_LINUX: ${LBANN_GNU_LINUX}\n"
448+
" LBANN_HAS_HYDROGEN: ${LBANN_HAS_HYDROGEN}\n"
449+
" LBANN_HAS_OPENCV: ${LBANN_HAS_OPENCV}\n"
450+
" LBANN_HAS_CUDA: ${LBANN_HAS_CUDA}\n"
451+
" LBANN_HAS_CUDNN: ${LBANN_HAS_CUDNN}\n"
452+
" LBANN_HAS_NCCL2: ${LBANN_HAS_NCCL2}\n"
453+
" LBANN_HAS_PROTOBUF: ${LBANN_HAS_PROTOBUF}\n"
454+
" LBANN_HAS_CNPY: ${LBANN_HAS_CNPY}\n"
455+
" LBANN_HAS_TBINF: ${LBANN_HAS_TBINF}\n"
456+
" LBANN_HAS_VTUNE: ${LBANN_HAS_VTUNE}\n"
457+
" LBANN_NVPROF: ${LBANN_NVPROF}\n"
458+
" LBANN_HAS_DOXYGEN: ${LBANN_HAS_DOXYGEN}\n"
459+
" LBANN_HAS_LBANN_PROTO:${LBANN_HAS_LBANN_PROTO}\n"
460+
" LBANN_HAS_ALUMINUM: ${LBANN_HAS_ALUMINUM}\n"
461+
" LBANN_HAS_CONDUIT: ${LBANN_HAS_CONDUIT}\n"
462+
" LBANN_NO_OMP_FOR_DATA_READERS: ${LBANN_NO_OMP_FOR_DATA_READERS}\n")
463+
464+
# Output to stdout
465+
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${_str}")
466+
set(_str)

ReleaseNotes.txt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,59 @@
1+
============================== (Pending) Release Notes: v0.97 ==============================
2+
Support for new training algorithms:
3+
4+
Support for new network structures:
5+
6+
Support for new layers:
7+
8+
Performance optimizations:
9+
10+
Model portability & usability:
11+
12+
Internal features:
13+
14+
I/O & data readers:
15+
16+
Build system:
17+
18+
============================== Release Notes: v0.96 ==============================
19+
Support for new layers:
20+
- Log softmax
21+
- Basic math functions
22+
- Weights layer, which outputs a weights tensor
23+
- L2 norm squared
24+
- Binary cross entropy loss and sigmoid binary cross entropy loss
25+
- Boolean accuracy, Boolean false negative rate, Boolean false positive rate
26+
- Bilinear resize
27+
- Variance and covariance
28+
- Dilated and grouped convolution (GPU only)
29+
30+
Performance optimizations:
31+
- Optimized GPU model-parallel softmax layer
32+
33+
Model portability & usability:
34+
- Option for weight initialization with user-provided list of values
35+
- Callback to save any layer output as an image
36+
37+
Internal features:
38+
- Provide compile time option to selectively disable OpenMP for data fetching loop
39+
- Thrust calls no longer involve the default CUDA stream
40+
41+
I/O & data readers:
42+
- Reworked jag_conduit data reader:
43+
- Support the updated JAG simulation data output format
44+
- Use direct HDF5 I/O for on-demand data loading with Conduit
45+
- Ingest a unique set of data files per instance
46+
- Allow exclusive data partitioning among multiple trainers
47+
- Multi-channel images
48+
- Normalization of JAG data
49+
- Interface to select images of specific views and time indices
50+
- Interface to describe how to slice JAG data
51+
- Avoid redundant fetching and incoherent random number pulls in the group of local data readers
52+
- Improved threading performance by preallocating scratch space for loading samples
53+
54+
Build system:
55+
- Support cross-compilation configurations in superbuild and SetupProtobuf
56+
157
============================== Release Notes: v0.95 ==============================
258
Support for new training algorithms:
359
- Generative Adversarial Networks (GAN)

bamboo/unit_tests/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.cache

bamboo/unit_tests/error/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*
2+
!.gitignore
3+
!README.md
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*
2+
!.gitignore
3+
!README.md

bamboo/unit_tests/test_unit_conv_graph.py

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import sys
2+
sys.path.insert(0, '../common_python')
3+
import tools
4+
import pytest
5+
import os
6+
7+
def skeleton_layer_covariance(cluster, executables, dir_name, compiler_name):
8+
if compiler_name not in executables:
9+
pytest.skip('default_exes[%s] does not exist' % compiler_name)
10+
output_file_name = '%s/bamboo/unit_tests/output/layer_covariance_%s_output.txt' % (dir_name, compiler_name)
11+
error_file_name = '%s/bamboo/unit_tests/error/layer_covariance_%s_error.txt' % (dir_name, compiler_name)
12+
command = tools.get_command(
13+
cluster=cluster, executable=executables[compiler_name], num_nodes=1, num_processes=2, dir_name=dir_name,
14+
data_filedir_default='', data_reader_name='synthetic',
15+
model_folder='tests/layer_tests', model_name='covariance', optimizer_name='sgd',
16+
output_file_name=output_file_name, error_file_name=error_file_name)
17+
return_code = os.system(command)
18+
assert return_code == 0
19+
20+
def test_unit_layer_covariance_clang4(cluster, exes, dirname):
21+
skeleton_layer_covariance(cluster, exes, dirname, 'clang4')
22+
23+
def test_unit_layer_covariance_gcc4_check(cluster, exes, dirname):
24+
if cluster in ['surface']:
25+
pytest.skip('FIXME')
26+
# Surface Errors:
27+
# assert 34304 == 0
28+
skeleton_layer_covariance(cluster, exes, dirname, 'gcc4')
29+
30+
def test_unit_layer_covariance_gcc7(cluster, exes, dirname):
31+
skeleton_layer_covariance(cluster, exes, dirname, 'gcc7')
32+
33+
def test_unit_layer_covariance_intel18(cluster, exes, dirname):
34+
skeleton_layer_covariance(cluster, exes, dirname, 'intel18')
35+
36+
# Run with python -m pytest -s test_unit_ridge_regression.py -k 'test_unit_layer_covariance_exe' --exe=<executable>
37+
def test_unit_layer_covariance_exe(cluster, dirname, exe):
38+
if exe == None:
39+
pytest.skip('Non-local testing')
40+
exes = {'exe' : exe}
41+
skeleton_layer_covariance(cluster, exes, dirname, 'exe')
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import sys
2+
sys.path.insert(0, '../common_python')
3+
import tools
4+
import pytest
5+
import os
6+
7+
def skeleton_layer_l2_norm2(cluster, executables, dir_name, compiler_name):
8+
if compiler_name not in executables:
9+
pytest.skip('default_exes[%s] does not exist' % compiler_name)
10+
output_file_name = '%s/bamboo/unit_tests/output/layer_l2_norm2_%s_output.txt' % (dir_name, compiler_name)
11+
error_file_name = '%s/bamboo/unit_tests/error/layer_l2_norm2_%s_error.txt' % (dir_name, compiler_name)
12+
command = tools.get_command(
13+
cluster=cluster, executable=executables[compiler_name], num_nodes=1, num_processes=2, dir_name=dir_name,
14+
data_filedir_default='', data_reader_name='synthetic',
15+
model_folder='tests/layer_tests', model_name='l2_norm2', optimizer_name='sgd',
16+
output_file_name=output_file_name, error_file_name=error_file_name)
17+
return_code = os.system(command)
18+
assert return_code == 0
19+
20+
def test_unit_layer_l2_norm2_clang4(cluster, exes, dirname):
21+
skeleton_layer_l2_norm2(cluster, exes, dirname, 'clang4')
22+
23+
def test_unit_layer_l2_norm2_gcc4_check(cluster, exes, dirname):
24+
if cluster in ['surface']:
25+
pytest.skip('FIXME')
26+
# Surface Errors:
27+
# assert 34304 == 0
28+
skeleton_layer_l2_norm2(cluster, exes, dirname, 'gcc4')
29+
30+
def test_unit_layer_l2_norm2_gcc7(cluster, exes, dirname):
31+
skeleton_layer_l2_norm2(cluster, exes, dirname, 'gcc7')
32+
33+
def test_unit_layer_l2_norm2_intel18(cluster, exes, dirname):
34+
skeleton_layer_l2_norm2(cluster, exes, dirname, 'intel18')
35+
36+
# Run with python -m pytest -s test_unit_ridge_regression.py -k 'test_unit_layer_l2_norm2_exe' --exe=<executable>
37+
def test_unit_layer_l2_norm2_exe(cluster, dirname, exe):
38+
if exe == None:
39+
pytest.skip('Non-local testing')
40+
exes = {'exe' : exe}
41+
skeleton_layer_l2_norm2(cluster, exes, dirname, 'exe')
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import sys
2+
sys.path.insert(0, '../common_python')
3+
import tools
4+
import pytest
5+
import os
6+
7+
def skeleton_layer_log_softmax(cluster, executables, dir_name, compiler_name):
8+
if compiler_name not in executables:
9+
pytest.skip('default_exes[%s] does not exist' % compiler_name)
10+
output_file_name = '%s/bamboo/unit_tests/output/layer_log_softmax_%s_output.txt' % (dir_name, compiler_name)
11+
error_file_name = '%s/bamboo/unit_tests/error/layer_log_softmax_%s_error.txt' % (dir_name, compiler_name)
12+
command = tools.get_command(
13+
cluster=cluster, executable=executables[compiler_name], num_nodes=1, num_processes=2, dir_name=dir_name,
14+
data_filedir_default='', data_reader_name='synthetic',
15+
model_folder='tests/layer_tests', model_name='log_softmax', optimizer_name='sgd',
16+
output_file_name=output_file_name, error_file_name=error_file_name)
17+
return_code = os.system(command)
18+
assert return_code == 0
19+
20+
def test_unit_layer_log_softmax_clang4(cluster, exes, dirname):
21+
skeleton_layer_log_softmax(cluster, exes, dirname, 'clang4')
22+
23+
def test_unit_layer_log_softmax_gcc4_check(cluster, exes, dirname):
24+
if cluster in ['surface']:
25+
pytest.skip('FIXME')
26+
# Surface Errors:
27+
# assert 34304 == 0
28+
skeleton_layer_log_softmax(cluster, exes, dirname, 'gcc4')
29+
30+
def test_unit_layer_log_softmax_gcc7(cluster, exes, dirname):
31+
skeleton_layer_log_softmax(cluster, exes, dirname, 'gcc7')
32+
33+
def test_unit_layer_log_softmax_intel18(cluster, exes, dirname):
34+
skeleton_layer_log_softmax(cluster, exes, dirname, 'intel18')
35+
36+
# Run with python -m pytest -s test_unit_ridge_regression.py -k 'test_unit_layer_log_softmax_exe' --exe=<executable>
37+
def test_unit_layer_log_softmax_exe(cluster, dirname, exe):
38+
if exe == None:
39+
pytest.skip('Non-local testing')
40+
exes = {'exe' : exe}
41+
skeleton_layer_log_softmax(cluster, exes, dirname, 'exe')

0 commit comments

Comments
 (0)