Change:
Command to install the latest nightly binary: installs : However, PyTorch itself reports : I guess this version tag might be defined during the build process from e.g. and then forwarded from , but also source builds should use based on the tag. Unsure, if this is just a reporting issue or if we are building the nightly binaries with and executing them with , so creating this issue to dig a bit further into it. CC cc
This is really weird, I've put up measure in place to validate against it... Will investigate today (and moving to pytorch repo)
can you please check that 2.2.0 reports (and is build) against the correct version of nccl library?
Confirmed for nightlies : Same issue for RC:
Looking at the build log Looks like we are compiling with: USESYSTEMNCCL
On Windows I see following exception: We compiling with should we return None rather then exception ?
In this case we are indeed using 2.18.1: Do you know why we are using the system-wide NCCL installation instead of the one? Should we delete the system NCCL and use by default?
Looks like its set here: Looks like it was by: Let me propose the PR to unset this flag : USESYSTEM_NCCL
I guess we are using the system NCCL installation to be able to during the runtime. If we would use the module I assume we would link NCCL into the PyTorch binaries. If so, we should make sure to update the NCCL version whenever is updated. This could break our dependency on the NCCL pip package.
Yes. Also when we update this nccl here:
We used following path  What would be good path for nccl 2.19.3 and cuda 12.1 ? As per this issue: Will be using 12.0 ncck 2.19.3
Installing system NCCL into the nightly build docker container feels great, but we need to figure out, how to keep it in sync with PyTorch. I wonder if one can, for example, just check nccl version from this requirements file and build from source?
yes probably we should build and upload nccl for our supported cuda versions, same way as we build docker containers, by following details here:
Verified with final rc

Discussion:
from torch.autograd import gradcheck from torch.autograd.function import once_differentiable <del> from common import TestCase, run_tests </del> <ins> from common import TestCase, run_tests, skipIfNoLapack </ins> from torch.autograd._functions import * from torch.autograd import Variable, Function

(Trace, (), ((S, S),)), (Cross, (), ((S, 3), (S, 3))), (Cross, (1,), ((S, 3, S), (S, 3, S)), 'dim'), <ins> (Inverse, (), ((S, S),), '', (), [skipIfNoLapack]), </ins> (Clone, (), ((S, M, S),)), (Squeeze, (), ((S, 1, M, 1),)), # TODO: enable neg dim checks

('trace', (M, M), ()), ('cross', (S, 3), ((S, 3),)), ('cross', (S, 3, S), ((S, 3, S), 1), 'dim'), <ins> ('inverse', (S, S), (), '', (), [skipIfNoLapack]), </ins> ('clone', (S, M, S), ()), ('eq', (S, S, S), ((S, S, S),)), ('ne', (S, S, S), ((S, S, S),)),

dim_args_idx = test[4] if len(test) == 5 else [] <ins> skipTestIf = test[5] if len(test) == 6 else [] </ins> for dim_perm in product([-1, 1], repeat=len(dim_args_idx)): test_name = basic_test_name new_constructor_args = [arg * dim_perm[dim_args_idx.index(i)] if i in dim_args_idx else arg

self.assertEqual(inp_i.grad, i.grad) assert not hasattr(TestAutograd, test_name), 'Two tests have the same name: ' + test_name <ins> for skip in skipTestIf: do_test = skip(do_test) </ins> setattr(TestAutograd, test_name, do_test)

dim_args_idx = test[4] if len(test) == 5 else [] <ins> skipTestIf = test[5] if len(test) == 6 else [] </ins> for dim_perm in product([-1, 1], repeat=len(dim_args_idx)): test_name = basic_test_name new_args = [arg * dim_perm[dim_args_idx.index(i)] if i in dim_args_idx else arg for i, arg in enumerate(args)]

raise assert not hasattr(TestAutograd, test_name), 'Two tests have the same name: ' + test_name <ins> for skip in skipTestIf: do_test = skip(do_test) </ins> setattr(TestAutograd, test_name, do_test)

grad_input = torch.cross(other, grad_output, self.dim) grad_other = torch.cross(grad_output, input, self.dim) return grad_input, grad_other <ins> class Inverse(Function): @staticmethod def forward(ctx, input): inverse = torch.inverse(input) ctx.save_for_backward(inverse) return inverse @staticmethod def backward(ctx, grad_output): inverse, = ctx.saved_variables return -torch.mm(inverse.t(), torch.mm(grad_output, inverse.t())) </ins>

def cross(self, other, dim=-1): return Cross(dim)(self, other) <ins> def inverse(self): return Inverse.apply(self) </ins> def multinomial(self, num_samples=1, with_replacement=False): return Multinomial(num_samples, with_replacement)(self)