From 69a5cb9e022df602fc115766f9bf5af55ba55c8f Mon Sep 17 00:00:00 2001 From: Sarvothaman Madhavan Date: Fri, 17 Dec 2021 00:38:38 -0500 Subject: [PATCH 1/4] Removed unused self assignments and class variable assignments --- src/python/grinch/agglom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grinch/agglom.py b/src/python/grinch/agglom.py index a9bd154..4446d5d 100644 --- a/src/python/grinch/agglom.py +++ b/src/python/grinch/agglom.py @@ -90,23 +90,23 @@ def build_dendrogram_hac(self): """Run HAC inference.""" st_sims = time.time() sims = self.csim_multi_feature_knn_batched(np.arange(self.num_points), np.arange(self.num_points)) - self.sims = sims en_sims = time.time() logging.info('Time to compute sims: %s', en_sims - st_sims) logging.info('Finished batched similarities!') st_prep = time.time() pos_sim = np.maximum(sims, self.min_allowable_sim) - np.minimum(0.0, self.min_allowable_sim) dists = 1 / (1 + pos_sim) + del pos_sim dists = (dists + dists.T) / 2.0 np.fill_diagonal(dists, 0.0) dists = squareform(dists) - self.dists = dists en_prep = time.time() logging.info('Time to compute sims: %s', en_prep - st_prep) logging.info('Finished preparing distances!') logging.info('Running hac') st_linkage = time.time() Z = linkage(dists, method='average') + del dists self.Z = Z en_linkage = time.time() logging.info('Time to run HAC: %s', en_linkage - st_linkage) From 77579b23c3197fbc6f2269e17b0214fc6fd4b466 Mon Sep 17 00:00:00 2001 From: Sarvothaman Madhavan Date: Fri, 17 Dec 2021 17:23:12 -0500 Subject: [PATCH 2/4] Removed additional variables from memory for GC --- src/python/grinch/agglom.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python/grinch/agglom.py b/src/python/grinch/agglom.py index 4446d5d..99f843b 100644 --- a/src/python/grinch/agglom.py +++ b/src/python/grinch/agglom.py @@ -95,6 +95,7 @@ def build_dendrogram_hac(self): logging.info('Finished batched similarities!') st_prep = time.time() pos_sim = np.maximum(sims, self.min_allowable_sim) - np.minimum(0.0, self.min_allowable_sim) + del sims dists = 1 / (1 + pos_sim) del pos_sim dists = (dists + dists.T) / 2.0 From bd8d899255b2db7cb71b0f95329cf608312d0413 Mon Sep 17 00:00:00 2001 From: Sarvothaman Madhavan Date: Fri, 17 Dec 2021 20:02:14 -0500 Subject: [PATCH 3/4] Reduced Float Size --- src/python/grinch/agglom.py | 52 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/python/grinch/agglom.py b/src/python/grinch/agglom.py index 99f843b..7895620 100644 --- a/src/python/grinch/agglom.py +++ b/src/python/grinch/agglom.py @@ -120,7 +120,7 @@ def csim_multi_feature_knn_batched(self, i, j, batch_size=7000): should_log = len_i > 3 * batch_size if should_log: logging.info('[csim_multi_feature_knn_batched] %s by %s', len_i, len_j) - res = np.zeros((len_i, len_j), dtype=np.float32) + res = np.zeros((len_i, len_j), dtype=np.float16) i_batches = [x for x in range(0, len_i, batch_size)] st = time.time() for idx, ii in enumerate(i_batches): @@ -133,7 +133,7 @@ def csim_multi_feature_knn_batched(self, i, j, batch_size=7000): iend = min(len_i, ii + batch_size) jend = min(len_j, jj + batch_size) res[istart:iend, jstart:jend] = self.csim_multi_feature_knn(i[istart:iend], j[jstart:jend]).astype( - np.float32) + np.float16) logging.info('[csim_multi_feature_knn_batched] DONE! %s by %s - %s of %s in % seconds', len_i, len_j, len(i_batches) - 1, len(i_batches) - 1, time.time() - st) @@ -145,7 +145,7 @@ def csim_multi_feature_knn(self, i, j): def csim_multi_feature_knn_torch(self, i, j, record_dict=None): len_i = len(i) len_j = len(j) - s = torch.zeros((len_i, len_j), dtype=torch.float32) + s = torch.zeros((len_i, len_j), dtype=torch.float16) for idx in range(len(self.dense_features)): w, b = self.model.weight_for(self.dense_features[idx][0]) lhs = self.dense_features[idx][3][i] # Grab the original feature matrix for i @@ -186,7 +186,7 @@ def csim_multi_feature_knn_torch(self, i, j, record_dict=None): def pw_sim_torch(self, i, j, record_dict=None): assert len(i) == len(j) - s = torch.zeros(len(i), dtype=torch.float32) + s = torch.zeros(len(i), dtype=torch.float16) for idx in range(len(self.dense_features)): w, b = self.model.weight_for(self.dense_features[idx][0]) lhs = self.dense_features[idx][3][i] # Grab the original feature matrix for i @@ -227,36 +227,36 @@ def pw_sim_torch(self, i, j, record_dict=None): def p_l2dist_feature_dense(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean') ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_feature_dense(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_feature_dense_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def p_l2dist_gt_one_feature_dense(self, idx, c_i, c_j): res = (paired_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2) > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def p_no_match_feature_dense(self, idx, c_i, c_j): res = np.squeeze(np.logical_and(np.logical_and(c_i != c_j, c_i != -1), c_j != -1), 1) - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_gt_one_feature_dense(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_gt_one_feature_dense_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_no_match_feature_dense_knn(self, idx, c_i, c_j): c_jT = c_j.T res = np.logical_and(np.logical_and(c_i != c_jT, c_i != -1), c_jT != -1) - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l1_dense_knn(self, idx, c_i, c_j): return cdist(c_i, c_j, metric='cityblock') @@ -266,49 +266,49 @@ def c_ratio_dense_knn(self, idx, c_i, c_j): return res def p_dot_feature_dense(self, idx, c_i, c_j): - res = np.sum(c_i * c_j, axis=1).astype(np.float32) - return torch.from_numpy(res.astype(np.float32)) + res = np.sum(c_i * c_j, axis=1).astype(np.float16) + return torch.from_numpy(res.astype(np.float16)) def c_dot_feature_dense(self, idx, c_i, c_j): res = np.matmul(c_i, c_j.T) - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_dot_feature_dense_knn(self, idx, c_i, c_j): res = np.matmul(c_i, c_j.T) - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def p_l2dist_feature_sparse(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean') ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_feature_sparse(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_feature_sparse_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def p_l2dist_gt_one_feature_sparse(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_gt_one_feature_sparse(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_l2dist_gt_one_feature_sparse_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def p_dot_feature_sparse(self, idx, c_i, c_j): - res = c_i.multiply(c_j).sum(axis=1).A.astype(np.float32) - return torch.from_numpy(res.astype(np.float32)) + res = c_i.multiply(c_j).sum(axis=1).A.astype(np.float16) + return torch.from_numpy(res.astype(np.float16)) def c_dot_feature_sparse(self, idx, c_i, c_j): res = (c_i @ c_j.T).todense().A - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) def c_dot_feature_sparse_knn(self, idx, c_i, c_j): res = (c_i @ c_j.T).todense().A - return torch.from_numpy(res.astype(np.float32)) + return torch.from_numpy(res.astype(np.float16)) From 1df124557ad2ad9e248edbc5437f90627e7379c8 Mon Sep 17 00:00:00 2001 From: Beth Anne Card Date: Tue, 2 Aug 2022 13:17:14 -0600 Subject: [PATCH 4/4] fixed clustering issue --- src/python/grinch/agglom.py | 53 +++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/python/grinch/agglom.py b/src/python/grinch/agglom.py index 7895620..4a33e31 100644 --- a/src/python/grinch/agglom.py +++ b/src/python/grinch/agglom.py @@ -120,7 +120,7 @@ def csim_multi_feature_knn_batched(self, i, j, batch_size=7000): should_log = len_i > 3 * batch_size if should_log: logging.info('[csim_multi_feature_knn_batched] %s by %s', len_i, len_j) - res = np.zeros((len_i, len_j), dtype=np.float16) + res = np.zeros((len_i, len_j), dtype=np.float32) i_batches = [x for x in range(0, len_i, batch_size)] st = time.time() for idx, ii in enumerate(i_batches): @@ -133,7 +133,7 @@ def csim_multi_feature_knn_batched(self, i, j, batch_size=7000): iend = min(len_i, ii + batch_size) jend = min(len_j, jj + batch_size) res[istart:iend, jstart:jend] = self.csim_multi_feature_knn(i[istart:iend], j[jstart:jend]).astype( - np.float16) + np.float32) logging.info('[csim_multi_feature_knn_batched] DONE! %s by %s - %s of %s in % seconds', len_i, len_j, len(i_batches) - 1, len(i_batches) - 1, time.time() - st) @@ -145,7 +145,7 @@ def csim_multi_feature_knn(self, i, j): def csim_multi_feature_knn_torch(self, i, j, record_dict=None): len_i = len(i) len_j = len(j) - s = torch.zeros((len_i, len_j), dtype=torch.float16) + s = torch.zeros((len_i, len_j), dtype=torch.float32) for idx in range(len(self.dense_features)): w, b = self.model.weight_for(self.dense_features[idx][0]) lhs = self.dense_features[idx][3][i] # Grab the original feature matrix for i @@ -186,7 +186,7 @@ def csim_multi_feature_knn_torch(self, i, j, record_dict=None): def pw_sim_torch(self, i, j, record_dict=None): assert len(i) == len(j) - s = torch.zeros(len(i), dtype=torch.float16) + s = torch.zeros(len(i), dtype=torch.float32) for idx in range(len(self.dense_features)): w, b = self.model.weight_for(self.dense_features[idx][0]) lhs = self.dense_features[idx][3][i] # Grab the original feature matrix for i @@ -227,36 +227,36 @@ def pw_sim_torch(self, i, j, record_dict=None): def p_l2dist_feature_dense(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean') ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_feature_dense(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_feature_dense_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def p_l2dist_gt_one_feature_dense(self, idx, c_i, c_j): res = (paired_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2) > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def p_no_match_feature_dense(self, idx, c_i, c_j): res = np.squeeze(np.logical_and(np.logical_and(c_i != c_j, c_i != -1), c_j != -1), 1) - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_gt_one_feature_dense(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_gt_one_feature_dense_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_no_match_feature_dense_knn(self, idx, c_i, c_j): c_jT = c_j.T res = np.logical_and(np.logical_and(c_i != c_jT, c_i != -1), c_jT != -1) - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l1_dense_knn(self, idx, c_i, c_j): return cdist(c_i, c_j, metric='cityblock') @@ -266,49 +266,50 @@ def c_ratio_dense_knn(self, idx, c_i, c_j): return res def p_dot_feature_dense(self, idx, c_i, c_j): - res = np.sum(c_i * c_j, axis=1).astype(np.float16) - return torch.from_numpy(res.astype(np.float16)) + res = np.sum(c_i * c_j, axis=1).astype(np.float32) + return torch.from_numpy(res.astype(np.float32)) def c_dot_feature_dense(self, idx, c_i, c_j): res = np.matmul(c_i, c_j.T) - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_dot_feature_dense_knn(self, idx, c_i, c_j): res = np.matmul(c_i, c_j.T) - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def p_l2dist_feature_sparse(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean') ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_feature_sparse(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_feature_sparse_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def p_l2dist_gt_one_feature_sparse(self, idx, c_i, c_j): res = paired_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_gt_one_feature_sparse(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_l2dist_gt_one_feature_sparse_knn(self, idx, c_i, c_j): res = pairwise_distances(c_i, c_j, metric='euclidean', n_jobs=-1) ** 2 > 1 - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def p_dot_feature_sparse(self, idx, c_i, c_j): - res = c_i.multiply(c_j).sum(axis=1).A.astype(np.float16) - return torch.from_numpy(res.astype(np.float16)) + res = c_i.multiply(c_j).sum(axis=1).A.astype(np.float32) + return torch.from_numpy(res.astype(np.float32)) def c_dot_feature_sparse(self, idx, c_i, c_j): res = (c_i @ c_j.T).todense().A - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) def c_dot_feature_sparse_knn(self, idx, c_i, c_j): res = (c_i @ c_j.T).todense().A - return torch.from_numpy(res.astype(np.float16)) + return torch.from_numpy(res.astype(np.float32)) +