Skip to content

Reusable #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 89 commits into
base: easy-to-use
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
5f93c72
Minor style & documentation updates
duncanka Jan 15, 2017
51cda20
Made TrainingCorpus an intermediate level in the hierarchy
duncanka Jan 15, 2017
4423e46
Unified sentence-reading for oracle transition readers
duncanka Jan 15, 2017
5e27f5b
Fixed build settings to be better cmake style
duncanka Jan 15, 2017
1514d35
Split up transition-reading code
duncanka Jan 15, 2017
a49a559
Moved string replacement function
duncanka Jan 15, 2017
39d0efc
Moved recording functions into base training corpus reader
duncanka Jan 15, 2017
40ec8b8
Style fix
duncanka Jan 16, 2017
0401383
Indentation fix
duncanka Jan 16, 2017
dfd6a6e
Cleaned up oracle action recording a bit
duncanka Jan 16, 2017
1991a75
Switched action-to-label to be more general and use boost::regex
duncanka Jan 16, 2017
566cf57
Removed unnecessary record fn params; added vocab copy ctor
duncanka Jan 16, 2017
96fadfc
Fixed training command in README
duncanka Jan 20, 2017
9fc237d
Correct-count pointer for logprob defaults to null
duncanka Jan 24, 2017
651a3ca
Minor variable name cleanup for consistency
duncanka Jan 24, 2017
e6afc73
Allowed accessing final parser state outside LogProbParser
duncanka Jan 31, 2017
3f77fcf
Fixed command line processing to output help if no args given
duncanka Jan 31, 2017
6975c90
More naming consistency
duncanka Jan 31, 2017
0f05ecd
Got rid of meaningless 'err' reporting when evaluating
duncanka Jan 31, 2017
01736cb
Added logprob from NN to ParseTree data structure
duncanka Jan 31, 2017
c693089
Some typedefs
duncanka Feb 2, 2017
a77168d
Switched everything over to Sentence objects
duncanka Feb 2, 2017
6a90c5e
Replaced some map find() calls with at() calls
duncanka Feb 6, 2017
014cd26
Removed old comment
duncanka Feb 27, 2017
95ab82f
Added checks for files being provided and successfully opened
duncanka Mar 1, 2017
0b9684b
Abstracted out much of the LSTM transition tagger architecture
duncanka Mar 1, 2017
ee8966e
Fixed handling of -w flag
duncanka Mar 1, 2017
f8c2aca
Lint
duncanka Mar 1, 2017
1b49452
A bit of rearranging within the inheritance hierarchy
duncanka Mar 1, 2017
818eac8
Updated ShouldTerminate interface
duncanka Mar 1, 2017
2030e20
Minor API and code cleanup
duncanka Mar 1, 2017
751d3af
Better code structure for unknown word replacement
duncanka Mar 2, 2017
543eb38
Made vocab not a public member
duncanka Mar 2, 2017
61142af
Renamed to neural transition tagger; cleaned up API a bit
duncanka Mar 5, 2017
788f7c3
Formatting
duncanka Mar 6, 2017
1d518e3
Got rid of dumb corpus copy constructor
duncanka Mar 6, 2017
14636cb
Attempted to marginally reduce memory usage
duncanka Mar 7, 2017
90076a8
Changed CNN build to always optimize, even for debug builds
duncanka Mar 7, 2017
069189e
Made it easier to print Sentence objects
duncanka Mar 8, 2017
bcfe82d
Fixed nasty bug with handling of completely unknown words
duncanka Mar 8, 2017
ae363f4
More sensible storage for correct actions in corpus reading
duncanka Mar 9, 2017
21279da
Minor memory optimizations
duncanka Mar 9, 2017
ff988c3
Added assertion for too many training actions
duncanka Mar 9, 2017
e2f4cee
Minor logging change
duncanka Mar 16, 2017
b2cec9b
Simplified RecoverParseTree
duncanka Mar 16, 2017
a88be9d
Whitespace cleanup
duncanka Mar 16, 2017
4e269c8
Added function to check if a parse tree is labeled
duncanka Mar 16, 2017
f38c407
Made ParseTree wrap sentence reference to allow move assignment
duncanka Mar 16, 2017
481fdba
Simplified tagger interface
duncanka Mar 16, 2017
33f5182
More constness
duncanka Mar 16, 2017
81f9ef7
Added copy/move constructors to ParseTree
duncanka Mar 17, 2017
b360d62
Const-ness change
duncanka Mar 17, 2017
3e8a275
Added root child to ParseTree representation
duncanka Mar 18, 2017
7599db1
Relinquish CNN memory when replacing a model
duncanka Mar 18, 2017
415f084
Fixed memory leak
duncanka Mar 18, 2017
0be98ff
Patched memory leak
duncanka Mar 18, 2017
e25679a
Fixed another memory leak
duncanka Mar 18, 2017
5d2b814
Added WordForToken convenience function to Sentence
duncanka Mar 19, 2017
9f74cb0
Made CNN initialization return the random seed
duncanka Mar 19, 2017
e27f330
A bit of cleanup
duncanka Mar 19, 2017
5a22567
Minor memory management improvement
duncanka Mar 20, 2017
478e3ff
Possible minor memory management improvement
duncanka Mar 21, 2017
9c2be25
Made main LogProbTagger public
duncanka Mar 21, 2017
4e470b9
Minor parameter order change
duncanka Mar 21, 2017
24d9e5c
Sensible default params for LogProbTagger
duncanka Mar 21, 2017
88e1af0
Don't use reference actions in test, even if they're specified
duncanka Mar 21, 2017
c97a0f4
*Do* still update the correct count if applicable, even in dev
duncanka Mar 21, 2017
0e065e0
Can now shrink a memory pool back down w/o clearing entirely
duncanka Mar 21, 2017
3662e8e
Attempted to get GPU compilation working
duncanka Apr 20, 2017
ae6f7c9
Unused final parser state -> expose arbitrary network states
duncanka Apr 21, 2017
43dd29a
Switched to map for states to expose
duncanka Apr 21, 2017
7a02eb5
Code formatting
duncanka Apr 21, 2017
9124b54
Expose tree node embeddings
duncanka Apr 24, 2017
93e5708
Exposed whether tagger is in training to subclass functions
duncanka Apr 26, 2017
bfcea60
Minor formatting
duncanka Apr 27, 2017
5619f81
Added optional ParseTree pointer to Sentence
duncanka May 2, 2017
d7902d9
Fixed assertion bug
duncanka May 3, 2017
5653ab7
Added num_values() to CNN LookupParameters
duncanka May 21, 2017
372cdea
Made all TaggerStates modifiable by overriding subclass member fns
duncanka May 23, 2017
c8d7685
Made Sentences swappable (also more efficient GetWord default)
duncanka Jun 4, 2017
8b6d315
Fixed Sentence swap function
duncanka Jun 4, 2017
7d07464
Updated test command line in README to latest flags
duncanka Sep 17, 2017
d62ddb8
Merge branch 'easy-to-use' into reusable
duncanka Sep 17, 2017
741dad6
Deleted dead variable declaration
duncanka Oct 3, 2017
a4670be
Enabled GetActionProbabilities to signal that oracle action should be…
duncanka Oct 3, 2017
53756b2
Allowed attaching metadata to Sentence objects
duncanka Oct 13, 2018
13f4e6b
Fixed Sentence printer for non-training corpora
duncanka Oct 14, 2018
be9091d
Improved sentence metadata handling; create dir for model if needed
duncanka Nov 17, 2019
a951527
Updated WordForToken to allow iterator hinting for speed
duncanka Nov 17, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
project(lstm-parser)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif(NOT CMAKE_BUILD_TYPE)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -O3 -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")

enable_testing()

Expand All @@ -16,7 +20,7 @@ if(DEFINED ENV{BOOST_ROOT})
set(Boost_NO_SYSTEM_PATHS ON)
endif()
set(Boost_REALPATH ON)
find_package(Boost COMPONENTS program_options serialization iostreams REQUIRED)
find_package(Boost COMPONENTS program_options serialization iostreams regex filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
set(LIBS ${LIBS} ${Boost_LIBRARIES})

Expand All @@ -26,6 +30,6 @@ include_directories(${EIGEN3_INCLUDE_DIR})

#configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)

add_subdirectory(cnn/cnn)
add_subdirectory(cnn)
# add_subdirectory(cnn/examples)
add_subdirectory(parser)
add_subdirectory(parser)
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Given a `training.conll` file and a `development.conll` formatted according to t
java -jar ParserOracleArcStdWithSwap.jar -t -1 -l 1 -c training.conll > trainingOracle.txt
java -jar ParserOracleArcStdWithSwap.jar -t -1 -l 1 -c development.conll > devOracle.txt

parser/lstm-parse -P -t trainingOracle.txt -d devOracle.txt --hidden_dim 100 --lstm_input_dim 100 -w sskip.100.vectors --rel_dim 20 --action_dim 20
parser/lstm-parse --train -t trainingOracle.txt -d devOracle.txt --hidden_dim 100 --lstm_input_dim 100 --words sskip.100.vectors --rel_dim 20 --action_dim 20 --use_pos_tags

Link to the word vectors used in the ACL 2015 paper for English: [sskip.100.vectors](https://drive.google.com/file/d/0B8nESzOdPhLsdWF2S1Ayb1RkTXc/view?usp=sharing).

Expand All @@ -43,7 +43,7 @@ There is a pretrained model for English [here](http://www.cs.cmu.edu/~jdunietz/h

Given a `test.conll` file formatted according to the [CoNLL data format](http://ilk.uvt.nl/conll/#dataformat):

parser/lstm-parse -m english_pos_2_32_100_20_100_12_20.params -t test.conll
parser/lstm-parse -m english_pos_2_32_100_20_100_12_20.params -T test.conll -s

If you are not using the pretrained model, you will need to replace the `.params` argument with the name of your own trained model file.

Expand Down
24 changes: 17 additions & 7 deletions cnn/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
project(cnn)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "Debug")

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

# CNN uses Eigen which exploits modern CPU architectures. To get the
Expand All @@ -10,7 +14,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
# 3. try compiler options like -march=native or other architecture
# flags (the compiler does not always make the best configuration
# decisions without help)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++14 -Ofast -g -DEIGEN_FAST_MATH -march=native")

enable_testing()

Expand Down Expand Up @@ -63,9 +67,11 @@ else()
endif()

if(BACKEND MATCHES "^eigen$")
set(WITH_EIGEN_BACKEND 1)
set(WITH_CUDA_BACKEND 0 CACHE INTERNAL "" FORCE)
set(WITH_EIGEN_BACKEND 1 CACHE INTERNAL "" FORCE)
elseif(BACKEND MATCHES "^cuda$")
set(WITH_CUDA_BACKEND 1)
set(WITH_CUDA_BACKEND 1 CACHE INTERNAL "" FORCE)
set(WITH_EIGEN_BACKEND 0 CACHE INTERNAL "" FORCE)
else()
message(SEND_ERROR "BACKEND must be eigen or cuda")
endif()
Expand Down Expand Up @@ -93,8 +99,12 @@ set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

option(CNN_CORE_ONLY "If off, won't build extra dirs like tests and examples" ON)

add_subdirectory(cnn)
add_subdirectory(tests)
add_subdirectory(examples)
add_subdirectory(rnnlm)
enable_testing()
if(NOT CNN_CORE_ONLY)
add_subdirectory(tests)
add_subdirectory(examples)
add_subdirectory(rnnlm)
enable_testing()
endif(NOT CNN_CORE_ONLY)
14 changes: 10 additions & 4 deletions cnn/cnn/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ set(cnn_library_HDRS
training.h
)

option(CNN_SHARED "Whether to build CNN shared libs" OFF)

if(WITH_CUDA_BACKEND)
list(APPEND cnn_library_SRCS
cuda.cc)
Expand Down Expand Up @@ -99,20 +101,24 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc)
# actual target:
add_library(cnn STATIC ${cnn_library_SRCS} ${cnn_library_HDRS})
target_link_libraries(cnn ${LIBS})
if(WITH_CUDA_BACKEND)
if(CNN_SHARED)
if(WITH_CUDA_BACKEND)
add_library(gcnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS})
target_link_libraries(gcnn_shared ${LIBS})
else()
else()
add_library(cnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS})
target_link_libraries(cnn_shared ${LIBS})
endif(WITH_CUDA_BACKEND)
endif(WITH_CUDA_BACKEND)
endif(CNN_SHARED)
#add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS})
if(WITH_CUDA_BACKEND)
set(CUDA_SEPARABLE_COMPILATION ON)
list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-Xcompiler;-fpic")
SET(CUDA_PROPAGATE_HOST_FLAGS OFF)
cuda_add_library(cnncuda STATIC gpu-ops.cu)
cuda_add_library(cnncuda_shared SHARED gpu-ops.cu)
if(CNN_SHARED)
cuda_add_library(cnncuda_shared SHARED gpu-ops.cu)
endif(CNN_SHARED)
endif(WITH_CUDA_BACKEND)

install(FILES ${cnn_library_HDRS} DESTINATION include/cnn)
Expand Down
10 changes: 10 additions & 0 deletions cnn/cnn/aligned-mem-pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace cnn {

class AlignedMemoryPool {
public:
typedef size_t PoolState;

explicit AlignedMemoryPool(size_t cap, MemAllocator* a) : a(a) {
sys_alloc(cap);
zero_all();
Expand Down Expand Up @@ -36,6 +38,14 @@ class AlignedMemoryPool {
bool is_shared() {
return shared;
}

PoolState get_state() const {
return used;
}

void restore_state(const PoolState& state) {
used = state;
}
private:
void sys_alloc(size_t cap) {
capacity = a->round_up_align(cap);
Expand Down
1 change: 1 addition & 0 deletions cnn/cnn/exec.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ ExecutionEngine::~ExecutionEngine() {}

void SimpleExecutionEngine::invalidate() {
num_nodes_evaluated = 0;
fxs->free();
}

const Tensor& SimpleExecutionEngine::forward() {
Expand Down
4 changes: 3 additions & 1 deletion cnn/cnn/init.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ static void RemoveArgs(int& argc, char**& argv, int& argi, int n) {
assert(argc >= 0);
}

void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_parameters) {
unsigned Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_parameters) {
vector<Device*> gpudevices;
#if HAVE_CUDA
cerr << "[cnn] initializing CUDA\n";
Expand Down Expand Up @@ -88,6 +88,8 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param
kSCALAR_ONE = default_device->kSCALAR_ONE;
kSCALAR_ZERO = default_device->kSCALAR_ZERO;
cerr << "[cnn] memory allocation done.\n";

return random_seed;
}

void Cleanup() {
Expand Down
2 changes: 1 addition & 1 deletion cnn/cnn/init.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace cnn {

void Initialize(int& argc, char**& argv, unsigned random_seed = 0, bool shared_parameters = false);
unsigned Initialize(int& argc, char**& argv, unsigned random_seed = 0, bool shared_parameters = false);
void Cleanup();

} // namespace cnn
Expand Down
1 change: 1 addition & 0 deletions cnn/cnn/model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ void LookupParameters::clear() {

Model::~Model() {
for (auto p : all_params) delete p;
default_device->mem->free(gradient_norm_scratch);
}

void Model::project_weights(float radius) {
Expand Down
10 changes: 10 additions & 0 deletions cnn/cnn/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct LookupParameters : public ParametersBase {
void squared_l2norm(float* sqnorm) const override;
void g_squared_l2norm(float* sqnorm) const override;
size_t size() const override;
size_t num_values() const { return values.size(); }
void Initialize(unsigned index, const std::vector<float>& val);

void copy(const LookupParameters & val);
Expand Down Expand Up @@ -103,6 +104,15 @@ struct LookupParameters : public ParametersBase {
class Model {
public:
Model() : gradient_norm_scratch() {}
Model(const Model&) = delete;
Model(Model&& m) {
all_params = std::move(m.all_params);
lookup_params = std::move(m.lookup_params);
params = std::move(m.params);
// Free our scratch memory before claiming the other model's.
default_device->mem->free(gradient_norm_scratch);
gradient_norm_scratch = m.gradient_norm_scratch;
}
~Model();
float gradient_l2_norm() const;
void reset_gradient();
Expand Down
8 changes: 7 additions & 1 deletion cnn/cnn/tensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "cnn/dim.h"
#include "cnn/random.h"
#include "cnn/aligned-mem-pool.h"
#include "devices.h"

#if HAVE_CUDA
#include <cuda.h>
Expand All @@ -26,6 +27,7 @@ namespace cnn {
#define EIGEN_BACKEND 1

typedef float real;
extern Device* default_device; // for allocating memory on a load

struct Tensor {
Tensor() = default;
Expand Down Expand Up @@ -160,8 +162,12 @@ struct Tensor {
float* vc = static_cast<float*>(std::malloc(d.size() * sizeof(float)));
ar & boost::serialization::make_array(vc, d.size());
CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice));
free(vc);
#else
v = static_cast<float*>(_mm_malloc(d.size() * sizeof(float), 32));
// UGLY HACK to avoid memory leak: node values and gradients don't get
// stored to disk; only parameters. So allocate memory for loading from the
// parameters pool.
v = static_cast<float*>(default_device->ps->allocate(d.size() * sizeof(float)));
ar & boost::serialization::make_array(v, d.size());
#endif
}
Expand Down
19 changes: 15 additions & 4 deletions parser/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
PROJECT(lstm-parser:parser)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

ADD_LIBRARY(lstm-parser-core lstm-parser.cc corpus.cc)
target_link_libraries(lstm-parser-core cnn ${Boost_LIBRARIES})

add_library(lstm-parser-core STATIC lstm-parser.cc corpus.cc
neural-transition-tagger.cpp)
ADD_EXECUTABLE(lstm-parse lstm-parser-driver.cc)
target_link_libraries(lstm-parse lstm-parser-core ${Boost_LIBRARIES})

if(WITH_CUDA_BACKEND)
add_dependencies(lstm-parser-core cnncuda)
target_link_libraries(lstm-parser-core cnncuda)
CUDA_ADD_CUBLAS_TO_TARGET(lstm-parser-core)

add_dependencies(lstm-parse cnncuda)
target_link_libraries(lstm-parse cnncuda)
CUDA_ADD_CUBLAS_TO_TARGET(lstm-parse)
endif(WITH_CUDA_BACKEND)

target_link_libraries(lstm-parser-core cnn ${Boost_LIBRARIES})
target_link_libraries(lstm-parse lstm-parser-core ${Boost_LIBRARIES})
Loading