Probabilistic programming views randomized programs as model specifications. Whereas the standard interpretation of a randomized program is to generate data, we instead focus on probabilistic inference as a nonstandard interpretation. Pyro uses multiple nonstandard interpretations and algebraic effects to create composable inference strategies, thus enabling custom strategies for large complex models where naive inference is prohibitively slow. In this talk I will overview nonstandard interpretation and algebraic effects in probabilistic programming languages, describe how effects are used to compose inference strategies in Pyro, and finally describe an alternative perspective where approximate inference is accomplished via nonstandard interpretation of exact generative model descriptions.